共计 3054 个字符,预计需要花费 8 分钟才能阅读完成。
1. 背景与痛点
葡萄酒质量评估一直是酿酒行业和消费者关注的重点。传统的质量评估依赖于专业品酒师,这种方法不仅成本高,而且容易受到主观因素的影响。通过机器学习模型自动化这一过程,可以大幅提高评估效率和一致性。

然而,这一任务面临几个技术挑战:
- 质量评分分布不均衡(大多数样本集中在中等质量)
- 11 种化学成分特征之间存在复杂相关性
- 需要将连续的质量评分转换为离散的等级分类
2. 数据预处理
2.1 数据加载与初步探索
import pandas as pd
from sklearn.model_selection import train_test_split
# 加载数据集
data = pd.read_csv('winequality.csv')
print(data.head())
print(data.info())
2.2 缺失值处理
- 检查缺失值:
data.isnull().sum() - 对于少量缺失值,可以使用中位数填充:
data.fillna(data.median(), inplace=True)
2.3 质量等级分类
将原始质量评分(通常为 3 - 9 分)转换为三个等级:
# 定义分类标准
data['quality_level'] = pd.cut(data['quality'],
bins=[0,4,6,10],
labels=['差','中等','好'])
2.4 特征标准化
from sklearn.preprocessing import StandardScaler
# 分离特征和目标变量
X = data.drop(['quality','quality_level'], axis=1)
y = data['quality_level']
# 标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
3. 特征工程
3.1 特征相关性分析
import seaborn as sns
import matplotlib.pyplot as plt
# 计算特征相关性
corr = data.corr()
plt.figure(figsize=(12,8))
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.show()
3.2 特征选择
- 移除高度相关的特征(如总二氧化硫和游离二氧化硫)
- 使用特征重要性评估:
from sklearn.ensemble import RandomForestClassifier
# 训练随机森林获取特征重要性
rf = RandomForestClassifier()
rf.fit(X_scaled, y)
# 绘制特征重要性
feat_importances = pd.Series(rf.feature_importances_, index=X.columns)
feat_importances.nlargest(10).plot(kind='barh')
plt.show()
4. 模型构建
4.1 数据分割
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42, stratify=y)
4.2 决策树模型训练
from sklearn.tree import DecisionTreeClassifier
dtree = DecisionTreeClassifier(
max_depth=5,
min_samples_split=10,
min_samples_leaf=5,
random_state=42)
dtree.fit(X_train, y_train)
4.3 可视化决策树
from sklearn.tree import plot_tree
plt.figure(figsize=(20,10))
plot_tree(dtree, feature_names=X.columns,
class_names=dtree.classes_,
filled=True, rounded=True)
plt.show()
5. 模型评估
5.1 基础评估指标
from sklearn.metrics import classification_report, confusion_matrix
y_pred = dtree.predict(X_test)
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))
5.2 分类不平衡处理
- 使用加权 F1-score 作为主要评估指标
- 考虑使用 SMOTE 过采样少数类
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_res, y_res = smote.fit_resample(X_train, y_train)
6. 避坑指南
6.1 常见问题
- 过拟合 :决策树容易生成过于复杂的树结构
- 类别不平衡 :导致模型偏向多数类
- 特征冗余 :高度相关特征影响模型性能
6.2 解决方案
- 设置合理的树深度限制(max_depth)
- 使用 min_samples_split 和 min_samples_leaf 参数
- 采用类别权重(class_weight=’balanced’)
- 进行彻底的特征相关性分析
7. 优化建议
7.1 参数调优
from sklearn.model_selection import GridSearchCV
params = {'max_depth': [3,5,7],
'min_samples_split': [5,10,15],
'min_samples_leaf': [2,5,8]
}
grid = GridSearchCV(dtree, params, cv=5, scoring='f1_weighted')
grid.fit(X_res, y_res)
print("最佳参数:", grid.best_params_)
print("最佳分数:", grid.best_score_)
7.2 集成方法
- 使用随机森林或梯度提升树提升性能
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=100,
max_depth=5,
class_weight='balanced',
random_state=42)
rf.fit(X_res, y_res)
7.3 模型解释
- 使用 SHAP 值分析特征贡献
import shap
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, feature_names=X.columns)
8. 总结
通过本实战项目,我们系统地实现了基于决策树的葡萄酒质量分类模型。从数据预处理到模型优化,每个步骤都经过精心设计和验证。决策树模型的优势在于其可解释性强,我们可以清晰地看到影响葡萄酒质量的关键因素。
在实践中,我们发现处理类别不平衡和防止过拟合是两个最关键的问题。通过参数调优和集成方法,我们能够显著提升模型在真实场景中的表现。
最终,这个模型可以应用于多个场景:
- 酒厂质量监控
- 采购决策支持
- 消费者选购建议
未来可以考虑结合更多的感官评价数据,或者尝试深度学习模型来捕捉更复杂的特征关系。
正文完
发表至: 未分类
近两天内
