共计 2382 个字符,预计需要花费 6 分钟才能阅读完成。
业务场景与技术挑战
红酒分类是食品工业和零售领域的重要课题,通过化学分析确定红酒的产地或品质等级。典型挑战包括:

- 数据维度较高(通常包含 13+ 项理化指标)
- 特征间存在非线性关系
- 样本量有限(常见数据集仅数百条记录)
算法选型:为什么选择决策树
与其他分类算法对比:
| 算法 | 优点 | 缺点 |
|---|---|---|
| 决策树 | 可解释性强,支持混合数据类型 | 容易过拟合 |
| 逻辑回归 | 计算效率高 | 难以处理非线性关系 |
| 随机森林 | 抗过拟合能力强 | 模型复杂度高 |
| SVM | 高维表现好 | 参数调节敏感 |
决策树特别适合本案:
- 提供清晰的分类规则(便于业务解释)
- 自动处理特征缩放(各指标量纲差异大)
- 支持缺失值处理(实际业务常见场景)
环境准备
确保 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%
解决方案:
-
剪枝策略
pruned_model = DecisionTreeClassifier( max_depth=3, min_samples_split=5, random_state=42 ) -
交叉验证
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}")
迁移到其他分类场景
决策树方法可扩展至:
- 客户分群(RFM 模型)
- 故障诊断(设备传感器数据)
- 文本分类(配合 TF-IDF 特征)
关键调整点:
- 类别不平衡时使用 class_weight 参数
- 高维数据建议先做特征筛选
- 考虑集成方法(如随机森林)提升稳定性
完整代码示例
参见 GitHub 仓库(虚拟地址):
https://github.com/example/wine-classification
最佳实践建议:生产环境建议使用 Pipeline 封装完整流程,并持久化模型(joblib)
正文完
