
针对不良资产预测,采用LightGBM模型,通过动态时间特征(滚动窗口计算逾期行为)、高维类别特征降维(卡方选择)、调整类权重(scale_pos_weight)及stratified KFold处理数据不平衡,结合5折交叉验证优化超参数,模型部署为API并实时监控AUC及业务指标,动态触发模型更新(如AUC下降超过5%时重新训练)。
不良资产预测属于二分类问题(如“是否违约”),树模型(XGBoost/LightGBM)擅长捕捉资产数据中的非线性关系(类比:医生诊断疾病时,需整合症状、病史、生理指标等复杂信息,模型则根据这些特征判断风险)。
特征工程是核心,需从原始数据中提取三类关键特征:
数据不平衡时,需调整类权重(如LGBM的scale_pos_weight参数)或stratified KFold保持类别比例,避免模型对多数类(正常资产)过度拟合。模型过拟合应对:限制树深度(如max_depth=5)、增加学习率(如0.1)、使用正则化项(如L1正则),结合交叉验证评估。
| 模型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| XGBoost | 基于梯度提升的树模型,通过迭代构建弱分类器 | 计算效率高,支持并行,但可能存在过拟合风险 | 适用于中小规模数据(如10万以内样本),特征维度较低 | 需合理设置树深度(如max_depth)、学习率(如0.1),避免过拟合 |
| LightGBM | XGBoost优化版本,采用直方图算法、叶生长策略 | 计算速度更快(尤其大数据,如百万级样本),内存占用低,支持类别特征自动处理 | 适用于大规模数据(如百万级样本),特征维度高(如上千个特征) | 对类别特征处理更高效,但可能对极端数据敏感,需检查特征分布 |
(注:LightGBM的直方图算法通过将连续特征离散化,大幅提升计算效率,适合不良资产数据中高维特征场景。)
伪代码示例(含动态时间特征、高维降维、类权重调整、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保持类别比例。)
(约90秒)
“面试官您好,针对不良资产预测,我会选择LightGBM模型,因为它在大规模数据下计算效率更高,且能高效处理类别特征。首先,特征工程方面,我会提取动态时间特征,比如计算最近30天内的逾期次数,或者滚动还款及时率,这些能反映客户还款能力的短期变化;行为特征包括历史违约次数、还款及时率;结构特征如抵押物价值、债务收入比。数据预处理中,处理缺失值(数值用中位数,类别用众数)、异常值(IQR截断),数值特征标准化。为解决数据不平衡(违约样本少),采用SMOTE过采样,同时调整类权重(LGBM的scale_pos_weight参数),并使用stratified KFold保持类别比例。训练流程用5折交叉验证,通过网格搜索优化超参数(如学习率、树深度),目标是最大化AUC。模型部署为API接口,实时预测风险;监控方面,每月检查AUC变化,若下降超过5%,触发重新训练,确保模型持续有效。”
问:如何处理高维类别特征(如“抵押物类型”有上百种取值)?
回答要点:对高维类别特征采用卡方检验(SelectKBest)筛选与目标变量相关性高的类别,减少维度并保留关键信息。
问:模型过拟合如何应对?
回答要点:限制树深度(如max_depth=5)、增加学习率(如0.1),或使用L1正则化,结合交叉验证评估过拟合情况。
问:监控指标除了AUC,还有哪些?
回答要点:准确率、精确率、召回率,以及业务指标(如风险预警准确率、预警成本降低比例)。
问:动态时间特征如何计算?
回答要点:用滚动窗口(如pandas的rolling函数),比如最近30天逾期次数,或滚动还款及时率,反映短期风险变化。
问:模型选型与数据规模的权衡?
回答要点:数据量超过百万时选择LightGBM,数据量较小(如10万以内)时考虑XGBoost,结合计算资源限制(如服务器算力)。