尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从Kaggle信用评分数据集到风控模型实战:数据清洗、特征工程与模型评估

从Kaggle信用评分数据集到风控模型实战:数据清洗、特征工程与模型评估 1. 项目缘起从一次失败的贷款申请说起几年前我帮一位朋友处理他的信用卡申请被拒的问题。银行给出的理由很模糊只说“综合评分不足”。朋友收入稳定也没有逾期记录他百思不得其解。为了搞清楚原因我们调取了他的征信报告并尝试用一些公开的数据集和简单的分析工具来模拟银行的信用评估逻辑。正是在这个过程中我接触到了Kaggle上一个非常经典的数据集——《Give Me Some Credit》。这个数据集就像一个微缩的信用世界它不直接告诉你“好”或“坏”而是提供了大量真实、脱敏的客户财务行为数据让你自己去寻找那些决定“信用”的蛛丝马迹。《Give Me Some Credit》数据集的核心价值在于它提供了一个近乎真实的战场让数据从业者、金融风控爱好者甚至是像我当时一样困惑的普通用户能够亲手构建一个信用评分模型。通过分析这些数据你不仅能理解银行是如何通过你的年龄、负债、收入、历史行为来给你“打分”的更能深刻体会到一次不经意的逾期、一个过高的负债比是如何在冰冷的算法面前被放大最终影响你的信贷生命线的。这不仅仅是数据分析更是一次对现代金融信用体系运作原理的深度透视。2. 数据集初探理解每一列数据背后的“潜台词”拿到《Give Me Some Credit》数据集第一步绝不是急着跑模型。理解每一列特征变量的真实业务含义是避免后续分析走入歧途的关键。这个数据集通常包含约15万条样本每条样本代表一个客户以及他在未来两年内是否经历严重财务困境即“违约”的标签。特征虽然不多但每一个都至关重要。2.1 核心特征的业务解读我们逐一拆解几个关键特征看看它们在实际风控中扮演什么角色RevolvingUtilizationOfUnsecuredLines循环信贷利用率这是我认为最重要的特征之一。它计算的是信用卡等无抵押循环信贷的已用额度占总额度的比例。例如你信用卡总额度10万当前账单欠款4万那么利用率就是40%。为什么它如此关键高利用率比如超过80%是一个强烈的危险信号。它直接反映了客户的现金流紧张程度和潜在的“以贷养贷”风险。风控模型会极度关注这个指标一个长期保持高利用率的客户违约概率会指数级上升。age年龄年龄与信用的关系并非线性。通常过于年轻如25岁的客户缺乏足够的信用历史稳定性存疑而年龄较大的客户如65岁则可能面临收入下降、健康支出增加的风险。风控模型往往会将年龄进行分段处理寻找风险最低的“黄金年龄段”。NumberOfTime30-59DaysPastDueNotWorse30-59天逾期次数注意这个名称“Not Worse”指的是这次逾期没有导致更严重的后果如60天以上逾期。即便如此任何逾期记录都是信用记录上的污点。这个次数越多说明客户还款习惯越差或财务规划能力越弱。一个实操心得在数据清洗时要特别注意这个字段的异常值。我见过有些样本这个值高达98次这在实际业务中几乎不可能早就被强制催收或核销了很可能是数据录入错误或特殊编码需要视为缺失值或异常值处理。DebtRatio负债比计算公式是每月总负债还款额除以每月总收入。这是衡量客户偿债能力的核心指标。一般来说负债比超过40%就被认为压力较大。但这里有个坑数据集中的收入MonthlyIncome有大量缺失值。如果直接用原始数据计算负债比对于收入缺失的客户这个值会失真或无法计算。常见的处理方法是先用其他特征如职业、年龄、房产状态来预测缺失的收入或者将收入缺失单独作为一个特征标签因为“不提供收入信息”本身可能就是一种风险信号。NumberOfOpenCreditLinesAndLoans信贷账户数和NumberRealEstateLoansOrLines房产贷款/额度数这两个特征反映了客户的信贷活跃度和资产构成。账户数过多可能意味着客户过度依赖信贷风险分散但管理复杂拥有房产贷款通常被视为稳定和有一定资产的标志但同时也意味着有一笔长期大额负债。2.2 目标变量的定义什么是“严重财务困境”数据集的标签是SeriousDlqin2yrs即客户在未来两年内是否出现90天或以上的严重逾期。这是一个典型的二分类问题0未违约1违约。这里需要理解一个关键概念样本不平衡。在真实的信贷数据中违约客户永远是少数。在这个数据集中违约客户的占比大约在6%-7%。这意味着如果你什么都不做直接预测所有客户都为“0”不违约你的模型准确率也能达到93%以上但这毫无意义。因此后续的建模必须采用针对不平衡数据集的处理技巧如过采样SMOTE、欠采样、或在模型评估时使用精确率Precision、召回率Recall、F1分数以及AUC-ROC曲线而不是单纯的准确率Accuracy。3. 数据清洗与特征工程从脏数据到金特征原始数据往往充满“噪音”直接喂给模型效果会很差。数据清洗和特征工程是提升模型性能最有效的环节通常能带来比换模型算法更大的提升。3.1 数据清洗的实战步骤缺失值处理MonthlyIncome月收入和NumberOfDependents家属数量存在缺失。对于收入我通常采用多重插补法或基于随机森林的预测来填充因为收入与其他特征如职业、年龄、学历相关性较强。对于家属数量缺失比例较小可以用中位数或众数填充甚至将“是否缺失”作为一个新的布尔特征。异常值处理如前所述逾期次数出现98这样的极大值。我会采用分位数封顶法如99%分位数来截断。例如计算NumberOfTime30-59DaysPastDueNotWorse字段的99%分位数假设是10那么所有大于10的值都强制设为10。这样可以减少极端值对模型特别是线性模型的干扰。不一致性检查检查是否存在年龄小于18岁却有大量贷款记录的样本或者收入为0但负债比极高的样本。这类数据需要根据业务逻辑进行修正或剔除。3.2 创造有洞察力的新特征仅仅使用原始特征是不够的。特征工程的核心是结合业务知识创造能更好区分风险的新特征。以下是我在分析这个数据集时常用的几个衍生特征UtilizationToIncomeRatio利用率收入比将循环信贷利用率与月收入结合。公式可以是RevolvingUtilizationOfUnsecuredLines / (MonthlyIncome 1)加1防止除零。这个特征能识别那些“收入不高但信用卡刷爆”的高风险客户。PastDueSeverity逾期严重度指数将不同时间段的逾期次数加权求和。例如1*NumberOfTime30-59DaysPastDueNotWorse 2*NumberOfTime60-89DaysPastDueNotWorse 3*NumberOfTimes90DaysLate。给更严重的逾期赋予更高的权重综合反映客户的逾期历史严重程度。CreditLineUsage信贷额度使用分类将RevolvingUtilizationOfUnsecuredLines离散化。例如0:利用率 0从未使用1:0 利用率 0.3健康使用2:0.3 利用率 0.7中度使用3:利用率 0.7过度使用 这样可以将线性关系转化为更易被树模型捕捉的阶梯关系。HasDependents是否有家属从NumberOfDependents衍生出的布尔特征。有家属可能意味着家庭支出压力大是一个潜在的风险因子。注意创造的新特征一定要在训练集上完成其统计信息如分位数、均值用于填充也必须来自训练集然后再应用到测试集这是为了避免数据泄露Data Leakage确保模型评估的公正性。4. 模型构建与评估不止于AUC清洗和特征工程之后我们进入建模阶段。对于信用评分这种结构化数据树模型如梯度提升树通常表现优异。4.1 模型选型与训练我会优先使用LightGBM或XGBoost。它们能自动处理特征间的非线性关系对缺失值不敏感并且速度很快。以下是一个简化的训练框架import pandas as pd import numpy as np from sklearn.model_selection import train_test_split, StratifiedKFold from sklearn.metrics import roc_auc_score, classification_report import lightgbm as lgb # 假设 df 是已经完成清洗和特征工程的数据框 X df.drop(columns[SeriousDlqin2yrs, id]) # 特征 y df[SeriousDlqin2yrs] # 标签 # 分层分割保持训练集和测试集中违约比例一致 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, stratifyy, random_state42) # 定义LightGBM参数 params { objective: binary, metric: auc, boosting_type: gbdt, num_leaves: 31, learning_rate: 0.05, feature_fraction: 0.8, bagging_fraction: 0.8, bagging_freq: 5, verbose: -1, is_unbalance: True # 处理样本不平衡 } # 创建数据集 lgb_train lgb.Dataset(X_train, y_train) lgb_eval lgb.Dataset(X_test, y_test, referencelgb_train) # 训练 gbm lgb.train(params, lgb_train, num_boost_round1000, valid_sets[lgb_eval], callbacks[lgb.early_stopping(50)]) # 早停防止过拟合 # 预测 y_pred_prob gbm.predict(X_test, num_iterationgbm.best_iteration)4.2 超越AUC的评估维度得到AUC如0.85后工作远未结束。在风控领域我们需要更细致的评估KS曲线与KS值这是风控模型最看重的指标之一。它衡量的是模型区分好坏客户的能力。KS值等于TPR真正率与FPR假正率在所有阈值下的最大差值。KS值大于0.3通常认为模型有较好的区分能力。你可以通过模型预测的概率分数对客户排序观察前10%、20%的客户中到底抓住了多少比例的坏客户捕获率。PSI群体稳定性指数模型上线后客群分布可能会随时间漂移。PSI用于监测训练集和当前预测集的特征分布差异。通常PSI0.1说明分布稳定0.1PSI0.25需要警惕PSI0.25则表明分布发生显著变化模型可能需要迭代。在分析中我们可以用测试集模拟未来数据计算PSI来评估模型的稳定性。特征重要性分析使用LightGBM的feature_importance功能。在《Give Me Some Credit》数据集中RevolvingUtilizationOfUnsecuredLines、age和DebtRatio几乎总是稳居前三。这验证了我们最初的业务直觉。但特征重要性也可能会揭示一些意想不到的发现比如NumberOfDependents的重要性可能比想象中高。评分卡转换可选但重要工业界更常用的是评分卡模型因为它直观、可解释性强。我们可以将LightGBM预测的概率通过逻辑回归或直接分箱映射成一个整数分数如300-850分。通过观察每个特征在不同分箱下的WOE证据权重和IV信息值可以更业务化地理解风险驱动因素。例如“年龄在35-50岁”这个分箱的WOE为正意味着这个年龄段是低风险群体应该给予加分。5. 从模型结果到业务决策制定一条风险阈值线模型输出的是违约概率比如0.05。但银行需要的是一个明确的决策通过还是拒绝这就需要一个阈值。5.1 如何选择阈值这完全取决于业务策略。我们可以通过混淆矩阵来分析阈值设定拒绝的坏客户 (TP)拒绝的好客户 (FP)业务影响高阈值如概率0.5少极少非常保守坏账率低但损失了大量好客户业务量小。低阈值如概率0.1多多非常激进抓住了大部分坏客户但误杀了很多好客户客户投诉多。选择阈值是一个权衡Trade-off。通常我们会根据预设的坏账率容忍度或通过率目标来反推阈值。例如业务部门说“我们希望前端的通过率保持在70%左右。”那么我们就可以将模型预测的概率从高到低排序取前70%的客户作为“通过”后30%作为“拒绝”此时对应的概率值就是我们的决策阈值。5.2 模型监控与迭代模型上线不是终点。必须建立监控体系性能监控定期如每月计算模型在最新样本上的AUC和KS值看是否有显著下降。特征监控计算主要特征如收入、负债比的PSI监控客群变化。策略复盘抽样检查被模型拒绝的客户看其中是否有后来被证实的好客户误拒以及被通过的客户中是否出现了坏账误通过。这些案例是迭代模型和规则的最宝贵材料。通过对《Give Me Some Credit》数据集的完整分析我们实际上走完了一个简化版信贷风控模型从数据理解、清洗、建模到评估决策的全流程。它告诉我们信用评分不是玄学而是建立在大量数据和行为分析基础上的科学。每一个被拒绝的申请背后都可能是一系列风险特征触发了模型的警报。对于个人而言理解这些规则管理好自己的循环负债、避免逾期就是在主动维护自己最重要的数字资产——信用分数。
返回列表