2026/5/21 18:17:05
网站建设
项目流程
建设网站应该怎么做,手机网站导航条,用手机做网站的app,城市建设网站调查问卷非均衡分类实战#xff1a;过采样代价敏感学习全攻略
引言
在金融风控等实际场景中#xff0c;我们经常会遇到正负样本比例严重失衡的情况#xff08;比如1:100#xff09;。这种情况下#xff0c;普通分类器往往会直接躺平——把所有样本都预测为多数类过采样代价敏感学习全攻略引言在金融风控等实际场景中我们经常会遇到正负样本比例严重失衡的情况比如1:100。这种情况下普通分类器往往会直接躺平——把所有样本都预测为多数类负例虽然准确率看起来很高但实际上完全失去了识别风险的能力。本文将带你用Python实战解决这个难题重点介绍两种核心方法 -SMOTE过采样通过智能生成少数类样本来平衡数据 -代价敏感学习让模型更在意错判少数类的代价无需复杂理论跟着操作就能获得实际可用的解决方案。学完后你将能够 - 处理1:100甚至更极端的样本不均衡 - 选择最适合业务场景的评估指标 - 调整关键参数避免过拟合1. 环境准备首先确保你的Python环境已安装以下库pip install imbalanced-learn scikit-learn pandas numpy关键工具说明 -imbalanced-learn提供SMOTE等过采样算法 -scikit-learn包含分类器和评估指标 -pandas数据处理必备 提示如果你使用CSDN的GPU环境这些库通常已经预装。可以直接选择机器学习类镜像快速开始。2. 数据加载与探索假设我们有一个信用卡欺诈检测数据集正例欺诈占比仅1%import pandas as pd from sklearn.model_selection import train_test_split # 加载数据 data pd.read_csv(creditcard.csv) X data.drop(Class, axis1) y data[Class] # 查看类别分布 print(y.value_counts()) # 输出示例 # 0 284315 # 1 4923. 基础解决方案对比3.1 普通逻辑回归的问题先看看普通分类器在不处理不均衡时的表现from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3) # 训练普通模型 model LogisticRegression() model.fit(X_train, y_train) # 评估 print(classification_report(y_test, y_pred))典型输出precision recall f1-score support 0 1.00 1.00 1.00 85307 1 0.00 0.00 0.00 148模型把所有样本都预测为0正常交易完全无法识别欺诈3.2 解决方案一SMOTE过采样SMOTE通过生成合成样本来平衡数据集from imblearn.over_sampling import SMOTE # 应用SMOTE smote SMOTE(random_state42) X_res, y_res smote.fit_resample(X_train, y_train) # 查看平衡后的分布 print(pd.Series(y_res).value_counts()) # 输出示例 # 0 199020 # 1 199020现在两类样本完全平衡了。重新训练模型model.fit(X_res, y_res) y_pred model.predict(X_test) print(classification_report(y_test, y_pred))你会看到recall召回率明显提升模型开始能识别部分欺诈交易了。3.3 解决方案二代价敏感学习另一种思路是让模型更在意错判少数类的代价# 设置类别权重 model LogisticRegression(class_weight{0:1, 1:100}) # 把少数类错误代价设为100倍 model.fit(X_train, y_train) y_pred model.predict(X_test) print(classification_report(y_test, y_pred))4. 进阶技巧组合使用4.1 SMOTE 代价敏感学习将两种方法结合往往能获得更好效果smote SMOTE(random_state42) X_res, y_res smote.fit_resample(X_train, y_train) model LogisticRegression(class_weight{0:1, 1:10}) # 适当降低权重 model.fit(X_res, y_res)4.2 使用Focal Loss针对神经网络如果你使用深度学习模型可以尝试Focal Lossimport tensorflow as tf def focal_loss(gamma2.0, alpha0.25): def focal_loss_fn(y_true, y_pred): # 实现细节省略 return loss return focal_loss_fn model.compile(optimizeradam, lossfocal_loss())5. 评估指标选择在不均衡分类中准确率完全不可靠应该关注 -召回率Recall捕获了多少真正的少数类 -精确率Precision预测的少数类中有多少是真的 -F1分数两者的调和平均 -AUC-ROC综合评估模型区分能力from sklearn.metrics import roc_auc_score print(AUC:, roc_auc_score(y_test, y_pred))6. 常见问题与调优6.1 SMOTE过拟合怎么办使用SMOTEENNSMOTE编辑最近邻组合调整k_neighbors参数默认5在交叉验证中应用SMOTE而不是全局应用6.2 如何确定类别权重使用class_weightbalanced自动计算通过网格搜索寻找最优权重根据业务成本确定如欺诈漏判的成本/误判的成本6.3 样本极度不平衡1:1000先降采样多数类到1:100再应用SMOTE平衡到1:1考虑分层抽样保持分布总结核心方法SMOTE过采样和代价敏感学习是处理不均衡分类的两大法宝评估指标放弃准确率关注Recall、Precision、F1和AUC组合使用SMOTE代价敏感通常效果最佳参数调优k_neighbors和class_weight是关键调节点业务适配根据实际成本调整权重没有放之四海皆准的参数现在就去试试这些方法吧在实际风控项目中这些技巧能让你的模型从装死变成火眼金睛。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。