
针对交通银行信贷审批的多源异构数据,通过统一处理缺失值与异常值,构建统计、时序、文本等多维度特征,结合相关性分析与递归特征消除(RFE,结合业务模型评估),筛选有效特征以提升模型AUC,降低信贷违约风险。
特征工程是信贷审批模型的核心,需解决异构数据(征信、行为、交易)的统一性问题。首先处理缺失值:数值型数据用均值/中位数填充(低缺失率),高缺失率用模型预测(如用其他特征训练回归模型,评估指标为MAE、RMSE);文本型数据用空值处理。异常值处理用IQR/3σ检测,结合业务逻辑(如大额交易是否为正常业务,标记而非删除)。特征构建分三类:统计特征(如月均收入、最大负债率,反映静态财务状况);时序特征(如交易记录的滚动均值、波动率,捕捉动态行为;征信报告的滞后特征,如最近6个月逾期次数);文本特征(如征信报告中的负面关键词计数,用TF-IDF提取,参数如n-gram=1或2,平滑方法如Laplace)。特征选择通过相关性分析(过滤低相关特征)与RFE(结合逻辑回归或XGBoost,逐步移除贡献最小的特征,评估指标为AUC提升)。类比:特征工程如同烹饪,不同数据源是食材,需清洗(处理缺失/异常)、切配(特征提取),再按菜谱(特征选择)组合,提升模型预测质量。
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 均值/中位数填充 | 用列均值/中位数替换缺失值 | 简单,可能引入偏差 | 数值型数据,缺失比例低(<5%) | 数据偏态时,中位数更稳定 |
| 插值法(线性/多项式) | 根据相邻值插值 | 保留时间序列趋势 | 时序数据,连续缺失 | 非线性插值需额外参数 |
| 模型预测填充 | 用其他特征训练模型预测缺失值 | 保留信息,适合高缺失率(>10%) | 多源数据,缺失比例高 | 需额外训练预测模型,评估填充效果(如MAE、RMSE) |
| 特征类型 | 定义 | 举例(交通银行场景) | 适用场景 |
|---|---|---|---|
| 统计特征 | 数据的基本统计量 | 月均收入、最大负债率、信用等级(数值化) | 基础特征,易计算,反映静态财务状况 |
| 时序特征 | 时间序列的动态统计 | 最近30天交易滚动均值、交易波动率、滞后1个月逾期次数 | 捕捉客户行为动态变化,如还款能力波动 |
| 文本特征 | 非结构化文本关键词提取 | 征信报告“逾期”“失信”关键词计数(TF-IDF编码) | 处理征信报告等文本数据,捕捉信用历史中的负面信息 |
import pandas as pd
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
# 1. 数据对齐与预处理
def preprocess_data(df_transaction, df_credit, df_behavior):
# 交易记录:按月聚合,统一时间粒度
df_transaction = df_transaction.set_index('timestamp').resample('M').agg({
'amount': ['mean', 'std', 'max']
}).reset_index()
df_transaction.columns = ['month', 'avg_amount', 'std_amount', 'max_amount']
# 征信报告:提取文本特征(关键词计数)
def extract_text_features(text):
keywords = ['逾期', '失信', '欠款']
counts = sum(text.str.count(kw) for kw in keywords)
return counts
df_credit['text_features'] = df_credit['report_content'].apply(extract_text_features)
# 行为数据:标准化
scaler = StandardScaler()
df_behavior_scaled = pd.DataFrame(scaler.fit_transform(df_behavior), columns=df_behavior.columns)
# 合并数据
df = pd.merge(df_transaction, df_behavior_scaled, on='customer_id', how='inner')
df = pd.merge(df, df_credit[['customer_id', 'text_features']], on='customer_id', how='inner')
return df
# 2. 缺失值处理
def handle_missing(df):
# 交易金额:滚动均值填充
df['avg_amount'] = df['avg_amount'].fillna(df['avg_amount'].rolling(3, min_periods=1).mean())
# 文本特征:空值用0填充
df['text_features'] = df['text_features'].fillna(0)
# 数值特征:均值填充
for col in df.select_dtypes(include='number').columns:
if df[col].isnull().sum() > 0:
df[col] = df[col].fillna(df[col].mean())
return df
# 3. 异常值处理
def handle_outliers(df):
# 交易金额:IQR检测
q1 = df['avg_amount'].quantile(0.25)
q3 = df['avg_amount'].quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
df['avg_amount'] = df['avg_amount'].clip(lower=lower_bound, upper=upper_bound)
return df
# 4. 特征组合
def extract_features(df):
# 统计特征
stats_features = df[['income', 'debt_ratio']].mean()
# 时序特征(交易)
df['rolling_mean'] = df['avg_amount'].rolling(30).mean()
df['volatility'] = df['avg_amount'].rolling(30).std()
# 文本特征(已提取)
return pd.concat([stats_features, df[['rolling_mean', 'volatility', 'text_features']]], axis=1)
# 5. 特征选择(RFE结合逻辑回归)
def select_features(X, y):
# 相关性分析(初步筛选)
corr = X.corrwith(y)
X_corr = X[corr[abs(corr) > 0.1].index]
# RFE
model = LogisticRegression()
rfe = RFE(model, n_features_to_select=10)
rfe.fit(X_corr, y)
return X[rfe.support_]
# 示例调用
# df = preprocess_data(...) # 假设数据已加载
# df = handle_missing(df)
# df = handle_outliers(df)
# X = extract_features(df)
# y = df['default'] # 目标变量
# X_selected = select_features(X, y)
“面试官您好,针对交通银行信贷审批的多源异构数据,我的特征工程方案核心是:首先统一处理缺失值与异常值,比如交易数据用滚动均值填充缺失,征信文本用空值处理,异常值用IQR检测并替换。然后构建多维度特征,包括统计特征(月均收入、最大负债率)、时序特征(最近30天交易滚动均值、波动率)、文本特征(征信报告中的‘逾期’等关键词计数,用TF-IDF编码)。最后通过相关性分析过滤低相关特征,再用递归特征消除(RFE,结合逻辑回归模型评估),保留与违约率强相关的特征子集,最终提升模型AUC,降低信贷违约风险。”
如何处理不同数据源的时序特征对齐?
回答:统一时间粒度(如月),对齐起始时间,交易记录按月聚合,征信报告的滞后特征(如最近6个月逾期)与交易记录的滚动窗口对齐,确保时间维度一致。
特征选择中RFE结合模型的具体步骤?
回答:先用相关性分析初步筛选高相关特征,再用RFE结合逻辑回归模型,通过交叉验证逐步移除贡献最小的特征,保留最优特征子集,评估指标为AUC提升。
文本特征提取的具体方法?
回答:采用词袋模型或TF-IDF,提取征信报告中的关键词(如“逾期”“失信”“欠款”),统计每个关键词的出现次数,作为数值特征。
缺失值处理中,如果缺失比例过高,如何处理?
回答:用模型预测填充,比如用其他特征(如收入、负债率)训练回归模型预测缺失的交易金额,评估填充效果(如MAE、RMSE)。
时序特征中,如何处理季节性?
回答:对交易时间序列进行季节性分解(如用STL分解),提取季节性成分,作为特征(如季节性均值、季节性波动),捕捉季节性变化对还款能力的影响。