基于决策树的葡萄酒分类实战:从数据预处理到模型优化

1次阅读
没有评论

共计 2173 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景与问题分析

葡萄酒分类是机器学习入门经典案例,但初学者常遇到以下问题:

基于决策树的葡萄酒分类实战:从数据预处理到模型优化

  • 特征尺度差异:酒精含量(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. 数据预处理

关键步骤:

  1. 标准化处理(决策树虽不受量纲影响,但能加速训练)
  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()

常见问题解决方案

类别不平衡处理

当某些葡萄酒品类样本过少时:

  1. 设置 class_weight='balanced' 自动调整类别权重
  2. 使用 SMOTE 过采样少数类
  3. 随机欠采样多数类(可能丢失信息)

高维数据缺陷应对

当特征数量过多(如 100+)时:

  • 先进行 PCA 降维
  • 改用随机森林提升抗噪能力
  • 增加 min_impurity_decrease 阈值过滤无效分裂

生产环境建议

  1. 模型监控:定期检查特征分布漂移(用 KL 散度)
  2. 版本控制:保存每次训练的 scaler 和模型参数
  3. A/ B 测试:新模型上线时保留旧模型对比效果

扩展练习

尝试将相同流程应用于:

  1. Iris 鸢尾花数据集(调整 max_depth 观察准确率变化)
  2. 信用卡欺诈检测(重点实践类别不平衡处理)
  3. 自定义数据集(体会特征工程的重要性)

关键总结

  • 决策树最适合可解释性要求高的中小规模数据集
  • 通过 max_depthmin_samples_split控制模型复杂度
  • 特征重要性分析能指导后续特征工程方向
  • 生产环境需考虑数据漂移和模型退化问题
正文完
 0
评论(没有评论)