机器学习分类:从朴素贝叶斯到支持向量机
立即解锁
发布时间: 2025-09-03 01:40:39 阅读量: 14 订阅数: 11 AIGC 


Python机器学习实战精讲
### 机器学习分类:从朴素贝叶斯到支持向量机
在机器学习领域,分类算法是非常重要的一部分。本文将带你了解从朴素贝叶斯分类器到支持向量机(SVM)的相关知识,包括模型评估、参数调优以及不同场景下的应用。
#### 1. 朴素贝叶斯电影推荐引擎
我们首先使用朴素贝叶斯构建了一个电影推荐引擎。通过以下代码可以得到预测类别:
```python
prediction = clf.predict(X_test)
print(prediction[:10])
```
输出结果可能如下:
```
[1. 1. 1. 0. 0. 0. 1. 1. 1. 1.]
```
然后,我们使用分类准确率来评估模型的性能,即正确预测的比例:
```python
accuracy = clf.score(X_test, Y_test)
print(f'The accuracy is: {accuracy*100:.1f}%')
```
结果显示,分类准确率约为72%,这意味着我们开发的朴素贝叶斯分类器能够为大约72%的用户正确推荐电影。不过,我们目前仅从电影评分数据中提取了用户 - 电影关系,而大部分评分是未知的。理想情况下,我们还可以利用`movies.dat`文件中的电影类型信息和`users.dat`文件中的用户人口统计信息(性别、年龄、职业和邮政编码)。
#### 2. 分类性能评估
除了准确率,还有其他几个指标可以帮助我们更深入地了解模型性能,并避免类别不平衡的影响:
- 混淆矩阵(Confusion matrix)
- 精确率(Precision)
- 召回率(Recall)
- F1分数(F1 score)
- 曲线下面积(Area under the curve)
##### 2.1 混淆矩阵
混淆矩阵通过预测值和真实值来总结测试实例,以列联表的形式呈现。我们可以使用`scikit-learn`中的`confusion_matrix`函数来计算朴素贝叶斯分类器的混淆矩阵:
```python
from sklearn.metrics import confusion_matrix
print(confusion_matrix(Y_test, prediction, labels=[0, 1]))
```
输出结果可能如下:
```
[[ 60 47]
[148 431]]
```
从这个混淆矩阵中可以看出,有47个假阳性案例(模型将不喜欢误判为喜欢)和148个假阴性案例(模型未能检测到喜欢)。分类准确率就是所有真实案例的比例:
\[
\frac{TP + TN}{TP + TN + FP + FN}=\frac{60 + 431}{60 + 431 + 47 + 148} = 71.6\%
\]
##### 2.2 精确率、召回率和F1分数
精确率衡量的是正预测中正确的比例,计算公式为:
\[
Precision = \frac{TP}{TP + FP}
\]
在我们的例子中,精确率为:
\[
\frac{431}{431 + 47} = 0.90
\]
召回率衡量的是真正例中被正确识别的比例,计算公式为:
\[
Recall = \frac{TP}{TP + FN}
\]
在我们的例子中,召回率为:
\[
\frac{431}{431 + 148} = 0.74
\]
F1分数综合了精确率和召回率,等于它们的调和平均值:
\[
F1 = 2 \times \frac{Precision \times Recall}{Precision + Recall}
\]
我们可以使用`scikit-learn`中的相应函数来计算这些指标:
```python
from sklearn.metrics import precision_score, recall_score, f1_score
precision_score(Y_test, prediction, pos_label=1)
recall_score(Y_test, prediction, pos_label=1)
f1_score(Y_test, prediction, pos_label=1)
```
此外,我们还可以使用`classification_report`函数来快速获取每个类别的精确率、召回率和F1分数:
```python
from sklearn.metrics import classification_report
report = classification_report(Y_test, prediction)
print(report)
```
输出结果如下:
```
precision recall f1-score support
0.0 0.29 0.56 0.38 107
1.0 0.90 0.74 0.82 579
micro avg 0.72 0.72 0.72 686
macro avg 0.60 0.65 0.60 686
weighted avg 0.81 0.72 0.75 686
```
这里的`weighted avg`是根据类别比例计算的加权平均值。分类报告为我们提供了分类器在每个类别上的综合表现,在不平衡分类中非常有用。
##### 2.3 曲线下面积(AUC)
在调整二元分类器的过程中,有时很难找到一组参数能够同时使平均F1分数和每个类别的F1分数都达到最高。这时,接收者操作特征(ROC)曲线下面积(AUC)是一个常用的综合测量指标。
ROC曲线是在不同概率阈值下,真正例率(即召回率)与假正例率的关系图。我们可以通过以下代码绘制ROC曲线:
```python
pos_prob = prediction_prob[:, 1]
thresholds = np.arange(0.0, 1.1, 0.05)
true_pos, false_pos = [0]*len(thresholds), [0]*len(thresholds)
for pred, y in zip(pos_prob, Y_test):
for i, threshold in enumerate(thresholds):
if pred >= threshold:
if y == 1:
true_pos[i] += 1
else:
false_pos[i] += 1
else:
break
n_pos_test = (Y_test == 1).sum()
n_neg_test = (Y_test == 0).sum()
true_pos_rate = [tp / n_pos_test for tp in true_pos]
false_pos_rate = [fp / n_neg_test for fp in false_pos]
import matplotlib.pyplot as plt
plt.figure()
lw = 2
plt.plot(false_pos_rate, true_pos_rate,
color='darkorange', lw=lw)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.y
```
0
0
复制全文
相关推荐










