共计 2817 个字符,预计需要花费 8 分钟才能阅读完成。
比赛背景与数据特点
泰迪杯是国内最具影响力的数据挖掘赛事之一,2025 年赛题预计延续往届特点:

- 数据规模适中:通常提供 10 万 -100 万条结构化数据,适合在个人电脑上处理
- 多源异构数据:可能包含数值型、类别型、文本型甚至时间序列数据混合
- 评价指标明确:往届常用 RMSE、F1-score 等指标,需提前理解计算逻辑
数据预处理全流程
缺失值处理
import pandas as pd
# 查看缺失情况
df.isnull().sum()
# 常用处理方法
# 1. 删除缺失超过 50% 的特征
df = df.loc[:, df.isnull().mean() < 0.5]
# 2. 数值型用中位数填充
df.fillna(df.median(), inplace=True)
# 3. 类别型用众数填充
for col in df.select_dtypes(include='object'):
df[col].fillna(df[col].mode()[0], inplace=True)
异常值检测
- 箱线图法:适用于数值特征
import seaborn as sns sns.boxplot(x=df['feature']) - 3σ 原则:对正态分布数据有效
mean, std = df['feature'].mean(), df['feature'].std() outliers = df[(df['feature'] < mean-3*std) | (df['feature'] > mean+3*std)]
特征标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
num_cols = df.select_dtypes(include=['int64','float64']).columns
df[num_cols] = scaler.fit_transform(df[num_cols])
特征工程实战技巧
特征选择
- 方差阈值法:删除低方差特征
from sklearn.feature_selection import VarianceThreshold selector = VarianceThreshold(threshold=0.1) selector.fit_transform(df) - 互信息法:适用于分类问题
from sklearn.feature_selection import mutual_info_classif mi = mutual_info_classif(X, y)
特征转换
- 类别编码:
# 有序类别用 LabelEncoder from sklearn.preprocessing import LabelEncoder le = LabelEncoder() df['category'] = le.fit_transform(df['category']) # 无序类别用 OneHot df = pd.get_dummies(df, columns=['category']) - 多项式特征:
from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=2, include_bias=False) X_poly = poly.fit_transform(X)
建模方法对比
| 模型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 随机森林 | 通用 | 抗过拟合,特征重要性明确 | 内存消耗大 |
| XGBoost | 结构化数据 | 竞赛表现优异 | 调参复杂 |
| LightGBM | 大数据量 | 训练速度快 | 对小数据可能过拟合 |
完整代码示例
# 数据加载与预处理
import pandas as pd
from sklearn.model_selection import train_test_split
data = pd.read_csv('competition_data.csv')
X = data.drop('target', axis=1)
y = data['target']
# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建 XGBoost 基线模型
from xgboost import XGBRegressor
from sklearn.metrics import mean_squared_error
model = XGBRegressor(
n_estimators=100,
max_depth=3,
learning_rate=0.1,
random_state=42
)
model.fit(X_train, y_train)
# 评估
preds = model.predict(X_test)
print(f'RMSE: {mean_squared_error(y_test, preds, squared=False):.4f}')
常见陷阱与解决方案
- 数据泄露:
- 错误做法:在划分训练测试集前做标准化
-
正确做法:先划分再分别对训练测试集做标准化
-
类别不平衡:
-
解决方案:过采样 (SMOTE) 或调整类别权重
from imblearn.over_sampling import SMOTE smote = SMOTE() X_res, y_res = smote.fit_resample(X_train, y_train) -
过拟合:
- 早停法示例:
model = XGBRegressor( early_stopping_rounds=10, eval_set=[(X_test, y_test)] )
模型调优技巧
-
网格搜索:
from sklearn.model_selection import GridSearchCV params = {'max_depth': [3, 5, 7], 'learning_rate': [0.01, 0.1, 0.2] } grid = GridSearchCV(model, params, cv=5) grid.fit(X_train, y_train) -
集成方法:
- 堆叠 (Stacking) 示例:
from sklearn.ensemble import StackingRegressor from sklearn.linear_model import Ridge estimators = [('xgb', XGBRegressor()), ('lgbm', LGBMRegressor()) ] stack = StackingRegressor( estimators=estimators, final_estimator=Ridge())
实践建议
- 时间分配:建议按 3:4:3 分配数据清洗、特征工程和建模调优的时间
- 版本控制:使用 Git 管理代码迭代过程
- 日志记录:详细记录每个实验的参数和结果
延伸学习
- 推荐书籍:
- 《Python 数据科学手册》
- 《特征工程入门与实践》
- 在线课程:
- Kaggle Learn 数据挖掘课程
- Coursera 机器学习专项课程
- 往届优秀方案:
- 泰迪杯官网往届获奖作品
- Kaggle 类似赛题 Notebook
正文完
发表至: 未分类
近一天内
