
1) 【一句话结论】设计用户信用评分模型需通过特征工程提取还款能力、消费习惯等核心特征,采用XGBoost等模型训练,结合SMOTE处理数据不平衡,输出0-100分信用分数,以降低坏账率、提升贷款审批效率为核心目标,并通过SHAP等工具解释分数逻辑。
2) 【原理/概念讲解】信用评分模型的核心是“特征→模型→分数”的转化,需分步骤处理:
3) 【对比与适用场景】:数据不平衡处理方法对比
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| SMOTE | 对少数类生成合成样本(通过k近邻算法) | 增加少数类样本,保持数据分布 | 坏样本数量少(如逾期用户<5%),好样本数量多 | 可能导致过拟合,需结合正则化;k_neighbors参数需调整(如5-10) |
| 欠采样 | 随机删除多数类样本(如随机森林删除80%好样本) | 减少计算量,避免模型过拟合多数类 | 好样本数量极大(如正常用户>95%),计算资源有限 | 可能丢失重要信息,导致模型泛化能力下降 |
| 混合方法(SMOTE+Tomek Links) | 结合过采样和欠采样,去除噪声样本 | 平衡数据分布,减少噪声 | 两者均适用,需调整参数 | 参数复杂,计算成本较高(需先计算Tomek Links对) |
4) 【示例】(Python伪代码,含修正后的缺失值处理与特征缩放说明):
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
from xgboost import XGBClassifier
from sklearn.metrics import gini_score
# 1. 数据预处理(含分类特征缺失值处理,数值特征均值填充)
def preprocess_data(data):
num_cols = data.select_dtypes(include=['float64', 'int64']).columns
data[num_cols] = data[num_cols].fillna(data[num_cols].mean())
cat_cols = data.select_dtypes(include=['object']).columns
for col in cat_cols:
data[col] = data[col].fillna(data[col].mode()[0])
scaler = StandardScaler()
data[num_cols] = scaler.fit_transform(data[num_cols])
return data
# 2. 特征工程(提取关键特征)
def extract_features(data):
features = data.copy()
features['逾期率'] = features['逾期次数'] / features['总记录数']
features['消费活跃度'] = features['月均消费'] / features['用户平均消费']
features['信用历史'] = features['历史交易天数'] / 365
features = features.drop(columns=['用户ID'])
return features
# 3. 数据处理(分训练集、测试集,处理不平衡)
X = extract_features(preprocess_data(df))
y = df['是否逾期']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 4. 数据不平衡处理(SMOTE)
smote = SMOTE(random_state=42, k_neighbors=5)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
# 5. 模型训练(XGBoost,调参)
model = XGBClassifier(
objective='binary:logistic',
eval_metric='auc',
n_estimators=100,
max_depth=5,
learning_rate=0.1,
reg_alpha=0.1
)
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [3, 5, 7],
'learning_rate': [0.05, 0.1, 0.2]
}
grid_search = GridSearchCV(model, param_grid, cv=5, scoring='roc_auc')
grid_search.fit(X_resampled, y_resampled)
best_model = grid_search.best_estimator_
print(f"最佳参数: {grid_search.best_params_}")
# 6. 评估模型
y_pred_proba = best_model.predict_proba(X_test)[:, 1]
gini = gini_score(y_test, y_pred_proba)
print(f"模型Gini系数: {gini}")
# 7. 信用分数转换
def get_credit_score(proba):
return proba * 100
5) 【面试口播版答案】(约90秒):
“面试官您好,设计用户信用评分模型的核心目标是降低坏账率、提升贷款审批效率。首先,特征工程:从历史交易数据中提取关键特征,比如逾期率(逾期次数除以总记录数)、消费活跃度(月均消费除以用户平均消费),这些特征能量化用户的还款能力和消费习惯。通过相关性分析和模型重要性评估(如XGBoost的feature_importances_),筛选出与信用风险强相关的特征(如逾期率、信用历史),剔除冗余特征。然后,选择XGBoost模型,因为它能处理非线性关系,且对特征重要性敏感,适合信用评分场景。接下来处理数据不平衡问题:正常用户远多于逾期用户,模型易忽略坏用户,采用SMOTE过采样(对少数类生成合成样本,保持数据分布),参数k_neighbors设为5,避免过拟合。训练模型时,通过5折交叉验证和网格搜索调整超参数(如n_estimators=100, max_depth=5, learning_rate=0.1),评估指标包括AUC和Gini系数,确保模型区分能力强。模型输出用户为坏用户的概率,经线性变换(概率×100)转化为0-100分的信用分数(分数越低风险越高)。最后,用SHAP值分析解释分数逻辑,比如逾期率每增加1%,分数下降2分,帮助业务方理解模型决策,提升模型可信度。这样构建的模型既考虑了特征相关性,又处理了数据不平衡,能实际应用于贷款审批流程。”
6) 【追问清单】:
7) 【常见坑/雷区】: