
1) 【一句话结论】:在处理用户历史交易记录的时序特征时,采用LSTM捕捉消费、还款等动态趋势(通过固定时间窗口和序列填充统一长度),结合XGBoost处理静态特征,通过SMOTE(调整k值保留序列连续性)解决数据不平衡,最终以AUC(结合ROC曲线)评估模型效果,确保模型既捕捉时序动态又能处理静态特征,且在数据不平衡场景下有效区分违约用户。
2) 【原理/概念讲解】:用户历史交易记录(月均消费、还款记录)是时间序列数据,每个时间点有特征值,反映消费习惯与还款能力的变化。
3) 【对比与适用场景】:
| 方面/方法 | 定义/内容 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 时序特征工程 | 处理月均消费、还款记录等时间序列数据,包括特征编码、时间窗口选择、序列长度统一 | 需保留时间顺序,处理序列长度不一致 | 信用评分中的时序特征(如消费、还款历史) | 时间窗口选择需结合业务周期(如12个月),序列填充需合理(前向填充避免信息丢失) |
| 模型融合 | 将LSTM输出特征与XGBoost特征拼接(特征级融合),或用堆叠集成(决策级融合) | 结合时序与非时序特征,提升模型性能 | 处理混合特征(时序+静态)的信用评分模型 | 特征级融合需确保特征维度一致,决策级融合需训练元模型(如逻辑回归) |
| SMOTE调整 | 在时序数据中应用SMOTE,调整k值(如k=5)或用Borderline-SMOTE | 保留序列连续性,平衡数据分布 | 解决少数类(违约用户)过少的问题 | k值过小可能导致过拟合,过大可能生成不合理样本 |
| 模型评估指标 | AUC(ROC曲线)、精确率、召回率 | AUC全面反映区分能力,召回率关注少数类 | 评估模型在信用评分中的性能 | 在数据不平衡时,优先关注AUC和召回率 |
4) 【示例】(伪代码展示处理流程):
# 1. 数据预处理:特征编码与序列长度统一
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
# 假设数据集包含:用户ID、月均消费、还款记录(0=正常,1=逾期)、用户年龄、收入等
data = pd.read_csv('user_transactions.csv')
# 分离时序特征(月均消费、还款记录)和非时序特征(年龄、收入)
seq_features = ['monthly_spending', 'payment_status'] # 支付状态0/1
static_features = ['age', 'income']
# 特征编码
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), seq_features),
('cat', OneHotEncoder(), static_features)
])
# 时间窗口选择:最近12个月
seq_len = 12
def preprocess_seq(df, seq_len):
X_seq = []
for i in range(len(df)):
seq = df.iloc[i, :2].values # 月均消费、还款记录
if len(seq) < seq_len:
# 前向填充:用最近有效数据填充缺失部分
seq = np.pad(seq, (0, seq_len - len(seq)), 'constant', constant_values=seq[-1])
else:
seq = seq[-seq_len:]
X_seq.append(seq)
return np.array(X_seq)
X_seq = preprocess_seq(data[seq_features], seq_len=12)
# 2. 数据不平衡处理(SMOTE调整k值)
from imblearn.over_sampling import SMOTE
smote = SMOTE(k_neighbors=5) # 调整k值保留序列连续性
X_res, y_res = smote.fit_resample(X_seq, data['payment_status'])
# 3. 模型训练:LSTM与XGBoost融合(特征级融合)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from xgboost import XGBClassifier
# LSTM模型
model_lstm = Sequential()
model_lstm.add(LSTM(64, input_shape=(seq_len, 2), return_sequences=False))
model_lstm.add(Dense(1, activation='sigmoid'))
model_lstm.compile(optimizer='adam', loss='binary_crossentropy')
model_lstm.fit(X_res, y_res, epochs=10, batch_size=32)
# XGBoost模型(处理静态特征)
xgb_model = XGBClassifier(n_estimators=100, max_depth=5, learning_rate=0.1)
# 将静态特征转换为数值(独热编码后合并)
X_static = preprocessor.fit_transform(data[static_features])
xgb_model.fit(X_static, data['payment_status'])
# 特征级融合:将LSTM输出特征与XGBoost特征拼接
# 假设LSTM输出为序列长度为1的向量(即最后一个时间步的输出)
lstm_features = model_lstm.predict(X_seq_test) # 测试集序列
xgb_features = xgb_model.predict_proba(preprocessor.transform(data_test[static_features]))[:, 1] # 静态特征预测概率
# 融合特征:将LSTM特征与XGBoost特征拼接(假设LSTM输出为1维,XGBoost为1维)
final_features = np.concatenate([lstm_features, xgb_features.reshape(-1,1)], axis=1)
# 4. 模型评估
from sklearn.metrics import roc_auc_score, recall_score
y_test = data_test['payment_status']
auc = roc_auc_score(y_test, final_features)
recall = recall_score(y_test, final_features > 0.5)
print(f"AUC: {auc}, Recall: {recall}")
5) 【面试口播版答案】:
“在处理用户历史交易记录的时序特征时,我会结合LSTM和XGBoost,并处理数据不平衡问题。首先,对于月均消费、还款记录这类时间序列数据,我会选择最近12个月作为序列长度,因为用户信用行为通常有年度周期,比如消费习惯在一年内变化更明显。然后,用前向填充处理序列长度不一致,比如用最近的有效数据填充缺失部分,确保所有序列长度为12。接着,用LSTM捕捉序列中的长期依赖,比如连续3个月消费下降可能预示还款能力减弱。同时,用户年龄、收入等静态特征用XGBoost处理,通过梯度提升优化特征权重。对于数据不平衡,采用SMOTE在违约用户(少数类)中生成合成样本,调整k值为5,保留序列的连续性,避免生成不合理的样本。最后,模型效果用AUC(ROC曲线下的面积)评估,因为AUC能全面反映模型区分违约用户和正常用户的能力,尤其在数据不平衡时,AUC比准确率更可靠。这样既能捕捉时序动态,又能处理静态特征,解决不平衡问题,提升模型在信用评分中的表现。”
6) 【追问清单】:
7) 【常见坑/雷区】: