# Python金融风控实战|用户信用违约预测(逻辑回归+随机森林)
·
Python金融风控实战|用户信用违约预测(逻辑回归+随机森林)
一、项目背景
随着消费信贷业务的快速发展,用户信用违约风险已成为金融机构风控的核心挑战。本项目基于信贷用户数据集,通过数据清洗、多维度探索性分析(EDA)与机器学习建模,构建用户信用违约预测模型,为信贷风控策略优化提供数据支撑。
二、数据说明
本项目使用公开信贷数据集,包含用户基本信息、历史信贷行为、还款记录等字段,共X条记录,X个特征变量,目标变量为用户是否违约。
三、数据预处理与清洗
3.1 缺失值处理
import pandas as pd
import numpy as np
# 读取数据
df = pd.read_csv("credit_data.csv")
# 查看缺失值
print(df.isnull().sum())
# 数值型特征用中位数填充,类别型特征用众数填充
num_cols = df.select_dtypes(include=[np.number]).columns
cat_cols = df.select_dtypes(exclude=[np.number]).columns
df[num_cols] = df[num_cols].fillna(df[num_cols].median())
df[cat_cols] = df[cat_cols].fillna(df[cat_cols].mode().iloc[0])
3.2 异常值处理
通过箱线图识别并处理收入、债务率等关键指标的异常值,使用3σ原则剔除极端数据,保证模型稳定性。
import matplotlib.pyplot as plt
import seaborn as sns
# 箱线图查看异常值
plt.figure(figsize=(10, 6))
sns.boxplot(data=df, x="income")
plt.title("用户收入分布箱线图")
plt.show()
3.3 特征工程与标准化
对年龄、债务率等特征进行标准化处理,同时对部分类别特征进行编码,为后续建模做准备。
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
preprocessor = ColumnTransformer(
transformers=[
("num", StandardScaler(), num_cols),
("cat", OneHotEncoder(), cat_cols)
])
四、探索性数据分析(EDA)
4.1 单变量分布分析
通过直方图、箱线图分析用户年龄、收入、债务率等特征的分布情况,识别特征与违约行为的初步关联。
4.2 相关性分析
通过热力图分析各特征间的相关性,筛选与违约行为强相关的关键特征,剔除多重共线性较高的变量。
plt.figure(figsize=(12, 8))
sns.heatmap(df.corr(), annot=True, cmap="coolwarm")
plt.title("特征相关性热力图")
plt.show()
4.3 违约用户特征画像
对比违约用户与非违约用户在收入、债务率、历史逾期次数等维度的差异,构建用户信用风险画像。
五、模型构建与训练
本项目采用逻辑回归与随机森林两种模型进行对比,综合评估模型性能。
5.1 数据集划分
from sklearn.model_selection import train_test_split
X = df.drop("default", axis=1)
y = df["default"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
5.2 逻辑回归模型
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, roc_auc_score, roc_curve
lr = LogisticRegression(max_iter=1000)
lr.fit(X_train, y_train)
y_pred_lr = lr.predict(X_test)
y_proba_lr = lr.predict_proba(X_test)[:, 1]
print("逻辑回归分类报告:")
print(classification_report(y_test, y_pred_lr))
print("逻辑回归AUC:", roc_auc_score(y_test, y_proba_lr))
5.3 随机森林模型
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
y_pred_rf = rf.predict(X_test)
y_proba_rf = rf.predict_proba(X_test)[:, 1]
print("随机森林分类报告:")
print(classification_report(y_test, y_pred_rf))
print("随机森林AUC:", roc_auc_score(y_test, y_proba_rf))
六、模型评估与对比
6.1 ROC曲线对比
fpr_lr, tpr_lr, _ = roc_curve(y_test, y_proba_lr)
fpr_rf, tpr_rf, _ = roc_curve(y_test, y_proba_rf)
plt.figure(figsize=(8, 6))
plt.plot(fpr_lr, tpr_lr, label=f"Logistic Regression (AUC={roc_auc_score(y_test, y_proba_lr):.2f})")
plt.plot(fpr_rf, tpr_rf, label=f"Random Forest (AUC={roc_auc_score(y_test, y_proba_rf):.2f})")
plt.plot([0, 1], [0, 1], "k--")
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.title("ROC曲线对比")
plt.legend()
plt.show()
6.2 特征重要性分析
importances = rf.feature_importances_
features = X.columns
indices = np.argsort(importances)[::-1]
plt.figure(figsize=(10, 6))
plt.bar(range(len(features)), importances[indices])
plt.xticks(range(len(features)), features[indices], rotation=45)
plt.title("随机森林特征重要性排序")
plt.tight_layout()
plt.show()

七、结论与风控建议
- 核心影响因素:用户债务率、历史逾期次数、收入稳定性是影响违约风险的关键指标,与违约概率呈显著正相关。
- 模型表现:随机森林模型AUC优于逻辑回归,更适合处理非线性的信用风险预测问题。
- 业务建议:建议在信贷审批中,重点关注高债务率、有逾期记录的用户,同时建立动态风险监控机制,降低违约损失。
标签:Python 数据分析 机器学习 金融风控 信贷预测
更多推荐
所有评论(0)