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

1次阅读
没有评论

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

image.webp

业务场景与技术挑战

红酒分类是食品工业和零售领域的重要课题,通过化学分析确定红酒的产地或品质等级。典型挑战包括:

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

  • 数据维度较高(通常包含 13+ 项理化指标)
  • 特征间存在非线性关系
  • 样本量有限(常见数据集仅数百条记录)

算法选型:为什么选择决策树

与其他分类算法对比:

算法 优点 缺点
决策树 可解释性强,支持混合数据类型 容易过拟合
逻辑回归 计算效率高 难以处理非线性关系
随机森林 抗过拟合能力强 模型复杂度高
SVM 高维表现好 参数调节敏感

决策树特别适合本案:

  1. 提供清晰的分类规则(便于业务解释)
  2. 自动处理特征缩放(各指标量纲差异大)
  3. 支持缺失值处理(实际业务常见场景)

环境准备

确保 Anaconda 已安装以下包:

conda install numpy pandas scikit-learn matplotlib seaborn

完整实现流程

1. 数据加载与探索

使用 sklearn 内置数据集:

from sklearn.datasets import load_wine
import pandas as pd

# 加载数据
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target

# 查看数据概况
print(f"样本量: {df.shape[0]}, 特征数: {df.shape[1]-1}")
print(df.describe())

关键发现:

  • 178 个样本,13 个特征
  • 特征值范围差异大(如 ash: 1.36-3.23,proline: 278-1680)
  • 无缺失值(理想实验数据)

2. 特征工程

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 标准化处理(决策树虽不需要,但有利于可视化)scaler = StandardScaler()
X_scaled = scaler.fit_transform(wine.data)

# 划分训练 / 测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, wine.target, test_size=0.2, random_state=42)

3. 基础模型训练

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report

# 初始化模型
base_model = DecisionTreeClassifier(random_state=42)

# 训练与预测
base_model.fit(X_train, y_train)
y_pred = base_model.predict(X_test)

# 评估
print(classification_report(y_test, y_pred))

初始结果示例:

              precision    recall  f1-score   support

           0       0.93      1.00      0.96        14
           1       0.93      0.87      0.90        15
           2       0.86      0.86      0.86         7

    accuracy                           0.92        36
   macro avg       0.91      0.91      0.91        36
weighted avg       0.92      0.92      0.92        36

4. 过拟合诊断与解决

问题表现:训练集准确率 100%,测试集 92%

解决方案:

  1. 剪枝策略

    pruned_model = DecisionTreeClassifier(
        max_depth=3,
        min_samples_split=5,
        random_state=42
    )

  2. 交叉验证

    from sklearn.model_selection import cross_val_score
    scores = cross_val_score(base_model, X_scaled, wine.target, cv=5)
    print(f"CV 准确率: {scores.mean():.2f} ± {scores.std():.2f}")

5. 模型优化进阶

特征重要性分析

import matplotlib.pyplot as plt

plt.figure(figsize=(10,6))
plt.barh(wine.feature_names, base_model.feature_importances_)
plt.title('Feature Importance')
plt.show()

网格搜索调参

from sklearn.model_selection import GridSearchCV

param_grid = {'max_depth': [3, 5, 7],
    'min_samples_split': [2, 5, 10],
    'criterion': ['gini', 'entropy']
}

grid_search = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

print(f"最优参数: {grid_search.best_params_}")
print(f"最佳得分: {grid_search.best_score_:.2f}")

迁移到其他分类场景

决策树方法可扩展至:

  1. 客户分群(RFM 模型)
  2. 故障诊断(设备传感器数据)
  3. 文本分类(配合 TF-IDF 特征)

关键调整点:

  • 类别不平衡时使用 class_weight 参数
  • 高维数据建议先做特征筛选
  • 考虑集成方法(如随机森林)提升稳定性

完整代码示例

参见 GitHub 仓库(虚拟地址):
https://github.com/example/wine-classification

最佳实践建议:生产环境建议使用 Pipeline 封装完整流程,并持久化模型(joblib)

正文完
 0
评论(没有评论)