实用机器学习技巧:使用ROC曲线进行多模型性能比较
2025-01-06
什么是ROC曲线
ROC曲线是用于评估二分类模型性能的重要工具,它通过比较不同阈值下模型的真阳性率(TPR)和假阳性率(FPR)来衡量模型的预测能力
ROC曲线原理
真阳性率(TPR),也称为召回率(Recall),计算公式为:
其中,TP是模型正确预测为正的样本数,FN是模型错误预测为负的样本数
假阳性率(FPR),计算公式为:
其中,FP是模型错误预测为正的样本数,TN是模型正确预测为负的样本数
绘制ROC曲线
- 选择國值:对每个可能的分类阈值计算TPR和FPR
- 计算TPR和FPR:根据不同的阈值计算对应的TPR和FPR
- 绘制曲线:在坐标系中,以FPR为横轴,TPR为纵轴,绘制出不同值下的点,连成ROC曲线
解释ROC曲线
- 理想模型:ROC曲线经过(0,1)点,即FPR=0且TPR=1,表示完美分类
- 随机模型:ROC曲线为对角线y=x,即FPR=TPR,表示随机猜测
- 模型优劣:曲线越接近左上角,模型性能越好也就是曲线下方的面积(AUC)越大,模型效果越好
代码实现
数据处理
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
df = pd.read_excel('模拟数据.xlsx')
X = df.drop(['目标变量'], axis=1)
y = df['目标变量']
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)
这里读取数据,然后把数据分割为训练集和测试集
logistic模型ROC曲线绘制
# 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 预测概率
y_score = model.predict_proba(X_test)[:, 1]
# 计算ROC曲线
fpr_logistic, tpr_logistic, _ = roc_curve(y_test, y_score)
roc_auc_logistic = auc(fpr_logistic, tpr_logistic)
# 绘制ROC曲线
plt.figure()
plt.plot(fpr_logistic, tpr_logistic, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc_logistic)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
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")
plt.show()
代码训练一个逻辑回归模型,计算其ROC曲线及AUC值,并绘制ROC曲线图,以评估模型的分类性能,接下来我们详细解读一下这个ROC曲线图,横轴——假阳性率该值从0到1不等,越接近0表示模型越不容易误报,纵轴——真阳性率该值从0到1不等,越接近1表示模型越能够正确识别正类,曲线下方的面积(AUC)表示模型的整体性能,AUC值越大表示模型性能越好,AUC值在0.9到1之间表示模型非常好;在0.8到0.9之间表示模型良好;在0.7到0.8之间表示模型一般,蓝色虚线表示随机猜测的模型的ROC曲线,AUC为0.5,如果模型的ROC曲线在这条线的上方,说明模型优于随机猜测;如果在下方,说明模型劣于随机猜测,具体的解读如下:
- 图中的橙色曲线表示模型的ROC曲线,可以看出它明显在对角线之上,这表明模型的性能优于随机猜测
- 曲线在接近左上角(FPR接近0,TPR接近1)时,说明模型能够以较低的假阳性率实现较高的真阳性率,这是理想的情况
- 图中标注的AUC值为0.92,这表示模型有92%的概率将正类样本的评分排在负类样本之前,且说明该模型具有较高的辨别能力,能够有效地区分正负类
一个画布下绘制多个机器学习的ROC曲线
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
import xgboost as xgb
import lightgbm as lgb
# 训练XGBoost模型
xgb_model = xgb.XGBClassifier(use_label_encoder=False, eval_metric='logloss')
xgb_model.fit(X_train, y_train)
y_score_xgb = xgb_model.predict_proba(X_test)[:, 1]
fpr_xgb, tpr_xgb, _ = roc_curve(y_test, y_score_xgb)
roc_auc_xgb = auc(fpr_xgb, tpr_xgb)
# 训练SVM模型
svm_model = SVC(probability=True)
svm_model.fit(X_train, y_train)
y_score_svm = svm_model.predict_proba(X_test)[:, 1]
fpr_svm, tpr_svm, _ = roc_curve(y_test, y_score_svm)
roc_auc_svm = auc(fpr_svm, tpr_svm)
# 训练随机森林模型
rf_model = RandomForestClassifier()
rf_model.fit(X_train, y_train)
y_score_rf = rf_model.predict_proba(X_test)[:, 1]
fpr_rf, tpr_rf, _ = roc_curve(y_test, y_score_rf)
roc_auc_rf = auc(fpr_rf, tpr_rf)
# 绘制ROC曲线
plt.figure()
plt.plot(fpr_logistic, tpr_logistic, color='darkorange', lw=2, label='Logistic ROC curve (area = %0.2f)' % roc_auc_logistic)
plt.plot(fpr_xgb, tpr_xgb, color='green', lw=2, label='XGBoost ROC curve (area = %0.2f)' % roc_auc_xgb)
plt.plot(fpr_svm, tpr_svm, color='purple', lw=2, label='SVM ROC curve (area = %0.2f)' % roc_auc_svm)
plt.plot(fpr_rf, tpr_rf, color='red', lw=2, label='Random Forest ROC curve (area = %0.2f)' % roc_auc_rf)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
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")
plt.show()
代码训练了XGBoost、SVM和随机森林模型,计算了各自的ROC曲线及AUC值,并绘制了包含所有模型的ROC曲线图,以比较它们的分类性能
详细评价指标
from sklearn.metrics import classification_report, confusion_matrix
# 计算并输出分类报告的函数
def print_classification_report(model, X_test, y_test, model_name):
y_pred = model.predict(X_test)
print(f"{model_name} Classification Report:")
print(classification_report(y_test, y_pred))
print(f"{model_name} Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))
print("\n")
print_classification_report(model, X_test, y_test, "Logistic Regression")
print_classification_report(xgb_model, X_test, y_test, "XGBoost")
print_classification_report(svm_model, X_test, y_test, "SVM")
print_classification_report(rf_model, X_test, y_test, "Random Forest")
最后输出逻辑回归、XGBoost、SVM和随机森林模型的详细评价指标
本文章转载微信公众号@Python机器学习AI