共计 2829 个字符,预计需要花费 8 分钟才能阅读完成。
背景介绍
葡萄酒质量评估是酿酒行业的核心需求之一。传统的人工品鉴方式成本高、效率低,且受主观因素影响较大。通过机器学习算法对葡萄酒化学成分进行分析,可以快速、客观地预测质量等级。本文将使用决策树算法,基于 11 种化学成分特征构建分类模型,将葡萄酒质量分为 ’ 差 ’、’ 中等 ’、’ 好 ’ 三个等级。

决策树算法特别适合这类分类问题,因为它:
- 易于理解和解释
- 不需要复杂的特征缩放
- 可以自动选择重要特征
- 对异常值不敏感
数据准备与预处理
首先我们需要加载并探索数据集。这里使用经典的葡萄酒质量数据集。
import pandas as pd
from sklearn.model_selection import train_test_split
# 加载数据集
data = pd.read_csv('winequality.csv')
# 查看数据概览
print(data.head())
print(data.info())
print(data.describe())
缺失值处理
- 检查数据集中是否存在缺失值
- 根据情况选择填充或删除策略
# 检查缺失值
print(data.isnull().sum())
# 简单填充缺失值
data = data.fillna(data.mean())
质量等级划分
原始数据中的质量评分通常是 1 -10 分的连续值,我们需要将其转换为三个等级:
- 差 (0- 4 分)
- 中等 (5- 6 分)
- 好 (7-10 分)
# 定义分类函数
def classify_quality(score):
if score <= 4:
return '差'
elif score <= 6:
return '中等'
else:
return '好'
# 应用分类
data['quality_level'] = data['quality'].apply(classify_quality)
特征标准化
虽然决策树不需要严格的标准化,但对数值范围差异大的特征进行标准化可以略微提升性能。
from sklearn.preprocessing import StandardScaler
# 选择特征列
features = data.columns.difference(['quality', 'quality_level'])
# 标准化
scaler = StandardScaler()
data[features] = scaler.fit_transform(data[features])
特征工程
特征重要性分析
决策树可以自动评估特征重要性,但我们可以先进行初步分析。
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.title('特征相关性热力图')
plt.show()
特征选择
基于相关性分析和业务理解,我们可以选择最重要的几个特征:
- 酒精含量
- 挥发性酸度
- 硫酸盐
- 总二氧化硫
- 密度
selected_features = ['alcohol', 'volatile acidity', 'sulphates', 'total sulfur dioxide', 'density']
X = data[selected_features]
y = data['quality_level']
模型构建
数据分割
# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
决策树模型
from sklearn.tree import DecisionTreeClassifier
# 初始化模型
dtree = DecisionTreeClassifier(
criterion='gini',
max_depth=5,
min_samples_split=10,
random_state=42
)
# 训练模型
dtree.fit(X_train, y_train)
关键参数解释
criterion: 分裂标准,可选 ’gini’ 或 ’entropy’max_depth: 树的最大深度,防止过拟合min_samples_split: 节点分裂所需最小样本数min_samples_leaf: 叶节点最小样本数
模型评估
预测与评估
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))
可视化决策树
from sklearn.tree import plot_tree
plt.figure(figsize=(20, 10))
plot_tree(dtree, feature_names=selected_features, class_names=dtree.classes_, filled=True)
plt.show()
模型调优
网格搜索
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {'max_depth': [3, 5, 7, 9],
'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("最佳参数:", grid_search.best_params_)
# 使用最佳参数重新训练
best_dtree = grid_search.best_estimator_
交叉验证
from sklearn.model_selection import cross_val_score
# 5 折交叉验证
cv_scores = cross_val_score(best_dtree, X, y, cv=5)
print("交叉验证平均得分:", cv_scores.mean())
避坑指南
- 类别不平衡问题 :葡萄酒数据通常中等质量样本最多,可以尝试过采样或欠采样
- 过拟合问题 :控制树的最大深度,使用剪枝技术
- 特征选择 :不要盲目使用所有特征,选择相关性高的特征
- 数据泄漏 :确保预处理步骤在训练测试分割后进行
总结与扩展
本文详细介绍了如何使用决策树进行葡萄酒质量分类。这种方法也可以应用于其他食品质量评估场景,如:
- 咖啡品质分类
- 肉类新鲜度检测
- 水果成熟度评估
思考题:如果要将该方法扩展到其他食品质量分类问题,需要考虑哪些不同的因素?
正文完
发表至: 未分类
近一天内
