51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个用户信用评分模型,输入用户的历史交易数据(如还款记录、消费行为),输出信用分数,并说明如何处理数据不平衡问题。

招商银行信息技术类岗位难度:中等

答案

1) 【一句话结论】设计用户信用评分模型需通过特征工程提取还款能力、消费习惯等核心特征,采用XGBoost等模型训练,结合SMOTE处理数据不平衡,输出0-100分信用分数,以降低坏账率、提升贷款审批效率为核心目标,并通过SHAP等工具解释分数逻辑。

2) 【原理/概念讲解】信用评分模型的核心是“特征→模型→分数”的转化,需分步骤处理:

  • 特征工程:从历史交易数据中提取量化特征,如逾期率(逾期次数/总记录数)、消费活跃度(月均消费/用户平均消费)、信用历史(历史交易天数/365)。特征选择通过相关性分析(如皮尔逊系数)和模型重要性评估(如XGBoost的feature_importances_),筛选与信用风险强相关的特征(如逾期率、信用历史),剔除冗余特征(如用户ID)。
  • 模型选择:选择XGBoost(非线性高精度,适合复杂数据关系;逻辑回归用于解释性强的场景)。模型输出用户为“坏用户”(逾期)的概率,概率经线性变换(如概率×100)转化为信用分数(0-100分,分数越低风险越高)。
  • 数据不平衡处理:正常用户(好样本)远多于逾期用户(坏样本),模型易偏向多数类。采用SMOTE过采样(对少数类生成合成样本,保持数据分布),参数如k_neighbors=5(控制合成样本的邻近度),避免过拟合(结合模型正则化如XGBoost的reg_alpha)。
  • 模型调参与评估:使用网格搜索(GridSearchCV)或随机搜索(RandomizedSearchCV)调整超参数(如n_estimators=100, max_depth=5, learning_rate=0.1),通过5折交叉验证(5-fold CV)选择最佳参数,评估指标包括AUC(区分能力)、Gini系数(业务相关性)、精确率-召回率曲线(平衡两类错误)。
  • 模型解释性:采用SHAP值分析(SHapley Additive exPlanations),解释每个特征对信用分数的影响(如逾期率每增加1%,分数下降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) 【追问清单】:

  • 问题:如何解释用户信用分数?比如为什么某个用户分数低?
    回答要点:通过SHAP值分析,模型会给出每个特征对分数的影响,比如逾期率、信用历史等,业务方能直观理解分数低的原因(如逾期率高或信用历史短)。
  • 问题:如何处理实时数据更新?比如用户最近有新交易,模型如何动态调整?
    回答要点:采用XGBoost的在线学习功能(如update方法),定期用新数据更新模型,保持模型时效性,避免分数过时。
  • 问题:模型评估指标除了AUC,还有哪些业务指标?比如坏账率?
    回答要点:业务上常用Gini系数(区分能力)、精确率-召回率(平衡两类错误)、坏账率(模型预测的坏用户中实际坏用户的比例),结合业务目标调整模型。
  • 问题:数据隐私如何保障?比如用户交易数据涉及敏感信息?
    回答要点:对敏感特征(如具体消费金额)进行脱敏处理(如k-匿名或差分隐私),遵守数据保护法规(如GDPR),确保用户隐私安全。
  • 问题:特征工程中如何避免过拟合?比如特征太多?
    回答要点:通过特征选择(如相关性分析、模型重要性评估),剔除冗余特征;结合正则化(如XGBoost的reg_alpha),控制模型复杂度。

7) 【常见坑/雷区】:

  • 坑1:忽略特征选择,直接用原始数据训练模型,导致特征无关,模型性能差。
  • 坑2:处理数据不平衡方法不当(如直接欠采样删除大量好样本),导致模型泛化能力下降。
  • 坑3:模型解释性不足,业务方无法理解分数逻辑(如用深度学习模型,特征复杂)。
  • 坑4:未考虑业务指标(如模型高AUC但实际坏账率低),导致模型不实用。
  • 坑5:数据预处理不充分(如分类特征缺失值用均值填充,导致信息丢失)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1