机器学习分类算法:从逻辑回归到朴素贝叶斯
立即解锁
发布时间: 2025-09-06 01:27:48 阅读量: 10 订阅数: 37 AIGC 


Python机器学习实战指南
# 机器学习中的分类算法:逻辑回归、支持向量机与朴素贝叶斯
## 1. 处理不平衡类别的逻辑回归
在机器学习中,处理不平衡的类别是一个常见的挑战。逻辑回归是一种常用的分类算法,它在处理不平衡类别时具有一定的优势。
### 1.1 代码示例
```python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
# 加载数据
iris = load_iris()
features = iris.data
target = iris.target
# 通过移除前40个观测值使类别高度不平衡
features = features[40:,:]
target = target[40:]
# 创建目标向量,若为类别0则为0,否则为1
target = np.where((target == 0), 0, 1)
# 标准化特征
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)
# 创建逻辑回归对象
logistic_regression = LogisticRegression(random_state=0, class_weight="balanced")
# 训练模型
model = logistic_regression.fit(features_standardized, target)
```
### 1.2 处理不平衡类别的方法
逻辑回归提供了一种内置的方法来处理不平衡类别。通过设置 `class_weight="balanced"`,可以自动对类别进行加权,使得各类别的权重与其频率成反比。具体公式如下:
\[w_j = \frac{n}{k n_j}\]
其中,$w_j$ 是类别 $j$ 的权重,$n$ 是观测值的总数,$n_j$ 是类别 $j$ 的观测值数量,$k$ 是类别的总数。
## 2. 支持向量机(SVM)
支持向量机是一种强大的分类算法,它通过找到一个超平面来最大化类别之间的间隔。
### 2.1 超平面的概念
超平面是一个 $n - 1$ 维的子空间,用于划分 $n$ 维空间。例如,在二维空间中,超平面是一条直线;在三维空间中,超平面是一个平面。支持向量机通过找到一个超平面,使得不同类别的数据点之间的间隔最大。
### 2.2 训练线性分类器
#### 2.2.1 问题与解决方案
当需要训练一个模型来对观测值进行分类时,可以使用支持向量分类器(SVC)来找到最大化类别间隔的超平面。
#### 2.2.2 代码示例
```python
from sklearn.svm import LinearSVC
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np
import matplotlib.pyplot as plt
# 加载只有两个类别和两个特征的数据
iris = datasets.load_iris()
features = iris.data[:100,:2]
target = iris.target[:100]
# 标准化特征
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)
# 创建支持向量分类器
svc = LinearSVC(C=1.0)
# 训练模型
model = svc.fit(features_standardized, target)
# 绘制数据点并根据类别着色
color = ["black" if c == 0 else "lightgrey" for c in target]
plt.scatter(features_standardized[:,0], features_standardized[:,1], c=color)
# 创建超平面
w = svc.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-2.5, 2.5)
yy = a * xx - (svc.intercept_[0]) / w[1]
# 绘制超平面
plt.plot(xx, yy)
plt.axis("off")
plt.show()
# 创建新的观测值
new_observation = [[ -2, 3]]
# 预测新观测值的类别
print(svc.predict(new_observation))
```
#### 2.2.3 超参数 C 的影响
在 SVC 中,超参数 $C$ 控制着最大化超平面间隔和最小化误分类之间的平衡。当 $C$ 较小时,分类器对误分类的数据点比较宽容(高偏差但低方差);当 $C$ 较大时,分类器对误分类的数据点进行重罚,因此会尽力避免任何误分类的数据点(低偏差但高方差)。
### 2.3 使用核函数处理线性不可分的类别
在实际应用中,数据往往是线性不可分的。此时,可以使用核函数来创建非线性的决策边界。
#### 2.3.1 代码示例
```python
import numpy as np
from sklearn.svm import SVC
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
# 设置随机种子
np.random.seed(0)
# 生成两个特征
features = np.random.randn(200, 2)
# 使用异或门生成线性不可分的类别
target_xor = np.logical_xor(features[:, 0] > 0, features[:, 1] > 0)
target = np.where(target_xor, 0, 1)
# 定义绘制决策区域的函数
def plot_decision_regions(X, y, classifier):
cmap = ListedColormap(("red", "blue"))
xx1, xx2 = np.meshgrid(np.arange(-3, 3, 0.02), np.arange(-3, 3, 0.02))
Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.1, cmap=cmap)
for idx, cl in enumerate(np.unique(y)):
plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],
alpha=0.8, c=cmap(idx),
marker="+", label=cl)
# 创建具有线性核的支持向量分类器
svc_linear = SVC(kernel="linear", random_state=0, C=1)
# 训练模型
svc_linear.fit(features, target)
# 绘制观测值和超平面
plot_decision_regions(features, target, classifier=svc_linear)
plt.axis("off")
plt.show()
# 创建具有径向基函数核的支持向量机
svc = SVC(kernel="rbf", random_state=0, gamma=1, C=1)
# 训练分类器
model = svc.fit(features, target)
# 绘制观测值和超平面
plot_decision_regions(features, target, classifier=svc)
plt.axis("off")
plt.show()
```
#### 2.3.2 核函数的类型
- **线性核**:$K(x_i, x_i') = \sum_{j = 1}^{p} x_{ij} x_{i'j}$
- **多项式核**:$K(x_i, x_i') = (r + \gamma \sum_{j = 1}^{p} x_{ij} x_{i'j})^d$
- **径向基函数核**:$K
0
0
复制全文
相关推荐










