混淆矩阵是分类器模型性能评估中常用的一种工具,也可以称为误差矩阵。该矩阵展示了分类器在预测过程中真实类别与预测类别之间的对比情况,包括真实为正/负类而被预测为正/负类的样本数。
预测值:正例 | 预测值:负例 | |
真实值:正例 | TP | FN |
真实值:负例 | FP | TN |
混淆矩阵可以用来评价分类模型的性能,并帮助我们更好地了解模型在不同分类情况下的表现,常用于二分类问题。通过分析混淆矩阵的各个元素,在实际应用中可得到以下信息:
精确度(Precision):精确度是指预测为“正例”(Positive)的样本中实际为“正例”的比例。计算公式为 TP/(TP+FP)。
召回率(Recall):召回率是指实际为“正例”的样本中被预测为“正例”的比例。计算公式为 TP/(TP+FN)。
F1 值:F1 值是精确度和召回率的调和平均数,它是一个综合评价指标,可以综合考虑精确度和召回率的影响。计算公式为 2*precision*recall/(precision+recall)。
准确率(Accuracy):准确率是指预测正确的样本占总样本数的比例。计算公式为 (TP+TN)/(TP+FP+FN+TN)。
通过计算上述指标,我们可以对分类模型在不同方面的性能表现进行评估,从而更好地优化模型。此外,混淆矩阵还可以帮助我们观察模型在不同分类情况下的表现,如是否存在偏差、误判率高的情况等。因此,混淆矩阵是评价分类模型性能的重要工具之一。
ROC曲线(Receiver Operating Characteristic curve)是评估二分类模型性能的重要工具,通常用于检验分类器的准确性。ROC曲线是以假阳性率(False Positive Rate,FPR)为横坐标,真阳性率(True Positive Rate,TPR)为纵坐标,将所有可能的预测阈值下的TPR和FPR进行绘制得到的曲线。
ROC曲线可以展示出分类器在不同阈值下的综合性能,而曲线下面积(AUC)则是ROC曲线评价指标中的常用参数,可以衡量区分正负样本的能力。AUC越大,说明模型的性能越好。
计算公式:TPR = TP / (TP + FN) / FPR = FP / (FP + TN)
KS(Kolmogorov-Smirnov)值是对两个样本分布是否相同的一种检验方法,它的计算方法是将两个样本的累积分布函数(CDF)相减,得到最大差距,即KS值。在分类问题中,我们可以将正例和负例样本的预测概率作为“样本”,计算它们的预测概率分布,然后通过比较它们的CDF曲线来计算KS值。计算公式:KS=max(TPR−FPR)
KS曲线是一种用于评估分类器性能的常用工具,可以直观地展示正负样本之间的分布差异及模型在不同阈值下的分类性能。
说明K-S曲线的做法:
1、将样本按照模型预测概率从高到低排序;
2、从最小到最大的预测概率取一个作为分类器的阈值,将样本分为“正例”和“负例”,统计每个阈值下的正负样本数量及其累积比例;
3、根据样本的累积比例,绘制出正负样本的累积分布函数曲线(CDF曲线),其中蓝色曲线表示“正例”样本的CDF曲线,红色曲线表示“负例”样本的CDF曲线,X轴表示预测概率,Y轴表示样本的累积比例;
4、计算每个阈值下的TPR和FPR值,并计算每个阈值下的KS值;
5、在K-S曲线上绘制每个阈值下的KS值对应的点,得到KS曲线。
通常情况下,KS值的取值范围在0和1之间,KS值越大,代表模型对正负样本的区分能力越强。一般来说,当KS值大于0.6时,认为分类器的性能较好;当KS值大于0.8时,认为分类器的性能非常优秀。
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc
import matplotlib.pyplot as plt
from pylab import mpl
import pandas as pd
def calculate_metrics(df):
"""
基于pandas和scikit-learn库计算分类器的相关指标。
输入:一个包含真实值和预测值的DataFrame。必需包含两列,分别命名为'y_true'和'y_pred'。
输出:一个字典,包含混淆矩阵和Accuracy、Precision、Recall、F1-Score、ROC曲线、KS值等指标。
"""
# 检查输入数据是否包含'y_true'和'y_pred'两列
if 'y_true' not in df.columns or 'y_pred' not in df.columns:
raise ValueError("输入DataFrame必需包含'y_true'和'y_pred'两列。")
# 计算混淆矩阵
tn, fp, fn, tp = confusion_matrix(df['y_true'], df['y_pred']).ravel()
# 计算准确率(Accuracy)
acc = accuracy_score(df['y_true'], df['y_pred'])
# 计算精确率(Precision)
prec = precision_score(df['y_true'], df['y_pred'])
# 计算召回率(Recall)
rec = recall_score(df['y_true'], df['y_pred'])
# 计算F1值(F1-Score)
f1 = f1_score(df['y_true'], df['y_pred'])
# 计算ROC曲线的真正率、假正率和阈值
fpr, tpr, thresholds = roc_curve(df['y_true'], df['y_pred'])
# 计算ROC曲线下面积(AUC)
auc_score = auc(fpr, tpr)
# 计算KS值
ks = max(abs(tpr - fpr))
# 绘制ROC曲线
plt.figure(figsize=(6, 6))
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % auc_score)
plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic')
plt.legend(loc="lower right")
# 将计算结果封装成字典并返回
metrics_dict = {
'tn(两负)': tn,
'fp(负正)': fp,
'fn(正负)': fn,
'tp(正正)': tp,
'accuracy': acc,
'precision': prec,
'recall': rec,
'f1_score': f1,
'fpr(假正率)': fpr,
'tpr(真正率)': tpr,
'thresholds(阈值)': thresholds,
'auc_score(ROC曲线下面积)': auc_score,
'ks_score(ks值)': ks
}
return metrics_dict