1. 分类模型评估
1.1 混淆矩阵
-
官方文档
By definition a confusion matrix :math:`C` is such that :math:`C_{i, j}` is equal to the number of observations known to be in group :math:`i` and predicted to be in group :math:`j`. Thus in binary classification, the count of true negatives is :math:`C_{0,0}`, false negatives is :math:`C_{1,0}`, true positives is :math:`C_{1,1}` and false positives is :math:`C_{0,1}`.
大致意思是所定义的混淆矩阵是C_(i, j),i代表真实值中的正例(1)与反例(0),j代表预测值中的正例(1)和反例(0),则有以下情况:
- 两者都是正例(1,1),TP
- 两者都是假例(0,0),FN
- 真实为正例,预测为反例(1,0),TN
- 真实是反例,预测为正例(0,1),FP
-
在分类任务下,预测结果与正确标记之间存在四种组合,构成混淆矩阵(适用于多分类)
下面以二分类讲解:
(癌症) 预测结果 (非癌症)
正例 假例
(真实 正例(癌症) 真正例TP 伪反例FN
结果) 假例(非癌症) 伪正例FP 真反例TN
- API: sklearn.metrics.confusion_matrix(y_true, y_pred, labels)
1.2 评估标准
- 精确率:预测结果为正例样本中真实为正例的比例 (查的准) TP/(TP+FP)
- 召回率:真实为正例的样本中预测结果为正例的比例(查的全)TP/(TP+FN)
- 说明
在分类问题中,准确率并不是一个合适的评估模型优劣的指标。就拿癌症预测来说,建模人员的目的是能够尽可能地预测出一个人是不是癌症患者,换句话说就是希望不放过一个癌症患者,就算误将非癌症患者也判为癌症也不是不可以的,因此召回率就是衡量该模型的重要指标。 - API
- sklearn.metrics.classification_report(y_true, y_pred, target_names=None)
- target_names: 目标类别名称
- return: 每个类别精确率、召回率和f1_score
- sklearn.metrics.classification_report(y_true, y_pred, target_names=None)
注:混合矩阵需要结合召回率一起对结果进行评估
例:癌症预测
def logisticRes():
"""
逻辑回归做二分类预测
:return: None
"""
# 读取数据
names = ['ID number', 'radius', 'texture', 'perimeter', 'area', 'smoothness', 'compactness', 'concavity', 'concave points', 'symmetry', 'fractal dimension']
data = pd.read_csv('breast-cancer-wisconsin.data', names=names)
# 缺失值处理
data = data.replace(to_replace='?', value=np.NAN)
data = data.dropna()
# 分割数据
x_train, x_test, y_train, y_test = train_test_split(data.iloc[:, 1:10], data.iloc[:, 10:], test_size=0.2, random_state=1)
# 特征值标准化处理
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# estimator
lg = LogisticRegression(C=0.046, )
# 训练
lg.fit(x_train, y_train)
# 准确率
print('准确率:', lg.score(x_test, y_test))
print('各类别的:', classification_report(y_test, lg.predict(x_test), labels=[2, 4], target_names=['良性', '恶性']))
print('混淆矩阵:\n', confusion_matrix(y_test, lg.predict(x_test), labels=[2, 4], normalize=None))
准确率: 0.9927007299270073
各类别的: precision recall f1-score support
良性 0.99 1.00 0.99 90
恶性 1.00 0.98 0.99 47
accuracy 0.99 137
macro avg 0.99 0.99 0.99 137
weighted avg 0.99 0.99 0.99 137
混淆矩阵:
[[90 0]
[ 1 46]]