共计 2251 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:新手常见技术盲区
刚接触数据挖掘竞赛的同学,往往会在以下三个环节踩坑:

-
数据泄露 :在预处理阶段就使用全量数据统计信息(如均值填充),导致模型过拟合。正确做法是仅用训练集统计量处理验证 / 测试集。
-
特征冗余 :盲目添加高相关性特征(如同时保留 ” 年龄 ” 和 ” 出生年份 ”),反而降低模型泛化能力。需要通过 VIF 或相关性矩阵筛选。
-
验证集划分不当 :随机拆分时间序列数据,导致未来信息泄漏。应采用时间序列分割(TimeSeriesSplit)。
技术方案详解
数据预处理实战
用 pandas 处理缺失值时,分组填充比全局填充更合理:
# 按职业分组填充年龄中位数
df['Age'] = df.groupby('Occupation')['Age'].transform(lambda x: x.fillna(x.median()))
# 对数值型异常值用 3σ 原则处理
mean, std = df['Income'].mean(), df['Income'].std()
df['Income'] = df['Income'].clip(
lower=mean-3*std,
upper=mean+3*std)
特征工程双保险
先通过互信息法筛选重要特征,再用 VIF 剔除多重共线性:
from sklearn.feature_selection import mutual_info_classif
# 互信息排名前 20 的特征
mi_scores = mutual_info_classif(X_train, y_train)
selected = X_train.columns[mi_scores.argsort()[-20:]]
from statsmodels.stats.outliers_influence import variance_inflation_factor
# VIF>10 的特征剔除
vif_data = pd.DataFrame()
vif_data["feature"] = selected
vif_data["VIF"] = [variance_inflation_factor(X_train[selected].values, i)
for i in range(len(selected))]
final_features = vif_data[vif_data["VIF"] <= 10]["feature"]
LightGBM 建模模板
包含早停和 5 折交叉验证的完整流程:
import lightgbm as lgb
from sklearn.model_selection import KFold
params = {
'objective': 'binary',
'metric': 'auc',
'learning_rate': 0.05,
'num_leaves': 31
}
# 早停回调
callbacks = [lgb.early_stopping(stopping_rounds=50)]
# K 折交叉验证
kf = KFold(n_splits=5)
for train_idx, val_idx in kf.split(X_train):
train_data = lgb.Dataset(X_train.iloc[train_idx],
label=y_train.iloc[train_idx])
val_data = lgb.Dataset(X_train.iloc[val_idx],
label=y_train.iloc[val_idx])
model = lgb.train(params,
train_data,
valid_sets=[val_data],
callbacks=callbacks)
避坑指南:5 大常见错误
-
验证集污染 :避免任何形式的预处理时混用验证集数据。解决方案:先拆分再分别处理。
-
类别编码错误 :对有序类别用 LabelEncoder,无序类别用 OneHotEncoder。示例:
# 有序类别 from sklearn.preprocessing import LabelEncoder df['Education'] = LabelEncoder().fit_transform(df['Education']) # 无序类别 pd.get_dummies(df, columns=['City']) -
忽略特征交互 :组合重要特征(如年龄×收入)可能提升效果。可用 PolynomialFeatures 生成。
-
过早优化 :先跑通 baseline 再调参。建议先用默认参数验证流程可行性。
-
未利用时间信息 :如果是时间序列问题,务必添加时间特征(小时 / 星期 / 节假日等)。
性能优化技巧
通过特征重要性分析精简特征:
-
训练后获取特征重要性:
importance = pd.DataFrame({'feature': model.feature_name(), 'gain': model.feature_importance('gain') }).sort_values('gain', ascending=False) -
保留前 N 个重要特征重新训练,可减少 30%-50% 训练时间。
-
对不重要特征可尝试分箱处理(如 qcut),有时能提升效果。
延伸思考
-
当正负样本比例达到 1:100 时,应该采用哪些策略?(提示:过采样 / 代价敏感学习)
-
如何验证特征工程的有效性?(提示:ablation study)
-
面对超高维稀疏特征(如用户行为日志),有哪些高效的降维方法?(提示:TruncatedSVD)
希望这篇指南能帮你避开初学者的常见陷阱。记住:在数据挖掘竞赛中,优秀的特征工程往往比复杂的模型更重要。祝你泰迪杯取得好成绩!
