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

假设你负责构建一个不良资产预测模型,用于提前识别高风险资产,请描述模型选型(如XGBoost、LightGBM)、特征工程(如何从资产数据中提取有效特征)、训练流程(数据预处理、交叉验证)以及模型部署和监控方案。

中国长城资产管理股份有限公司业务岗难度:中等

答案

1) 【一句话结论】

针对不良资产预测,采用LightGBM模型,通过动态时间特征(滚动窗口计算逾期行为)、高维类别特征降维(卡方选择)、调整类权重(scale_pos_weight)及stratified KFold处理数据不平衡,结合5折交叉验证优化超参数,模型部署为API并实时监控AUC及业务指标,动态触发模型更新(如AUC下降超过5%时重新训练)。

2) 【原理/概念讲解】

不良资产预测属于二分类问题(如“是否违约”),树模型(XGBoost/LightGBM)擅长捕捉资产数据中的非线性关系(类比:医生诊断疾病时,需整合症状、病史、生理指标等复杂信息,模型则根据这些特征判断风险)。

特征工程是核心,需从原始数据中提取三类关键特征:

  • 动态时间特征:如最近30天逾期次数、滚动还款及时率(反映短期风险变化,如逾期次数突然增加则违约概率上升);
  • 行为特征:历史违约次数、还款及时率(体现客户还款能力,如多次违约或还款延迟率高则风险高);
  • 结构特征:抵押物价值、债务收入比(评估资产抵押价值和债务压力,如抵押物价值低或债务收入比过高则风险高)。

数据不平衡时,需调整类权重(如LGBM的scale_pos_weight参数)或stratified KFold保持类别比例,避免模型对多数类(正常资产)过度拟合。模型过拟合应对:限制树深度(如max_depth=5)、增加学习率(如0.1)、使用正则化项(如L1正则),结合交叉验证评估。

3) 【对比与适用场景】

模型定义特性使用场景注意点
XGBoost基于梯度提升的树模型,通过迭代构建弱分类器计算效率高,支持并行,但可能存在过拟合风险适用于中小规模数据(如10万以内样本),特征维度较低需合理设置树深度(如max_depth)、学习率(如0.1),避免过拟合
LightGBMXGBoost优化版本,采用直方图算法、叶生长策略计算速度更快(尤其大数据,如百万级样本),内存占用低,支持类别特征自动处理适用于大规模数据(如百万级样本),特征维度高(如上千个特征)对类别特征处理更高效,但可能对极端数据敏感,需检查特征分布

(注:LightGBM的直方图算法通过将连续特征离散化,大幅提升计算效率,适合不良资产数据中高维特征场景。)

4) 【示例】

伪代码示例(含动态时间特征、高维降维、类权重调整、stratified KFold):

# 1. 数据预处理
def preprocess_data(df):
    # 缺失值处理
    num_cols = df.select_dtypes(include=['number']).columns
    cat_cols = df.select_dtypes(include=['object', 'category']).columns
    df[num_cols] = df[num_cols].fillna(df[num_cols].median())
    df[cat_cols] = df[cat_cols].fillna(df[cat_cols].mode()[0])
    
    # 异常值处理(IQR截断)
    for col in num_cols:
        q1, q3 = df[col].quantile([0.25, 0.75])
        iqr = q3 - q1
        df[col] = df[col].clip(q1 - 1.5*iqr, q3 + 1.5*iqr)
    
    # 动态时间特征:滚动窗口计算最近30天逾期次数
    df['rolling_overdue_count'] = df['overdue_days'].rolling(window=30).sum()
    df['rolling_on_time_rate'] = df['on_time_rate'].rolling(window=30).mean()
    
    # 特征缩放(树模型对缩放不敏感,但提升效率)
    from sklearn.preprocessing import RobustScaler
    scaler = RobustScaler()
    df[num_cols] = scaler.fit_transform(df[num_cols])
    
    return df

# 2. 特征工程(高维类别降维:卡方选择)
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.preprocessing import OneHotEncoder
import pandas as pd

def feature_engineering(df):
    # 处理类别特征(频率编码+卡方降维)
    ohe = OneHotEncoder(handle_unknown='ignore', sparse=False)
    cat_encoded = ohe.fit_transform(df['mortgage_type'].values.reshape(-1,1))
    cat_df = pd.DataFrame(cat_encoded, columns=[f'mortgage_type_{i}' for i in range(cat_encoded.shape[1])])
    
    # 卡方选择:筛选与目标变量相关性高的类别特征
    selector = SelectKBest(chi2, k=10)  # 选择10个高相关类别
    X_cat = selector.fit_transform(cat_df, df['target'])
    selected_cat = pd.DataFrame(X_cat, columns=[f'cat_feat_{i}' for i in range(X_cat.shape[1]]))
    
    # 合并特征
    X = pd.concat([df[num_cols], selected_cat], axis=1)
    y = df['target']
    return X, y

# 3. 数据不平衡处理:调整类权重+stratified KFold
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import StratifiedKFold

smote = SMOTE(random_state=42)
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# 4. 训练流程
from lightgbm import LGBMClassifier
from sklearn.metrics import roc_auc_score

model = LGBMClassifier(scale_pos_weight=(1 - sum(y)/len(y)), # 调整类权重
                       n_estimators=200,
                       learning_rate=0.05,
                       max_depth=-1,
                       num_leaves=31)

for train_idx, val_idx in skf.split(X, y):
    X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
    y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
    
    X_train_res, y_train_res = smote.fit_resample(X_train, y_train)
    model.fit(X_train_res, y_train_res)
    
    pred = model.predict_proba(X_val)[:,1]
    auc = roc_auc_score(y_val, pred)
    print(f"验证集AUC: {auc:.4f}")

# 5. 部署与监控(假设更新触发条件)
import joblib
from datetime import datetime

# 模型保存
joblib.dump(model, 'bad_debt_model.pkl')

# 监控逻辑(假设每月检查)
def monitor_model():
    current_auc = evaluate_model()  # 自定义函数计算当前AUC
    if current_auc < last_auc - 0.05:  # AUC下降超过5%
        retrain_model()  # 触发重新训练
last_auc = evaluate_model()  # 初始AUC

(注:代码中rolling函数实现动态时间特征,SelectKBest实现高维类别降维,scale_pos_weight调整类权重,StratifiedKFold保持类别比例。)

5) 【面试口播版答案】

(约90秒)
“面试官您好,针对不良资产预测,我会选择LightGBM模型,因为它在大规模数据下计算效率更高,且能高效处理类别特征。首先,特征工程方面,我会提取动态时间特征,比如计算最近30天内的逾期次数,或者滚动还款及时率,这些能反映客户还款能力的短期变化;行为特征包括历史违约次数、还款及时率;结构特征如抵押物价值、债务收入比。数据预处理中,处理缺失值(数值用中位数,类别用众数)、异常值(IQR截断),数值特征标准化。为解决数据不平衡(违约样本少),采用SMOTE过采样,同时调整类权重(LGBM的scale_pos_weight参数),并使用stratified KFold保持类别比例。训练流程用5折交叉验证,通过网格搜索优化超参数(如学习率、树深度),目标是最大化AUC。模型部署为API接口,实时预测风险;监控方面,每月检查AUC变化,若下降超过5%,触发重新训练,确保模型持续有效。”

6) 【追问清单】

  1. 问:如何处理高维类别特征(如“抵押物类型”有上百种取值)?
    回答要点:对高维类别特征采用卡方检验(SelectKBest)筛选与目标变量相关性高的类别,减少维度并保留关键信息。

  2. 问:模型过拟合如何应对?
    回答要点:限制树深度(如max_depth=5)、增加学习率(如0.1),或使用L1正则化,结合交叉验证评估过拟合情况。

  3. 问:监控指标除了AUC,还有哪些?
    回答要点:准确率、精确率、召回率,以及业务指标(如风险预警准确率、预警成本降低比例)。

  4. 问:动态时间特征如何计算?
    回答要点:用滚动窗口(如pandas的rolling函数),比如最近30天逾期次数,或滚动还款及时率,反映短期风险变化。

  5. 问:模型选型与数据规模的权衡?
    回答要点:数据量超过百万时选择LightGBM,数据量较小(如10万以内)时考虑XGBoost,结合计算资源限制(如服务器算力)。

7) 【常见坑/雷区】

  1. 忽略动态时间特征导致模型无法捕捉短期风险变化(如客户近期还款行为突变)。
  2. 高维类别特征直接独热编码,导致维度爆炸,计算效率低,应采用卡方选择降维。
  3. 数据不平衡仅用SMOTE,未调整类权重或stratified KFold,影响模型泛化能力。
  4. 模型部署后无监控机制,性能下降后未及时更新,导致业务决策错误。
  5. 模型选型未结合数据规模,比如用LightGBM处理小数据,计算效率反而低。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1