1. ROC曲线 (Receiver Operating Characteristic Curve)
定义: ROC曲线用于评估二分类模型的性能,通过不同的阈值绘制真阳性率(TPR)和假阳性率(FPR)的关系。
关键指标:
- 真阳性率 (TPR): TPR=TPTP+FN\text{TPR} = \frac{\text{TP}}{\text{TP} + \text{FN}}TPR=TP+FNTP,即被正确预测为正类的样本占所有真实正类样本的比例。
- 假阳性率 (FPR): FPR=FPFP+TN\text{FPR} = \frac{\text{FP}}{\text{FP} + \text{TN}}FPR=FP+TNFP,即被错误预测为正类的样本占所有真实负类样本的比例。
- AUC (Area Under Curve): 曲线下的面积,表示模型的整体性能。AUC值范围从0到1,值越大表示模型性能越好。
用途:
- 比较不同模型或算法的分类性能。
- 选择最优的模型阈值。
2. DCA曲线 (Decision Curve Analysis Curve)
定义: DCA曲线用于评估模型在不同决策阈值下的临床效益,通过比较模型的净收益(Net Benefit)来衡量其实际应用价值。
关键指标:
-
净收益 (Net Benefit): 预测为正类的样本中真实为正类的比例减去预测为正类的样本中真实为负类的比例乘以阈值的调整因子。
计算公式:
Net Benefit=TPN−FPN×p1−p\text{Net Benefit} = \frac{TP}{N} - \frac{FP}{N} \times \frac{p}{1 - p}Net Benefit=NTP−NFP×1−pp其中 ppp 是阈值,NNN 是样本总数,TP 和 FP 分别是真阳性和假阳性。
用途:
- 评估在实际应用中模型的临床或经济效益。
- 帮助确定在不同阈值下是否值得使用模型。
3. 校准曲线 (Calibration Curve)
定义: 校准曲线用于评估模型预测概率的准确性,显示模型预测的概率与实际发生率之间的关系。
关键指标:
- 校准度 (Calibration): 通过比较预测概率与实际观察到的结果(正类的实际比例)来衡量。
用途:
- 评估预测概率的准确性。
- 确保模型在给定的概率阈值下预测的概率符合实际情况。
总结
- ROC曲线 主要用于评估模型的分类性能和选择最佳阈值。
- DCA曲线 用于衡量模型在不同阈值下的实际效益,特别是在临床或业务决策中的应用。
- 校准曲线 用于检查模型预测概率的准确性,确保模型输出的概率与实际发生率一致。
这三种曲线结合使用,可以全面评估模型的性能,既包括其分类能力,也包括实际应用中的效益和概率准确性。
先看数据:
直接看数据结果:
import pandas as pd
from sklearn.model_selection import train_test_split
# 假设数据已经加载到DataFrame中
data =df = pd.read_csv('冠心病10年数据修改版_1.csv')
# 特征和目标
X = data.drop('OS', axis=1)
y = data['OS']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
import xgboost as xgb
# 创建XGBoost模型
model = xgb.XGBClassifier(use_label_encoder=False, eval_metric='logloss')
# 训练模型
model.fit(X_train, y_train)
from sklearn.metrics import roc_curve, auc, precision_recall_curve, roc_auc_score, brier_score_loss
import matplotlib.pyplot as plt
import numpy as np
from sklearn.calibration import calibration_curve
# 预测概率
y_prob = model.predict_proba(X_test)[:, 1]
# ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)
# DCA曲线 (以0.1的阈值为例)
def dca_curve(y_true, y_prob, thresholds=[0.1, 0.2, 0.3, 0.4, 0.5]):
dca_results = []
for threshold in thresholds:
y_pred = (y_prob >= threshold).astype(int)
tp = np.sum((y_pred == 1) & (y_true == 1))
fp = np.sum((y_pred == 1) & (y_true == 0))
tn = np.sum((y_pred == 0) & (y_true == 0))
fn = np.sum((y_pred == 0) & (y_true == 1))
net_benefit = (tp - fp * (threshold / (1 - threshold))) / len(y_true)
dca_results.append(net_benefit)
return dca_results
thresholds = np.linspace(0, 1, 10)
dca_results = dca_curve(y_test, y_prob, thresholds)
# 校准曲线
prob_true, prob_pred = calibration_curve(y_test, y_prob, n_bins=10, strategy='uniform')
# 绘制曲线
plt.figure(figsize=(15, 5))
# ROC曲线
plt.subplot(1, 3, 1)
plt.plot(fpr, tpr, color='blue', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='grey', 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('ROC Curve')
plt.legend(loc='lower right')
# DCA曲线
plt.subplot(1, 3, 2)
plt.plot(thresholds, dca_results, marker='o')
plt.xlabel('Threshold')
plt.ylabel('Net Benefit')
plt.title('DCA Curve')
# 校准曲线
plt.subplot(1, 3, 3)
plt.plot(prob_pred, prob_true, marker='o', label='Calibration curve')
plt.plot([0, 1], [0, 1], color='grey', linestyle='--')
plt.xlabel('Mean Predicted Probability')
plt.ylabel('Fraction of Positives')
plt.title('Calibration Curve')
plt.tight_layout()
plt.show()