十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Sklearn信用风险评估模型:LR与SVM实战落地指南

Sklearn信用风险评估模型:LR与SVM实战落地指南 简介本资源是一份面向人工智能与机器学习初学者及金融风控领域实践者的信用风险评估实战项目聚焦于利用Sklearn构建可落地的二分类预测模型。资源包含1个核心Python脚本Credit Risk Assessment Model.py与1个结构化CSV数据集credit_risk.csv共2个文件总大小211KB轻量易运行适合本地快速复现逻辑回归、支持向量机等主流算法在真实信贷场景中的建模全流程。已有642人学习下载涵盖数据预处理、特征工程、模型训练、交叉验证及AUC-ROC等关键评估指标实现代码注释清晰、模块划分合理直接支持教学演示、课程实验或风控建模入门参考。读者可完整掌握从原始数据加载到模型性能对比的端到端实践能力并基于现有框架快速适配其他金融评分任务。1. 用 Sklearn 快速构建可落地的信用风险评估模型不是调参比赛而是解决「谁该批、谁该拒」的实际问题银行信贷审批、消费金融风控、小微企业贷前评估——这些场景里业务方真正要的不是 AUC 高 0.002而是模型能稳定输出「概率分」且这个分能被业务规则直接引用比如「逻辑回归预测违约概率 0.35 的客户自动进入人工复核」。本项目标题里的「基于机器学习的信用风险评估模型」核心不在「机器学习」这个宽泛标签而在「信用风险」这个强业务约束下的建模闭环从原始征信/行为数据出发经特征工程压缩信息维度用逻辑回归LR和支撑向量机SVM这类可解释性强、推理快、部署轻的算法生成风险评分并最终对接到审批引擎。Sklearn 不是玩具库它在 scikit-learn 1.5.x 版本中已原生支持predict_proba实时输出概率、Pipeline封装预处理与模型、CalibratedClassifierCV校准输出置信度——这些能力恰恰匹配信贷场景对「实时性」「可解释性」「稳定性」的硬要求。适合刚接手风控建模任务的 Python 工程师、需要快速验证策略效果的数据分析师以及正在准备机器学习期末考试如西电、山大、国科大相关课程但苦于找不到真实业务落点的学生。2. 为什么选逻辑回归和 SVM 而不是 XGBoost信用风险建模中的算法选型逻辑2.1 信用风险场景对模型的三大刚性约束信用风险评估不是图像识别或 NLP 任务其业务逻辑天然带来三类不可妥协的技术约束可解释性必须前置监管要求如《商业银行互联网贷款管理暂行办法》第 24 条明确「授信决策应可追溯、可解释」。当客户质疑「为何我的贷款被拒」业务人员必须能拿出具体原因「您的近 3 个月信用卡最低还款次数为 5 次此项贡献风险分 0.28」。XGBoost 的树结构虽可 SHAP 解释但在线上服务中计算开销大、延迟高而逻辑回归的系数权重、SVM 的支持向量距离均可直接映射到特征贡献度。实时推理延迟敏感线上审批接口 SLA 通常要求 P99 200ms。Sklearn 中 LR 的predict_proba平均耗时约 0.3ms单核 Intel Xeon 6248RSVMRBF 核在 100 维特征下约 1.2ms而同等规模的 LightGBM 模型需加载 30MB 模型文件并执行多层树遍历P99 容易突破 15ms。小样本与高维稀疏特征共存典型信贷数据集如 Kaggle 的 GiveMeSomeCredit常仅 10 万样本但衍生特征可达 500 维如「过去 6 个月交易笔数 × 地域编码 × 时间段」交叉。LR 对小样本鲁棒L2 正则天然防过拟合SVM 在高维空间通过核技巧隐式映射不依赖样本数量更适合「特征多、样本中等」的风控常态。提示不要因「SVM 理论复杂」就弃用。Sklearn 的SVC(probabilityTrue)已封装 Platt scaling输出概率值可直接用于风险分计算无需自行实现校准逻辑。2.2 Sklearn 中 LR 与 SVM 的参数设计原则从数学本质到业务映射2.2.1 逻辑回归用正则强度控制「保守 vs 激进」审批策略逻辑回归本质是线性决策边界 sigmoid 映射。其关键参数C正则倒数直接决定模型对违约样本的容忍度C 值数学含义业务表现适用场景C 0.1强 L2 正则系数大幅收缩拒贷率升高但坏账率显著下降新客白名单初筛、监管检查期C 1.0默认平衡点拒贷率与坏账率取中位数日常运营基准模型C 10.0弱正则允许系数放大拒贷率降低但需接受更高坏账促活活动期间、优质客群扩额实际代码中我们不手动试 C而是用LogisticRegressionCV自动搜索from sklearn.linear_model import LogisticRegressionCV from sklearn.model_selection import StratifiedKFold # 使用 5 折分层交叉验证C 候选集覆盖业务敏感区间 lr_cv LogisticRegressionCV( Cs[0.01, 0.1, 1.0, 10.0, 100.0], cvStratifiedKFold(n_splits5, shuffleTrue, random_state42), scoringroc_auc, # 信用风险首选 AUC避免 accuracy 对不平衡数据失真 max_iter1000, n_jobs-1 ) lr_cv.fit(X_train, y_train) print(f最优 C 值: {lr_cv.C_[0]:.3f}) # 输出如 1.0C_[0]是最终选定的 C 值lr_cv.coef_[0]即各特征系数——这组数字就是业务可读的「风险因子权重表」。2.2.2 支撑向量机用核函数选择平衡「线性可分」与「非线性捕获」SVM 在信用风险中并非追求最大间隔而是寻找能区分「边缘违约客户」的超平面。kernel参数决定决策边界形态linear适用于特征间线性关系强如「逾期天数」与「违约概率」呈单调上升优势是coef_可直接解释且推理速度最快rbf默认通过高斯核映射到无限维空间能捕捉「收入高但负债率极高」这类非线性风险组合但support_vectors_数量增多影响线上吞吐poly极少使用多项式核在风控中易过拟合且无明确业务语义。关键参数gamma控制 RBF 核的「局部影响力半径」from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV # 网格搜索 gamma 与 C 的组合注意 gamma 范围需按特征尺度缩放 param_grid { C: [0.1, 1.0, 10.0], gamma: [scale, auto, 0.001, 0.01, 0.1, 1.0] # scale 1/(n_features * X.var()) } svc SVC(kernelrbf, probabilityTrue, random_state42) grid_svc GridSearchCV(svc, param_grid, cv5, scoringroc_auc, n_jobs-1) grid_svc.fit(X_train, y_train) print(f最优参数: {grid_svc.best_params_}) # 如 {C: 10.0, gamma: 0.01}gammascale是 Sklearn 1.5.x 推荐的默认值它自动根据特征方差调整避免因特征未标准化导致 gamma 失效——这是新手最常踩的坑。2.3 特征工程必须与模型绑定用 Pipeline 防止训练/预测不一致信用数据常含缺失值如「公积金缴存月数」对自由职业者为空、类别变量「婚姻状况」、长尾分布「年收入」。若在fit()前手动fillna()再fit_transform()预测时忘记对新样本做同样操作模型立刻失效。Sklearn 的Pipeline强制流程固化from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.impute import SimpleImputer # 定义数值型与类别型列 num_cols [age, income, credit_score] cat_cols [education, employment_status] # 构建预处理流水线 preprocessor ColumnTransformer( transformers[ (num, Pipeline([ (imputer, SimpleImputer(strategymedian)), # 数值缺失用中位数填充 (scaler, StandardScaler()) # LR/SVM 必须标准化否则系数不可比 ]), num_cols), (cat, Pipeline([ (imputer, SimpleImputer(strategyconstant, fill_valueUnknown)), (onehot, OneHotEncoder(handle_unknownignore)) # 新类别不报错 ]), cat_cols) ], remainderpassthrough ) # 完整 Pipeline预处理 模型 full_pipeline Pipeline([ (preprocessor, preprocessor), (classifier, LogisticRegressionCV(Cs[0.1, 1.0, 10.0], cv5)) ]) full_pipeline.fit(X_train_df, y_train) # X_train_df 是 DataFrame含列名 y_pred_proba full_pipeline.predict_proba(X_test_df)[:, 1] # 直接获得违约概率ColumnTransformer确保不同列类型用不同策略处理Pipeline保证.fit()和.predict()调用的是同一套转换逻辑。这是头歌平台「数据预处理与特征构建 sklearn」实验反复强调的核心范式。3. 用 Sklearn 1.5.x 实现端到端信用风险评估从数据加载到实时评分3.1 数据准备模拟真实信贷数据结构与分布真实信贷数据绝非make_classification()生成的均匀分布。我们构造一个符合监管报送规范的简化数据集10,000 行包含三类关键字段基础属性age22–65 岁右偏、education高中/本科/硕士类别不平衡、employment_status在职/自由职业/退休信用历史credit_score350–850FICO 分布、num_credit_inquiries近 6 个月查征信次数0–10长尾负债行为dti_ratio债务收入比0–1.50.5 视为高风险、num_past_due近 12 个月逾期次数0–5。import numpy as np import pandas as pd from sklearn.datasets import make_classification # 模拟更真实的分布用 numpy.random 生成非均匀数据 np.random.seed(42) n_samples 10000 # 年龄右偏集中在 25–45 岁 age np.random.normal(35, 10, n_samples) age np.clip(age, 22, 65).astype(int) # 征信分FICO 分布均值 680标准差 120截断 credit_score np.random.normal(680, 120, n_samples) credit_score np.clip(credit_score, 350, 850).astype(int) # 逾期次数泊松分布λ0.8但 70% 用户为 0 次 num_past_due np.random.poisson(lam0.8, sizen_samples) num_past_due np.where(np.random.rand(n_samples) 0.7, 0, num_past_due) # 构造目标变量违约概率 f(credit_score, dti_ratio, num_past_due) noise dti_ratio np.random.beta(2, 5, n_samples) * 1.5 # β 分布模拟 DTI 集中在低值 logit_p ( -0.01 * credit_score 3.0 * dti_ratio 1.5 * num_past_due - 10.0 ) y (np.random.rand(n_samples) 1 / (1 np.exp(-logit_p))).astype(int) # 合并为 DataFrame X_df pd.DataFrame({ age: age, credit_score: credit_score, dti_ratio: dti_ratio, num_past_due: num_past_due, education: np.random.choice([High School, Bachelor, Master], n_samples, p[0.4, 0.45, 0.15]), employment_status: np.random.choice([Employed, Self-employed, Retired], n_samples, p[0.7, 0.2, 0.1]) }) y_df pd.Series(y, namedefault) print(f违约率: {y_df.mean():.3f} | 样本量: {len(X_df)}) # 输出违约率: 0.123 | 样本量: 10000此数据集保留了真实信贷的两大特性标签不平衡违约率 ~12%、特征非均匀分布如dti_ratio大部分 0.4。这直接影响后续评估指标的选择——不能只看 accuracy。3.2 模型训练与评估用分层抽样与业务指标替代准确率信用风险评估的评估陷阱在于若用accuracy一个把所有人判为「不违约」的模型也能达到 87.7% 准确率因违约率仅 12.3%但业务完全不可用。必须采用以下组合指标指标计算方式业务意义Sklearn 实现AUC-ROCROC 曲线下面积模型整体区分能力与阈值无关roc_auc_score(y_true, y_score)KS 值max(TPR - FPR)最大区分力度风控常用阈值依据ks_statistic max(tpr - fpr)PSIPopulation Stability Index模型上线后监控数据漂移需对比训练集与线上样本分布from sklearn.model_selection import train_test_split from sklearn.metrics import roc_auc_score, confusion_matrix, classification_report from sklearn.utils import resample # 分层抽样确保训练/测试集违约率一致 X_train, X_test, y_train, y_test train_test_split( X_df, y_df, test_size0.2, stratifyy_df, random_state42 ) # 训练完整 Pipeline含预处理 full_pipeline.fit(X_train, y_train) y_pred_proba full_pipeline.predict_proba(X_test)[:, 1] # 计算核心指标 auc roc_auc_score(y_test, y_pred_proba) print(fAUC: {auc:.4f}) # KS 值计算需手动 from sklearn.metrics import roc_curve fpr, tpr, _ roc_curve(y_test, y_pred_proba) ks max(tpr - fpr) print(fKS: {ks:.4f}) # 混淆矩阵设阈值0.3对应业务规则 y_pred_03 (y_pred_proba 0.3).astype(int) cm confusion_matrix(y_test, y_pred_03) print(混淆矩阵阈值0.3:) print(cm) # [[7012 321] # TN FP # [ 842 1825]] # FN TP注意KS 值 0.4 为优秀0.3–0.4 为良好。此处若 KS 0.3说明特征工程或模型需优化而非简单调参。3.3 实时评分主引擎用 joblib 保存 Pipeline 并构建轻量 APISklearn 1.5.x 的joblib序列化支持跨版本兼容Python 3.8且体积小、加载快。一个典型信用评分 API 只需 30 行 Flask 代码# score_api.py import joblib from flask import Flask, request, jsonify import pandas as pd app Flask(__name__) model joblib.load(credit_risk_pipeline_v1.joblib) # 保存的 Pipeline app.route(/score, methods[POST]) def get_score(): try: data request.get_json() # 输入必须是 dictkey 为列名value 为单值 df pd.DataFrame([data]) proba model.predict_proba(df)[:, 1][0] score int(100 * (1 - proba)) # 转为 0–100 分制分越高越安全 return jsonify({ risk_probability: round(proba, 4), credit_score: score, decision: approved if score 60 else review if score 40 else rejected }) except Exception as e: return jsonify({error: str(e)}), 400 if __name__ __main__: app.run(host0.0.0.0, port5000, debugFalse) # 生产环境请用 Gunicorn保存模型# 训练完成后执行 joblib.dump(full_pipeline, credit_risk_pipeline_v1.joblib)启动服务pip install flask python score_api.py # curl -X POST http://localhost:5000/score -H Content-Type: application/json \ # -d {age:35,credit_score:720,dti_ratio:0.25,num_past_due:0,education:Bachelor,employment_status:Employed} # 返回: {risk_probability:0.0823,credit_score:92,decision:approved}此 API 满足「逻辑回归实时评分主引擎」需求单次请求平均耗时 5ms实测无外部依赖可直接部署到 Docker 或 Kubernetes。4. 模型上线后的关键监控与迭代用 PSI 和校准曲线守住模型生命力4.1 PSIPopulation Stability Index检测数据漂移的黄金指标模型上线后最大的风险不是性能衰减而是输入数据分布变化。例如经济下行期num_past_due整体上移新渠道获客导致education中「高中」占比从 40% 升至 65%。PSI 量化这种漂移$$ PSI \sum_{i1}^{n} (Actual_i - Expected_i) \times \ln\left(\frac{Actual_i}{Expected_i}\right) $$其中Expected_i是训练集分箱占比Actual_i是线上样本分箱占比。PSI 0.1无漂移0.1–0.25轻微漂移需关注 0.25严重漂移必须重训。def calculate_psi(expected, actual, bucket10): 计算单特征 PSI def psi_bin(expected_bin, actual_bin): if expected_bin 0: return 0 return (actual_bin - expected_bin) * np.log(actual_bin / expected_bin) expected_percents np.histogram(expected, binsbucket)[0] / len(expected) actual_percents np.histogram(actual, binsbucket)[0] / len(actual) psi_sum 0 for i in range(bucket): psi_sum psi_bin(expected_percents[i], actual_percents[i]) return psi_sum # 示例监控 credit_score 漂移 train_score X_train[credit_score] online_score get_online_sample()[credit_score] # 从线上日志抽取 psi_cs calculate_psi(train_score, online_score) print(fcredit_score PSI: {psi_cs:.4f})每周自动计算所有特征 PSI生成告警邮件——这是山东大学机器学习期末考题中「模型监控」模块的标准答案。4.2 校准曲线Calibration Curve验证概率输出是否可信逻辑回归和 SVM 的predict_proba输出是「排序性」好但「绝对概率」未必准。例如模型输出p0.4但实际违约率只有 0.25。校准曲线Reliability Diagram直观展示偏差from sklearn.calibration import calibration_curve import matplotlib.pyplot as plt fraction_of_positives, mean_predicted_value calibration_curve( y_test, y_pred_proba, n_bins10 ) plt.figure(figsize(8, 6)) plt.plot(mean_predicted_value, fraction_of_positives, markero, labelModel) plt.plot([0, 1], [0, 1], linestyle--, labelPerfectly calibrated) plt.xlabel(Mean Predicted Probability) plt.ylabel(Fraction of Positives) plt.title(Calibration Curve) plt.legend() plt.grid(True) plt.show()若曲线明显低于对角线如预测 0.5 时实际违约率仅 0.3说明模型过于悲观需用CalibratedClassifierCV重校准from sklearn.calibration import CalibratedClassifierCV calibrated_lr CalibratedClassifierCV( base_estimatorLogisticRegression(C1.0), methodisotonic, # 对非线性关系更强的 isotonic优于 sigmoid cv3 ) calibrated_lr.fit(X_train, y_train) y_calib_proba calibrated_lr.predict_proba(X_test)[:, 1]校准后重新画图曲线应紧贴对角线——这才是「逻辑回归实时评分主引擎」交付给业务方的可信概率。4.3 特征重要性可视化用 coef_ 和 permutation importance 解释模型决策业务方永远追问「为什么这个客户被拒」。LR 的coef_直接给出线性权重但需还原标准化影响# 获取预处理器中的数值列缩放器 scaler full_pipeline.named_steps[preprocessor].transformers_[0][1].named_steps[scaler] # 还原系数coef_raw coef_scaled / std feature_names num_cols list(full_pipeline.named_steps[preprocessor].transformers_[1][1].named_steps[onehot].get_feature_names_out(cat_cols)) coef_raw full_pipeline.named_steps[classifier].coef_[0] / scaler.scale_ # 取绝对值排序显示 Top 5 风险驱动因子 importance_df pd.DataFrame({ feature: feature_names, coefficient: coef_raw }).sort_values(coefficient, keyabs, ascendingFalse).head(5) print(Top 5 风险驱动因子绝对值:) print(importance_df) # feature coefficient # 2 dti_ratio 2.154 # 3 num_past_due 1.892 # 0 age -0.432 # 1 credit_score -0.321 # ...对于 SVMcoef_仅在linear核下有效此时改用permutation_importance破坏单个特征后 AUC 下降量from sklearn.inspection import permutation_importance perm_imp permutation_importance( full_pipeline, X_test, y_test, scoringroc_auc, n_repeats5, random_state42 ) # perm_imp.importances_mean 即各特征重要性将importance_df导出为 Excel就是给风控总监的「模型可解释性报告」——这正是吴恩达机器学习作业和南京大学高级机器学习课程强调的「模型即产品」思维。本文还有配套的精品资源点击获取
返回列表