金融风控实战:从数据到模型的信用评分系统构建全解析

一、项目背景与目标

在金融信贷领域,准确预测借款人未来两年内是否会发生严重贷款违约(SeriousDlqin2yrs)至关重要。本研究基于"Give Me Some Credit"数据集,通过完整的机器学习流程构建预测模型。数据集包含150,000条训练样本和101,503条测试样本,涵盖12个关键特征:

python 复制代码
# 核心特征变量
Attributes = ['RevolvingUtilizationOfUnsecuredLines', 'age', 
              'NumberOfTime30-59DaysPastDueNotWorse', 'DebtRatio', 'MonthlyIncome',
              'NumberOfOpenCreditLinesAndLoans', 'NumberOfTimes90DaysLate',
              'NumberRealEstateLoansOrLines', 'NumberOfTime60-89DaysPastDueNotWorse',
              'NumberOfDependents']

二、数据探索与关键发现

1. 数据分布可视化
python 复制代码
# 年龄分布可视化
plt.figure(figsize=(8, 6))
plt.hist(train_data['age'], bins=20)
plt.title('借款人年龄分布')
plt.xlabel('年龄')
plt.ylabel('频数')
plt.show()

图 借款人年龄分布图

年龄分布​​:借款人主要集中在30-70岁区间,符合房贷/车贷主力人群特征

2. 目标变量严重不平衡
python 复制代码
# 目标变量分布(DOC2)
train_data['SeriousDlqin2yrs'].value_counts()
# 输出:0(正常)占比93.5%,1(违约)占比6.5%

解决方案​​:采用分层下采样技术平衡数据集

python 复制代码
# 下采样实现(DOC2)
train0 = train_data[train_data['SeriousDlqin2yrs']==0].sample(frac=0.065)
train1 = train_data[train_data['SeriousDlqin2yrs']==1].copy()
train_df = pd.concat([train0, train1], axis=0)

三、数据预处理关键技术

1. 异常值检测与处理

采用​​三倍标准差法​ ​与​​箱线图法​​双重检测:

python 复制代码
# Create a figure and axes for the subplots
fig, axes = plt.subplots(nrows=4, ncols=3, figsize=(15, 10))

# Iterate over the variables and plot the boxplots
for i, column in enumerate(Attributes):
    sns.boxplot(train_data[column], ax=axes[i//3, i%3])
    axes[i//3, i%3].set_title(f"Boxplot graph - {column}")
    axes[i//3, i%3].grid(False)

# Adjust the layout
plt.tight_layout()
plt.show()

箱线图

  • 处理极端值案例:循环信贷利用率>1000%的异常样本
2. 高级缺失值填补

采用​​KNNImputer​​进行多变量协同填补:

python 复制代码
# KNN缺失值填补(DOC2)
from sklearn.impute import KNNImputer
imputer = KNNImputer().fit(inputs[input_cols])
inputs[input_cols] = imputer.transform(inputs[input_cols])

优势​​:

  • 保留特征间相关性(如月收入与职业类型的关系)

  • 对异常值鲁棒性强

  • 可处理多个特征同时缺失的情况

3. 数据标准化

使用​​MinMaxScaler​​进行归一化:

python 复制代码
# 数据标准化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler().fit(inputs[input_cols])
inputs[input_cols] = scaler.transform(inputs[input_cols])

四、模型构建与评估

1. 模型选择依据
模型 选择理由 适用场景
决策树 直观可解释性强,可处理非线性关系 需要透明决策规则的场景
随机森林 高准确性,抗过拟合能力强 高精度预测需求
SVM 擅长处理高维特征,泛化能力强 小样本复杂分类问题
2. 模型训练与评估
python 复制代码
# 数据集划分
from sklearn.model_selection import train_test_split
X_train, X_val, train_targets, val_targets = train_test_split(
    inputs, targets, test_size=0.3, random_state=0
)

# 决策树模型训练
from sklearn.tree import DecisionTreeClassifier
model_DT = DecisionTreeClassifier(random_state=0)
model_DT.fit(X_train, train_targets)

# 随机森林模型训练
from sklearn.ensemble import RandomForestClassifier
model_RF = RandomForestClassifier(random_state=0)
model_RF.fit(X_train, train_targets)

# SVM模型训练
from sklearn.svm import SVC
model_SVM = SVC(random_state=0)
model_SVM.fit(X_train, train_targets)
3. 模型评估结果
python 复制代码
# 准确率计算(DOC2)
from sklearn.metrics import accuracy_score

val_predictions_DT = model_DT.predict(X_val)
accuracy_DT = accuracy_score(val_targets, val_predictions_DT)

val_predictions_RF = model_RF.predict(X_val)
accuracy_RF = accuracy_score(val_targets, val_predictions_RF)

val_predictions_SVM = model_SVM.predict(X_val)
accuracy_SVM = accuracy_score(val_targets, val_predictions_SVM)

评估结果​​:

  • 决策树准确率:89.4%

  • 随机森林准确率:93.4%

  • SVM准确率:93.2%

五、关键发现与业务洞见

1. 特征重要性分析
python 复制代码
importance_df = pd.DataFrame({
    'feature': X_train.columns,
    'importance': model_RF.feature_importances_
}).sort_values('importance', ascending=False)
importance_df.head(10)
plt.title('Importance')
sns.barplot(data=importance_df.head(10), x='importance', y='feature')
plt.savefig('特征重要性.png', dpi=300, bbox_inches='tight')
plt.show()

TOP3重要特征​​:

  1. 月收入(MonthlyIncome) - 还款能力核心指标

  2. 循环信贷利用率(RevolvingUtilizationOfUnsecuredLines) - 反映资金紧张程度

  3. 年龄(age) - 呈U型风险曲线(30岁以下和70岁以上风险更高)

2. 混淆矩阵分析
python 复制代码
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC

# 随机森林模型
model_RF = RandomForestClassifier(random_state=0)
model_RF.fit(X_train, train_targets)
val_predictions_RF = model_RF.predict(X_val)
accuracy_RF = accuracy_score(val_targets, val_predictions_RF)

# 绘制随机森林模型的混淆矩阵
cm_RF = confusion_matrix(val_targets, val_predictions_RF)
plt.figure(figsize=(8, 6))
sns.heatmap(cm_RF, annot=True, fmt="d", cmap="Blues")
plt.title("随机森林模型混淆矩阵")
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.savefig('混淆矩阵-随机森林.png', dpi=300, bbox_inches='tight')
plt.show()

# SVM模型
model_SVM = SVC(random_state=0)
model_SVM.fit(X_train, train_targets)
val_predictions_SVM = model_SVM.predict(X_val)
accuracy_SVM = accuracy_score(val_targets, val_predictions_SVM)

# 绘制SVM模型的混淆矩阵
cm_SVM = confusion_matrix(val_targets, val_predictions_SVM)
plt.figure(figsize=(8, 6))
sns.heatmap(cm_SVM, annot=True, fmt="d", cmap="Blues")
plt.title("SVM模型混淆矩阵")
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.savefig('混淆矩阵-SVM.png', dpi=300, bbox_inches='tight')
plt.show()

# 绘制准确率对比图并保存
models = ['决策树', '随机森林', 'SVM']
accuracies = [accuracy, accuracy_RF, accuracy_SVM]

plt.figure(figsize=(8, 6))
plt.bar(models, accuracies)
plt.title("模型准确率对比")
plt.xlabel("模型")
plt.ylabel("准确率")
plt.ylim([0, 1])
plt.savefig('准确率对比图.png', dpi=300, bbox_inches='tight')
plt.show()

分析显示随机森林对违约样本的召回率显著高于其他模型,这对风险控制至关重要。

六、实施价值与改进方向

1. 业务应用价值
  • ​风险定价​​:基于预测概率差异化定价

  • ​授信决策​​:高风险客户自动触发人工审核

  • ​贷后管理​​:对高概率违约客户提前干预

2. 改进方向
  1. ​特征工程优化​​:创建组合特征(如债务收入比)

  2. ​模型集成​​:探索投票集成或堆叠集成

  3. ​实时监控​​:建立特征漂移监测机制

python 复制代码
# 简单集成示例
from sklearn.ensemble import VotingClassifier

ensemble = VotingClassifier(estimators=[
    ('dt', model_DT),
    ('rf', model_RF),
    ('svm', model_SVM)
], voting='hard')
ensemble.fit(X_train, train_targets)