【Python机器学习】4.2. 数据分离与混淆矩阵
喜欢的话别忘了点赞、收藏加关注哦(关注即可查看全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
4.2.1. 数据分离
我们在上一篇文章讲到了过拟合的问题——过拟合能使训练数据的准确率更高,但是却失去了通用性,这也就回归到了机器学习的本质:
机器学习的本质是用训练数据来更好地预测新数据,而不是保证训练数据的准确性尽可能高。
那如果我没有新数据呢?这时候就得从训练数据里剥离出一部分作为训练数据、一部分作为测试数据。这就是数据分离。
具体来说分为以下几步:
- 把数据分为训练集(一般来说70%)和测试集(一般来说30%)
- 使用训练集进行模型训练
- 使用测试集进行预测,评估表现
举个例子,假如我们有以下数据:
特征1 | 特征2 | 结果 |
---|---|---|
1 | 2 | 2 |
3 | 4 | 12 |
5 | 6 | 30 |
7 | 8 | 56 |
9 | 10 | 90 |
大致分成:
数据类型 | 特征1 | 特征2 | 结果 |
---|---|---|---|
训练数据 | 1 | 2 | 2 |
训练数据 | 3 | 4 | 12 |
训练数据 | 7 | 8 | 56 |
测试数据 | 5 | 6 | 30 |
测试数据 | 9 | 10 | 90 |
其实我们在 3.5. 决策树实战 中提到过数据分离的方法:
# 划分测试集和训练集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
train_test_split
函数可以让我们轻易地拆分数据test_size=0.2
告诉程序80%数据用于训练,20%用于测试- 其实
train_test_split
还有一个参数是random_state
,输入不同的数据即可对训练数据进行不同的随机划分
4.2.2. 混淆矩阵(Confusion Matrix)
使用准确率评估模型的缺点
我们先来看看使用准确率来评估模型的例子:
假如说有1000个数据,其中900个是1,100个是0。然后这里有两个模型的预测结果:
- 模型1:850个1,150个0,准确率90%
- 模型2:所有结果都是1(1000个1),准确率90%
模型1和2有相同的准确率,但是明显模型2的预测是无效的,我们把这种称为空准确率。
准确率可以方便的用于衡量模型的整体预测效果,但无法反应细节信息,具体表现在:
- 没有体现数据预测的实际分布情况(0、1本身的分布比例)
- 没有体现模型错误预测的类型
混淆矩阵的定义
混淆矩阵,又称为误差矩阵,用于衡量分类算法的准确程度。
实际\预测 | 0 | 1 |
---|---|---|
0 | True Negative (TN) | False Positive (FP) |
1 | False Negative (FN) | True Positive (TP) |
- True Positives (TP):预测准确、实际为正样本的数量(实际为1,预测为1)
- True Negatives (TN):预测准确、实际为负样本的数量(实际为0,预测为0)
- False Positives (FP):预测错误、实际为负样本的数量(实际为0,预测为1)
- False Negatives (FN):预测错误、实际为正样本的数量(实际为1,预测为0)
通过混淆矩阵,我们可以计算更多的指标来评估模型:
指标 | 公式 | 定义 |
---|---|---|
准确率 (Accuracy) | TP+TNTP+TN+FP+FN\frac{TP + TN}{TP + TN + FP + FN}TP+TN+FP+FNTP+TN | 总样本中,预测正确的比例 |
误差率 (Misclassification Rate) | FP+FNTP+TN+FP+FN\frac{FP + FN}{TP + TN + FP + FN}TP+TN+FP+FNFP+FN | 总样本中,预测错误的比例 |
召回率 (Recall) | TPTP+FN\frac{TP}{TP + FN}TP+FNTP | 正样本中,预测正确的比例 |
特异度 (Specificity) | TNTN+FP\frac{TN}{TN + FP}TN+FPTN | 负样本中,预测正确的比例 |
精确率 (Precision) | TPTP+FP\frac{TP}{TP + FP}TP+FPTP | 预测结果为正的样本中,预测正确的比例 |
F1 分数 (F1 Score) | 2×Precision×RecallPrecision+Recall\frac{2 \times Precision \times Recall}{Precision + Recall}Precision+Recall2×Precision×Recall | 综合 Precision 和 Recall 的指标 |
混淆矩阵的优点
- 分类任务中,相比单一的预测准确率,混淆矩阵提供了更全面的模型评估信息(TP\TN\FP\FN)
- 通过混淆矩阵,我们可以计算出多样的模型表现衡量指标,从而更好地选择模型
哪个指标更关键?
衡量指标的选择取决于应用场景:
- 垃圾邮件检测(正样本为“垃圾邮件“):希望普通邮件(负样本)不要被判断为垃圾邮件(正样本),即:判断为垃圾邮件的样本都是判断正确的,需要关注精确率;还希望所有的垃圾邮件尽可能被判断出来,需要关注召回率。
- 异常交易检测(正样本为“异常交易”):希望判断为正常的交易(负样本)中尽可能不存在异常交易,还需要关注特异度。
混淆矩阵代码
sklearn
中提供了confusion_matrix
来进行混淆矩阵的计算:
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_test_predict)
TP = cm[1,1]
TN = cm[0,0]
FP = cm[0,1]
FN = cm[1,0]
TP
指True Positive:预测准确、实际为正样本的数量(实际为1,预测为1)TN
指True Negative:预测准确、实际为负样本的数量(实际为0,预测为0)FP
指False Positive:预测错误、实际为负样本的数量(实际为0,预测为1)FN
指False Negative:预测错误、实际为正样本的数量(实际为1,预测为0)
除此之外,我们还可以计算基于混淆矩阵的各项指标:
recall = TP / (TP + FN)
specificity = TN / (TN + FP)
precision = TP / (TP + FP)
f1 = 2 * precision * recall / (precision + recall)
recall
是回报率:正样本中,预测正确的比例specificity
是特异度:负样本中,预测正确的比例precision
是精确率:预测结果为正的样本中,预测正确的比例f1
是F1分数:综合 Precision 和 Recall 的指标