机器学习:分类、回归与聚类实战
立即解锁
发布时间: 2025-08-29 10:27:59 阅读量: 10 订阅数: 25 AIGC 

# 机器学习:分类、回归与聚类实战
## 1. 数据分割
在机器学习中,为了评估模型的性能,我们需要将数据集划分为训练集和测试集。可以使用 `train_test_split` 函数来实现这一目的,通过其关键字参数 `test_size` 和 `train_size` 来设置测试集和训练集的大小。可以使用 0.0 到 1.0 之间的浮点值来指定每个集合所占数据的百分比,也可以使用整数值来设置样本的精确数量。如果指定了其中一个关键字参数,另一个将自动推断。例如:
```python
X_train, X_test, y_train, y_test = train_test_split(
digits.data, digits.target, random_state=11, test_size=0.20)
```
上述代码指定了 20% 的数据用于测试,因此训练集的大小将自动推断为 80%。
## 2. 创建 k - 近邻分类模型
### 2.1 创建模型对象
`KNeighborsClassifier` 估计器(位于 `sklearn.neighbors` 模块)实现了 k - 近邻算法。创建一个 `KNeighborsClassifier` 估计器对象的代码如下:
```python
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
```
在 Python 中,创建估计器就是创建一个对象,对象内部实现 k - 近邻算法的细节被隐藏起来,我们只需调用其方法即可,这体现了基于对象编程的本质。
### 2.2 训练模型
接下来,调用 `KNeighborsClassifier` 对象的 `fit` 方法,将样本训练集 `X_train` 和目标训练集 `y_train` 加载到估计器中:
```python
knn.fit(X=X_train, y=y_train)
```
对于大多数 `scikit - learn` 估计器,`fit` 方法将数据加载到估计器中,然后利用这些数据在后台进行复杂的计算,从数据中学习并训练模型。而 `KNeighborsClassifier` 的 `fit` 方法只是将数据加载到估计器中,因为 k - NN 实际上没有初始学习过程,该估计器被称为“懒惰”估计器,因为它的工作只有在用于进行预测时才会执行。
### 2.3 预测数字类别
将数据加载到 `KNeighborsClassifier` 后,就可以使用测试样本进行预测。调用估计器的 `predict` 方法,传入 `X_test` 作为参数,将返回一个包含每个测试图像预测类别的数组:
```python
predicted = knn.predict(X=X_test)
expected = y_test
```
通过比较前 20 个测试样本的预测数字和预期数字,可以发现大部分预测是正确的,但也存在个别错误。使用列表推导式可以找出整个测试集中所有的错误预测:
```python
wrong = [(p, e) for (p, e) in zip(predicted, expected) if p != e]
```
在这个例子中,估计器在 450 个测试样本中仅错误预测了 10 个,预测准确率达到了令人印象深刻的 97.78%,尽管我们只使用了估计器的默认参数。
## 3. 模型准确性评估
### 3.1 估计器的 `score` 方法
每个估计器都有一个 `score` 方法,该方法返回估计器对传入的测试数据的性能指标。对于分类估计器,该方法返回测试数据的预测准确率:
```python
print(f'{knn.score(X_test, y_test):.2%}')
```
`KNeighborsClassifier` 在默认的 k 值(即 `n_neighbors = 5`)下,实现了 97.78% 的预测准确率。后续我们将进行超参数调整,以尝试确定 k 的最优值,期望获得更高的准确率。
### 3.2 混淆矩阵
另一种检查分类估计器准确性的方法是使用混淆矩阵,它显示了给定类别的正确和错误预测值(也称为命中和未命中)。可以调用 `sklearn.metrics` 模块中的 `confusion_matrix` 函数,传入预期类别和预测类别作为参数:
```python
from sklearn.metrics import confusion_matrix
confusion = confusion_matrix(y_true=expected, y_pred=predicted)
```
混淆矩阵中,从左上角到右下角的对角线显示了正确的预测,这被称为主对角线。主对角线上非零的值表示错误的预测。例如,对于数字 0 的类别,有 45 个测试样本被正确分类为 0,没有样本被错误分类为其他数字;而对于数字 8 的类别,算法正确预测了 39 个 8,有一些 8 被错误分类为其他数字,其预测准确率为 88.63%,低于整体预测准确率,表明 8 比其他数字更难识别。
### 3.3 分类报告
`sklearn.metrics` 模块还提供了 `classification_report` 函数,它基于预期值和预测值生成一个分类指标表:
```python
from sklearn.metrics import classification_report
names = [str(digit) for digit in digits.target_names]
print(classification_report(expected, predicted, target_names=names))
```
报告中的指标含义如下:
| 指标 | 含义 |
| ---- | ---- |
| precision | 给定数字的正确预测总数除以该数字的总预测数 |
| recall |
0
0
复制全文
相关推荐










