一、项目背景与目标
在金融信贷领域,准确预测借款人未来两年内是否会发生严重贷款违约(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重要特征:
-
月收入(MonthlyIncome) - 还款能力核心指标
-
循环信贷利用率(RevolvingUtilizationOfUnsecuredLines) - 反映资金紧张程度
-
年龄(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. 改进方向
-
特征工程优化:创建组合特征(如债务收入比)
-
模型集成:探索投票集成或堆叠集成
-
实时监控:建立特征漂移监测机制
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)