共计 2205 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
红葡萄酒数据集是经典的分类数据集,常用于机器学习入门实践。该数据集通常包含酒精含量、苹果酸浓度、灰分碱度等 12-13 个化学特征,目标是根据这些特征预测葡萄酒质量等级(通常分为 3 - 5 个类别)。在 AIStudio 平台提供的版本中,数据已经过初步清洗,但仍需注意特征量纲差异和可能的类别不平衡问题。

算法原理对比
决策树
- 核心思想:通过递归划分特征空间构建树形结构,每个节点代表一个特征判断
- 优点:
- 模型可解释性强,可直接可视化决策路径
- 对数据分布假设较少,能处理混合类型特征
- 自动特征选择(通过信息增益 / 基尼系数)
- 缺点:
- 容易过拟合,对噪声敏感
- 不稳定,小数据变化可能导致完全不同的树
随机森林
- 核心思想:集成多棵决策树,通过投票机制提高泛化能力
- 优点:
- 天然抗过拟合(通过 bagging 和随机特征子集)
- 能处理高维特征,对异常值不敏感
- 提供特征重要性评估
- 缺点:
- 模型解释性降低
- 训练和预测速度较慢
代码实现
数据预处理
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# 假设 df 是已加载的 DataFrame
X = df.drop('quality', axis=1)
y = df['quality']
# 标准化处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42, stratify=y)
模型构建
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
# 决策树(限制深度防止过拟合)dtree = DecisionTreeClassifier(
max_depth=5,
min_samples_split=10,
criterion='gini',
random_state=42
)
# 随机森林(设置树的数量和特征采样比例)rforest = RandomForestClassifier(
n_estimators=100,
max_features='sqrt',
max_depth=7,
random_state=42
)
模型评估
from sklearn.metrics import classification_report
from sklearn.model_selection import cross_val_score
# 交叉验证评估
def evaluate_model(model, X, y):
scores = cross_val_score(model, X, y, cv=5, scoring='f1_weighted')
print(f"CV F1-score: {scores.mean():.3f} (±{scores.std():.3f})")
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
# 执行评估
print("Decision Tree Evaluation:")
evaluate_model(dtree, X_scaled, y)
print("\nRandom Forest Evaluation:")
evaluate_model(rforest, X_scaled, y)
结果分析
典型输出对比示例:
| 指标 | 决策树 | 随机森林 |
|---|---|---|
| 准确率 | 0.78 | 0.85 |
| 加权 F1 | 0.76 | 0.83 |
| 类别 3 召回率 | 0.65 | 0.81 |
可视化建议:
1. 使用混淆矩阵热力图对比分类效果
2. 绘制 ROC 曲线(需转换为二分类问题)
3. 特征重要性柱状图(随机森林特有)
避坑指南
类别不平衡处理
- 使用
class_weight='balanced'参数自动调整类别权重 - 过采样少数类(SMOTE 算法)或欠采样多数类
- 选择适合的评估指标(如 F1-score 而非准确率)
避免过拟合技巧
- 决策树:
- 设置
max_depth限制树深度 - 增加
min_samples_split和min_samples_leaf - 随机森林:
- 控制
max_depth和min_samples_leaf - 减少
n_estimators数量(50-200 通常足够)
特征分析
# 随机森林特征重要性
importances = rforest.feature_importances_
feat_importances = pd.Series(importances, index=X.columns)
feat_importances.nlargest(5).plot(kind='barh')
扩展优化方向
- 特征工程:
- 尝试多项式特征组合
- 使用 PCA 降维
- 超参数调优:
- 网格搜索(GridSearchCV)
- 贝叶斯优化
- 模型融合:
- 结合 XGBoost/LightGBM 等梯度提升树
- 设计投票 / 堆叠集成策略
实验复现建议
AIStudio 平台已预置该数据集,读者可以:
1. 新建 Notebook 并导入示例数据集
2. 复制本文代码逐步执行
3. 尝试调整超参数观察效果变化
4. 分享自己的优化方案和结果对比
正文完
