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()

在这里插入图片描述

七、结论与风控建议

  1. 核心影响因素:用户债务率、历史逾期次数、收入稳定性是影响违约风险的关键指标,与违约概率呈显著正相关。
  2. 模型表现:随机森林模型AUC优于逻辑回归,更适合处理非线性的信用风险预测问题。
  3. 业务建议:建议在信贷审批中,重点关注高债务率、有逾期记录的用户,同时建立动态风险监控机制,降低违约损失。

标签Python 数据分析 机器学习 金融风控 信贷预测

更多推荐