期刊配图:通过ROC与KS曲线优化最优阈值,提升分类模型预测平衡

向量数据库大模型机器学习

picture.image

✨ 欢迎关注Python机器学习AI ✨

本节介绍: 通过ROC与KS曲线优化最优阈值,提升分类模型预测平衡 。数据采用模拟数据,作者根据个人对机器学习的理解进行代码实现与图表输出,细节并不保证与原文一定相同,仅供参考。 详细数据和代码将在稍后上传至交流群,付费成员可在交流群中获取下载。需要的朋友可关注公众文末提供的购买方式。 购买前请咨询,避免不必要的问题。 文末点赞、推荐、转发参与免费包邮赠书~

✨ 实现结果 ✨

picture.image

ROC曲线(左图):ROC曲线通过比较真阳性率(TPR)和假阳性率(FPR)来评估模型的性能,曲线越接近左上角,模型性能越好。AUC(曲线下面积)是该图的关键指标,代表ROC曲线下方的面积,AUC值越接近1,表示模型的预测能力越强。在该图中,AUC为0.92,说明模型的预测能力相对较强。TPR表示真正率,即所有正类中被正确分类为正类的比例;FPR表示假正率,即所有负类中被错误分类为正类的比例。理想的ROC曲线应尽量接近左上角,AUC值越大越好。AUC接近0.5表示模型表现接近随机预测,AUC接近1则表示模型表现优秀

KS曲线(右图):KS曲线展示了TPR、FPR与KS值随不同阈值变化的情况,其中KS值是TPR与FPR差的最大值,用来衡量分类器区分正负样本的能力,KS值越大表示模型的区分能力越强。图中,TPR和FPR的变化曲线分别用红色和橙色表示,随着阈值的增加,TPR通常减少,而FPR会增加。理想的模型应保持较高的TPR和较低的FPR。KS值用蓝色表示,理论上,KS值越大,模型的区分效果越好。在该图中,KS曲线的最大值为0.88,表明模型在特定阈值下能够很好地区分正负样本。阈值的选择对模型性能至关重要,因为不同的阈值会影响TPR和FPR的平衡,因此应根据实际应用需求选择最合适的阈值。

也就是一个好的模型应该具备高AUC值和较大的KS值,同时能够在合理的阈值下实现高TPR和低FPR,从而实现最佳的分类性能。需要注意的是,默认的模型输出阈值通常是0.5,但在实际应用中,可以利用KS根据具体情况调整阈值可能会进一步优化模型表现。

✨ 基础代码实现 ✨

  
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
plt.rcParams['font.family'] = 'Times New Roman'  
plt.rcParams['axes.unicode_minus'] = False  
import warnings  
# 忽略所有警告  
warnings.filterwarnings("ignore")  
  
path = r"2025-4-17公众号Python机器学习AI.xlsx"  
df = pd.read_excel(path)  
from sklearn.model_selection import train_test_split  
  
# 划分特征和目标变量  
X = df.drop(['y'], axis=1)  # 从数据集中去掉目标变量 'y',得到特征变量 X  
y = df['y']  # 提取目标变量 y  
  
# 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(  
    X,  # 特征变量  
    y,  # 目标变量  
    test_size=0.3,  # 测试集所占比例,这里为 30%  
    random_state=42,  # 随机种子,确保结果可重复  
    stratify=df['y']  # 按目标变量 'y' 的分布进行分层采样,确保训练集和测试集中目标变量的分布一致  
)  
from sklearn.model_selection import GridSearchCV  
from sklearn.ensemble import RandomForestClassifier  
# 初始化随机森林分类模型  
model_rf = RandomForestClassifier(random_state=42)  
  
# 定义参数网格  
param_grid_rf = {  
    'n_estimators': [50, 100, 200],       # 树的数量  
    'max_depth': [None, 10, 20, 30],     # 最大深度  
    'min_samples_split': [2, 5, 10],     # 节点最小分裂样本数  
    'min_samples_leaf': [1, 2, 5],       # 叶节点最小样本数  
    'criterion': ['gini', 'entropy']     # 划分标准  
}  
  
# 使用 GridSearchCV 进行网格搜索和 k 折交叉验证  
grid_search_rf = GridSearchCV(  
    estimator=model_rf,  
    param_grid=param_grid_rf,  
    scoring='neg_log_loss',  # 评价指标为负对数损失  
    cv=5,                    # 5 折交叉验证  
    n_jobs=-1,               # 并行计算  
    verbose=1                # 输出详细进度信息  
)  
  
# 训练模型  
grid_search_rf.fit(X_train, y_train)  
  
# 使用最优参数训练模型  
best_model_rf = grid_search_rf.best_estimator_

对一个数据集进行训练和调优,使用随机森林分类器通过网格搜索(GridSearchCV)优化超参数,选择最佳模型并训练它来进行预测

picture.image

对这个二分类模型绘制相应的可视化,通过观察左侧的ROC曲线和右侧的TPR、FPR、KS曲线,我们可以选择阈值为0.40,因为它使得模型在预测类别1时具有最强的区分能力(最大KS值)以及较高的AUC值。这个阈值提供了最佳的分类性能,帮助模型在实际应用中进行更准确的预测

  
from sklearn.metrics import accuracy_score  
  
# 获取模型在测试集上的预测概率  
y_pred_prob = best_model_rf.predict_proba(X_test)[:, 1]  # 获取类别1的预测概率  
  
# 定义不同的阈值  
thresholds = [0.5, 0.4]  
  
# 创建一个空字典来存储结果  
results = {}  
  
# 计算每个阈值下的预测结果、正确数量和准确率  
for threshold in thresholds:  
    # 根据阈值将预测概率转换为类别  
    y_pred = (y_pred_prob >= threshold).astype(int)  
  
    # 计算每个类别的正确预测数量  
    correct_predictions_0 = ((y_pred == 0) & (y_test == 0)).sum()  # 类别0的正确预测  
    correct_predictions_1 = ((y_pred == 1) & (y_test == 1)).sum()  # 类别1的正确预测  
  
    # 计算每个类别的准确率  
    accuracy_0 = correct_predictions_0 / (y_test == 0).sum() if (y_test == 0).sum() > 0 else 0  # 类别0的准确率  
    accuracy_1 = correct_predictions_1 / (y_test == 1).sum() if (y_test == 1).sum() > 0 else 0  # 类别1的准确率  
  
    # 计算总准确率  
    total_correct_predictions = (y_pred == y_test).sum()  # 所有正确预测的数量  
    total_accuracy = total_correct_predictions / len(y_test)  # 总准确率  
  
    # 存储结果  
    results[threshold] = {  
        'Correct Predictions (Class 0)': correct_predictions_0,  
        'Correct Predictions (Class 1)': correct_predictions_1,  
        'Accuracy (Class 0)': accuracy_0,  
        'Accuracy (Class 1)': accuracy_1,  
        'Total Accuracy': total_accuracy  
    }  
  
# 打印结果  
for threshold, result in results.items():  
    print(f"Threshold = {threshold}:")  
    print(f"  Correct Predictions for Class 0: {result['Correct Predictions (Class 0)']}")  
    print(f"  Correct Predictions for Class 1: {result['Correct Predictions (Class 1)']}")  
    print(f"  Accuracy for Class 0: {result['Accuracy (Class 0)']:.4f}")  
    print(f"  Accuracy for Class 1: {result['Accuracy (Class 1)']:.4f}")  
    print(f"  Total Accuracy: {result['Total Accuracy']:.4f}")  
    print("-" * 40)

picture.image

计算在不同阈值(0.5和0.4)下模型的预测结果,输出每个类别(类别0和类别1)的正确预测数量、准确率以及总的预测准确率,从而帮助理解选择最佳的阈值实际用处

在输出结果中,模型在两个不同阈值下的表现相似,总准确率保持不变,都是 0.8444 ,但通过调整阈值,类别1的准确率 有所提升。在阈值为 0.5 时,类别1的准确率为 0.7857 ,而在阈值为 0.4 时,类别1的准确率提高到 0.8571 ,尽管这导致类别0的准确率0.8958 降至 0.8333 。这表明,尽管总准确率保持不变,模型在预测类别1时的精准度得到了提高。该方法在样本不均衡 的情况下尤为有效。虽然这里的模拟数据集是一个小样本且类别平衡的数据集,调整阈值优化模型性能仍然能够显著改善少数类(类别1)的预测表现。即使在样本数量较少且存在样本不均衡 的情况下,调整阈值也能帮助提高对少数类的预测精度,进而提升模型的整体表现。因此,这种方法对于样本不均衡 的数据集尤其适用,能够有效提高模型在少数类样本上的预测能力,特别适用于如欺诈检测癌症检测 等任务。

picture.image

最后还可以通过自定义一个阈值范围,可以更加细致地评估模型的性能。与roc_curve方法中默认的阈值不同,自定义阈值范围(例如通过 np.linspace() 生成一系列均匀分布的阈值)允许我们在更精细的层面上探索模型的表现。我们通过这种方式计算每个阈值下的真阳性率(TPR)、假阳性率(FPR)以及KS值(Kolmogorov-Smirnov),从而能够更精确地选择一个最佳阈值。如图右,相对于第一个阈值确定可视化会发现对应的取值会更多,更多的取值点代表会尽可能模拟每个阈值点下的情况,从而提供更精细的模型评估

✨ 该文章案例 ✨

picture.image

在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。

同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。

✨ 购买介绍 ✨

本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,或添加作者微信deep_ML联系,购买作者的公众号合集。截至目前为止,合集已包含200多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用,包括但不限于ChatGPT、Deepseek、Claude等。

更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 购买前请咨询,避免不必要的问题。

✨ 群友反馈 ✨

picture.image

✨ 淘宝店铺 ✨

picture.image

请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容,或者添加作者微信deep_ML联系 避免淘宝客服漏掉信息 ,希望能为您的学习之路提供帮助!

✨ 免费赠书 ✨

picture.image

picture.image

支持知识分享,畅享学习乐趣!特别感谢清华大学出版社 对本次赠书活动的鼎力支持!即日起,只需点赞、推荐、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《大模型RAG应用开发:构建智能生成系统》这本精彩书籍📚!

💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!

往期推荐

Frontiers in Oncology:利用生存机器学习RSF模型预测患者预后模拟实现

期刊配图:相关系数+统计显著性的饼图可视化 美无需多言

期刊配图:通过SHAP组图解读模型探索不同类型特征和分组对模型的影响

机器学习在临床数据分析中的应用:从数据预处理到Web应用实现的完整流程教学

期刊配图:一区SCI常用数据缺失率展示图可视化

Psychiatry Research基于SHAP可解释性的机器学习模型构建与评估:混淆矩阵、ROC曲线、DCA与校准曲线分析

因果推断:注册行为对后续消费影响的因果推断分析案例

nature communications:基于Light GBM与随机森林结合的多模型特征选择方法

因果推断与机器学习结合:探索酒店预订取消的影响因素

期刊配图:回归模型性能与数据分布(核密度)可视化

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 XR 技术的探索与实践
火山引擎开发者社区技术大讲堂第二期邀请到了火山引擎 XR 技术负责人和火山引擎创作 CV 技术负责人,为大家分享字节跳动积累的前沿视觉技术及内外部的应用实践,揭秘现代炫酷的视觉效果背后的技术实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论