共计 2173 个字符,预计需要花费 6 分钟才能阅读完成。
背景与问题分析
葡萄酒分类是机器学习入门经典案例,但初学者常遇到以下问题:

- 特征尺度差异:酒精含量(12-15%)与苹果酸浓度(0.1-0.5g/L)数值量级差异显著,直接影响决策树分裂点计算
- 过拟合陷阱:不限制树深度时容易生成复杂规则,训练集准确率 99% 但测试集仅 70%
- 算法选择困惑:相比 SVM(需要调核函数)和随机森林(黑箱特性),决策树具有可视化优势且参数更易解释
完整实现流程
1. 环境准备与数据加载
import pandas as pd
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
# 加载内置葡萄酒数据集
wine = load_wine()
X = pd.DataFrame(wine.data, columns=wine.feature_names)
y = wine.target
# 查看特征统计
print(X.describe())
2. 数据预处理
关键步骤:
- 标准化处理(决策树虽不受量纲影响,但能加速训练)
- 训练测试集拆分(保持类别比例)
from sklearn.preprocessing import StandardScaler
# 按 8:2 比例拆分,stratify 确保类别分布一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# 标准化处理(注意仅拟合训练集)scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
3. 基础模型训练
核心参数说明:
criterion: 分裂质量衡量(gini/entropy)max_depth: 控制过拟合关键参数min_samples_split: 节点继续分裂的最小样本数
from sklearn.tree import DecisionTreeClassifier
# 初始化模型(限制深度防止过拟合)clf = DecisionTreeClassifier(
criterion='gini',
max_depth=3,
min_samples_split=10,
random_state=42
)
clf.fit(X_train_scaled, y_train)
# 评估性能
print(f"训练集准确率: {clf.score(X_train_scaled, y_train):.2f}")
print(f"测试集准确率: {clf.score(X_test_scaled, y_test):.2f}")
模型优化技巧
1. 网格搜索调参
使用交叉验证寻找最优参数组合:
from sklearn.model_selection import GridSearchCV
param_grid = {'max_depth': [3, 5, 7],
'min_samples_split': [2, 5, 10],
'criterion': ['gini', 'entropy']
}
grid = GridSearchCV(DecisionTreeClassifier(random_state=42),
param_grid,
cv=5,
n_jobs=-1
)
grid.fit(X_train_scaled, y_train)
print(f"最优参数: {grid.best_params_}")
print(f"最佳分数: {grid.best_score_:.2f}")
2. 特征重要性可视化
import matplotlib.pyplot as plt
# 获取特征重要性
importances = grid.best_estimator_.feature_importances_
feat_names = wine.feature_names
# 绘制条形图
plt.figure(figsize=(10,6))
plt.barh(feat_names, importances)
plt.xlabel('Feature Importance')
plt.title('决策树特征重要性排名')
plt.show()
常见问题解决方案
类别不平衡处理
当某些葡萄酒品类样本过少时:
- 设置
class_weight='balanced'自动调整类别权重 - 使用 SMOTE 过采样少数类
- 随机欠采样多数类(可能丢失信息)
高维数据缺陷应对
当特征数量过多(如 100+)时:
- 先进行 PCA 降维
- 改用随机森林提升抗噪能力
- 增加
min_impurity_decrease阈值过滤无效分裂
生产环境建议
- 模型监控:定期检查特征分布漂移(用 KL 散度)
- 版本控制:保存每次训练的 scaler 和模型参数
- A/ B 测试:新模型上线时保留旧模型对比效果
扩展练习
尝试将相同流程应用于:
- Iris 鸢尾花数据集(调整
max_depth观察准确率变化) - 信用卡欺诈检测(重点实践类别不平衡处理)
- 自定义数据集(体会特征工程的重要性)
关键总结
- 决策树最适合可解释性要求高的中小规模数据集
- 通过
max_depth和min_samples_split控制模型复杂度 - 特征重要性分析能指导后续特征工程方向
- 生产环境需考虑数据漂移和模型退化问题
正文完
发表至: 未分类
近一天内
