共计 2618 个字符,预计需要花费 7 分钟才能阅读完成。
美赛 C 题数据集特征与决策树优势
数学建模竞赛(如美赛 C 题)的数据集通常具有多维度、含缺失值和类别不平衡的特点。这类数据往往包含数值型和类别型混合特征,且由于数据收集过程中的各种原因,缺失值较为常见。同时,目标变量的分布可能存在明显的不平衡,例如在分类问题中某些类别的样本数量远多于其他类别。

决策树算法特别适合处理这类复杂数据,主要原因包括:
- 能够自动处理数值型和类别型特征的混合数据
- 对缺失值具有一定鲁棒性
- 不需要对数据进行归一化处理
- 模型结果易于解释和可视化
完整技术方案实现
数据预处理实战
首先导入必要的库并加载数据:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
# 加载数据集
data = pd.read_csv('mcm2025c_data.csv')
# 查看数据基本信息
print(data.info())
print(data.describe())
处理缺失值的常用方法:
# 数值型缺失值用中位数填充
numeric_cols = data.select_dtypes(include=['int64','float64']).columns
data[numeric_cols] = data[numeric_cols].fillna(data[numeric_cols].median())
# 类别型缺失值用众数填充
categorical_cols = data.select_dtypes(include=['object']).columns
data[categorical_cols] = data[categorical_cols].fillna(data[categorical_cols].mode().iloc[0])
特征编码处理:
# 对类别特征进行 one-hot 编码
data = pd.get_dummies(data, columns=categorical_cols, drop_first=True)
# 划分特征和标签
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)
决策树核心参数详解
决策树有几个关键参数需要理解:
max_depth:树的最大深度,控制模型复杂度min_samples_split:节点分裂所需最小样本数min_samples_leaf:叶节点所需最小样本数criterion:分裂质量的衡量标准(gini/entropy)max_features:寻找最佳分裂时考虑的特征数量
模型训练与可视化
完整训练和可视化代码:
from sklearn.tree import DecisionTreeClassifier, export_graphviz
import graphviz
# 初始化决策树模型
dtree = DecisionTreeClassifier(random_state=42)
# 训练模型
dtree.fit(X_train, y_train)
# 可视化决策树
dot_data = export_graphviz(dtree, out_file=None,
feature_names=X.columns,
class_names=['Class0','Class1'],
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph.render('decision_tree') # 保存为 PDF
超参数优化
使用 GridSearchCV 进行参数调优:
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {'max_depth': [3, 5, 7, 10],
'min_samples_split': [2, 5, 10],
'criterion': ['gini', 'entropy']
}
# 初始化网格搜索
grid_search = GridSearchCV(DecisionTreeClassifier(random_state=42),
param_grid, cv=5, scoring='accuracy')
# 执行搜索
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("最佳参数:", grid_search.best_params_)
print("最佳分数:", grid_search.best_score_)
竞赛实战 Tips
处理过拟合问题
- 预剪枝策略:
- 限制 max_depth
- 增大 min_samples_split 和 min_samples_leaf
- 设置 max_leaf_nodes
- 后剪枝策略:
- 使用 ccp_alpha 参数进行代价复杂度剪枝
类别不平衡处理
# 计算类别权重
from sklearn.utils import class_weight
class_weights = class_weight.compute_class_weight('balanced',
classes=np.unique(y_train),
y=y_train)
class_weight_dict = dict(zip(np.unique(y_train), class_weights))
# 使用加权模型
dtree_weighted = DecisionTreeClassifier(class_weight=class_weight_dict)
提升模型解释性
- 使用 feature_importances_分析特征重要性
- 限制树深度使决策路径更易理解
- 结合 SHAP 值进行解释
总结与思考
通过本文的完整流程,你应该已经掌握了如何在美赛 C 题中应用决策树模型。从数据清洗、特征工程到模型调优和可视化,每个步骤都对最终结果有重要影响。
最后留两个思考题:
- 如何将决策树集成到更复杂的 stacking 模型中?考虑作为基学习器或元学习器的不同应用方式。
- 面对高维稀疏数据时决策树的替代方案有哪些?比如随机森林、XGBoost 或神经网络等方法的适用场景比较。
希望这篇指南能帮助你在 2025 美赛中取得好成绩!
正文完
