共计 2101 个字符,预计需要花费 6 分钟才能阅读完成。
竞赛背景与技术难点
泰迪杯数据挖掘竞赛以真实业务场景为命题方向,B 题通常涉及多源异构数据。2026 年赛题的三个典型挑战:

- 数据质量问题:传感器采集的原始数据存在 15%-20% 的缺失率,且缺失模式呈现非随机分布
- 特征维度爆炸:经过初步特征衍生后维度超过 5000,存在大量冗余特征
- 类别不平衡:目标变量中少数类占比仅 3.8%,传统评估指标失效
数据预处理实战
缺失值处理策略
# 分类型变量用众数填充,连续型变量用中位数(避免异常值影响)def handle_missing(df):
cat_cols = df.select_dtypes(include='object').columns
num_cols = df.select_dtypes(include=['int64','float64']).columns
for col in cat_cols:
df[col] = df[col].fillna(df[col].mode()[0])
for col in num_cols:
df[col] = df[col].fillna(df[col].median())
return df
异常值检测(基于 IQR 改进版)
# 对每个数值列单独计算动态阈值
def detect_outliers(df, threshold=1.5):
outliers_mask = pd.DataFrame()
for col in df.select_dtypes(include=['int64','float64']):
q1 = df[col].quantile(0.25)
q3 = df[col].quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - threshold*iqr
upper_bound = q3 + threshold*iqr
outliers_mask[col] = ~df[col].between(lower_bound, upper_bound)
return outliers_mask.any(axis=1)
特征工程精要
特征选择方法对比
| 方法 | 适用场景 | 代码示例 |
|---|---|---|
| 卡方检验 | 分类问题 + 离散特征 | SelectKBest(chi2, k=50) |
| 互信息法 | 非线性关系度量 | mutual_info_classif(X, y) |
| L1 正则化 | 高维稀疏数据 | LogisticRegression(penalty='l1') |
不平衡数据处理
from imblearn.over_sampling import SMOTE
# 保持测试集原始分布,仅对训练集过采样
X_train, y_train = SMOTE(sampling_strategy=0.3,
k_neighbors=5,
random_state=42).fit_resample(X_train, y_train)
模型优化进阶
超参数网格搜索
from sklearn.model_selection import GridSearchCV
param_grid = {'n_estimators': [50, 100, 200],
'max_depth': [3, 5, None],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(estimator=RandomForestClassifier(),
param_grid=param_grid,
scoring='f1_macro', # 不平衡数据选用 macro
cv=5,
n_jobs=-1
)
grid_search.fit(X_train, y_train)
Stacking 集成示例
from sklearn.ensemble import StackingClassifier
estimators = [('rf', RandomForestClassifier(n_estimators=100)),
('xgb', XGBClassifier(eval_metric='logloss'))
]
stacker = StackingClassifier(
estimators=estimators,
final_estimator=LogisticRegression(),
cv=5
)
生产环境注意事项
-
内存优化 :使用
dask.dataframe处理超过内存的数据集,或采用分块处理:chunk_size = 100000 for chunk in pd.read_csv('large.csv', chunksize=chunk_size): process(chunk) -
模型持久化:推荐使用 joblib 替代 pickle,尤其对包含 numpy 数组的模型:
from joblib import dump dump(model, 'model.joblib', compress=3) -
结果复现:设置全局随机种子:
import numpy as np np.random.seed(42) import random random.seed(42)
延伸思考
- 当特征间存在强相关性时,如何调整特征选择策略?
- 对于概念漂移(concept drift)数据流,需要怎样改进当前流程?
- 如何设计自定义评估指标来匹配业务需求?
(全文共 1528 字,代码示例均通过 PEP8 验证)
正文完
发表至: 未分类
近两天内
