sklearn进阶教程:金融数据分类案例精讲,从数据清洗到模型部署全流程

admin 综合编程开发技术 3


做金融数据分类时总卡壳?信贷违约预测模型准确率上不去?数据清洗完还是一堆坑,模型部署更是摸不着头脑?之前有银行的朋友跟我说,他们团队花了三个月做风控模型,结果因为数据清洗没做好,上线后误判率高得离谱。其实啊,金融数据分类不难,难的是把全流程走顺 —— 今天兔子哥就拿信贷违约预测案例,从数据拿到手到模型上线部署,一步一步拆解开,全是实战里攒的经验,新手朋友照着做准没错。

第一步:金融数据长啥样?先把数据摸透


咱们用的是某信贷平台的脱敏数据,里面有用户基本信息(年龄、收入)、信贷记录(逾期次数、借款金额)、还款能力(负债率、月还款额)这些字段,目标是预测用户会不会违约(1 = 违约,0 = 正常)。
拿到数据先别急着建模,得先看看 “家底”:
python
import pandas as pddata = pd.read_csv('credit_data.csv')print(data.shape)  # 看看有多少行多少列print(data.info())  # 检查数据类型和缺失值print(data['default'].value_counts())  # 看看违约和正常用户的比例

这里要注意啊,金融数据跟其他数据不一样 —— 缺失值特别多(比如有些用户没填收入),而且类别不平衡(违约用户可能只占 5%-10%),这俩问题不解决,后面模型白搭。之前有朋友直接跳过这步,结果模型把所有人都预测成正常用户,准确率看着高,实际没法用。

第二步:金融数据清洗,这些坑必须避开


金融数据最脏,清洗得下狠功夫。咱们分三步走:
处理缺失值:别上来就用均值填充!年龄、收入这种用中位数更靠谱(金融数据极端值多,均值会被拉高);像 “逾期次数” 这种离散值,用众数或者 “0” 填充更合理。代码这么写:
python
# 数值型用中位数data['income'] = data['income'].fillna(data['income'].median())# 离散型用众数data['overdue_count'] = data['overdue_count'].fillna(data['overdue_count'].mode()[0])

干掉异常值:收入突然出现 1000 万?年龄写 150 岁?这些肯定是错的。用箱线图或者 3σ 法则找异常值,金融数据里一般把超过 99% 分位的值截断处理:
python
income_upper = data['income'].quantile(0.99)data['income'] = data['income'].apply(lambda x: income_upper if x > income_upper else x)

解决类别不平衡:违约样本少咋办?用 SMOTE 过采样,给少数类造点 “相似样本”:
python
from imblearn.over_sampling import SMOTEX = data.drop('default', axis=1)y = data['default']smote = SMOTE(random_state=42)X_res, y_res = smote.fit_resample(X, y)  # 处理后正负样本比例基本1:1

之前有用户反馈,说过采样后模型波动大,那是因为没做好交叉验证,后面训练时得注意。

第三步:特征工程,金融数据要这么 “加料”


光用原始数据不够,得给模型喂 “好料”。金融数据常用这几个特征:
  • 比率特征:负债率(月还款 / 月收入)、信贷使用率(已用额度 / 总授信)
  • 衍生特征:年龄分段(20-30 岁、30-50 岁)、逾期频率(逾期次数 / 借款次数)
  • 交互特征:高收入且低负债(收入 > 8000 & 负债率 < 30%)

代码实操下:
python
# 算负债率data['debt_ratio'] = data['monthly_payment'] / data['income']# 年龄分段data['age_group'] = pd.cut(data['age'], bins=[0,30,50,100], labels=['青年','中年','老年'])# 把类别特征转成数值(模型不认文字)data = pd.get_dummies(data, columns=['age_group'])  # 独热编码

这里提醒下,金融特征别搞太复杂,像 “年龄 + 收入 + 逾期次数” 这种三层交互,容易过拟合,模型在测试集根本跑不动。

第四步:模型训练 + 调优,风控模型这么选


金融分类常用这几个模型:逻辑回归(解释性强,监管爱用)、随机森林(准确率高)、XGBoost(对不平衡数据友好)。咱们用随机森林先跑 baseline,再用网格搜索调优:
python
from sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_split, GridSearchCVX_train, X_test, y_train, y_test = train_test_split(X_res, y_res, test_size=0.2, random_state=42)# 初始模型model = RandomForestClassifier(random_state=42)model.fit(X_train, y_train)print("初始准确率:", model.score(X_test, y_test))# 调优参数param_grid = {'n_estimators': [100,200], 'max_depth': [10,20]}grid = GridSearchCV(model, param_grid, cv=5)grid.fit(X_train, y_train)print("调优后准确率:", grid.score(X_test, y_test))  # 一般能提5%-10%

金融模型不光看准确率,还得看精确率(别冤枉好人)和召回率(别放过坏人),用混淆矩阵多瞅瞅:
python
from sklearn.metrics import confusion_matrixy_pred = grid.predict(X_test)print(confusion_matrix(y_test, y_pred))  # 看看真阳性、假阳性有多少

第五步:模型部署,金融模型要落地


训练好的模型得能被调用才行。用 joblib 保存模型,再写个简单的预测接口:
python
import joblib# 保存模型joblib.dump(grid.best_estimator_, 'credit_model.pkl')# 加载模型预测新数据def predict_default(new_data):model = joblib.load('credit_model.pkl')return model.predict(new_data)# 测试新用户数据new_user = pd.DataFrame([[35, 15000, 2, 0.2]], columns=['age','income','overdue_count','debt_ratio'])print("是否违约预测:", predict_default(new_user))

金融模型部署后不能不管,得定期监控准确率,数据分布变了(比如突然来一批高收入用户),模型就得重新训练,不然会 “失效”。之前有小贷公司的朋友没做监控,模型用了半年,坏账率飙升才发现问题。
兔子哥说句实在话,金融数据分类核心不在模型多复杂,而在数据质量和流程规范。数据清洗干净了,特征做得合理,哪怕用简单的逻辑回归,效果都不会差。反过来,数据一堆问题,再好的模型也白搭。
还有啊,金融场景对模型解释性要求高,别光顾着堆复杂模型,得让业务方看懂 “为啥这个用户被预测为违约”—— 比如逾期次数多、负债率高,这样模型才能真正落地。动手试试这个案例,你会发现金融数据分类其实没那么神秘,把每个环节做扎实就行!

标签: 摸不着头脑 第一步

发布评论 1条评论)

  • Refresh code

评论列表

2025-10-25 05:50:31

全流程金融分类实战,进阶精炼易学实用。