共计 1926 个字符,预计需要花费 5 分钟才能阅读完成。
背景与数据理解
葡萄酒数据集是机器学习入门经典案例,记录了 178 个样本的 13 个化学指标(如酒精浓度、苹果酸含量等)和对应的 3 个产区类别。字段依次为:

- Alcohol
- Malic acid
- Ash
- Alcalinity of ash
- Magnesium
- Total phenols
- Flavanoids
- Nonflavanoid phenols
- Proanthocyanins
- Color intensity
- Hue
- OD280/OD315
- Proline
- Class(目标变量)
数据预处理实战
常见痛点
- 特征量纲差异大(如 Proline 数值在 1000 量级,Hue 在 1 量级)
- 分类较均衡(各类别样本数约 60 左右)
标准化处理
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 读取数据(注意第一列是类别)data = pd.read_csv('wine.data', header=None)
X = data.iloc[:, 1:]
y = data.iloc[:, 0]
# 标准化演示
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
模型构建对比
决策树基础版
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
# 默认参数决策树
tree = DecisionTreeClassifier(random_state=42)
scores = cross_val_score(tree, X_scaled, y, cv=5)
print(f"平均准确率:{scores.mean():.2f}")
随机森林进阶
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf_scores = cross_val_score(rf, X_scaled, y, cv=5)
print(f"随机森林准确率:{rf_scores.mean():.2f}")
关键调参技巧
决策树深度控制
- 通过
max_depth参数防止过拟合 - 建议从 3 开始逐步增加,观察验证集表现
# 网格搜索示例
from sklearn.model_selection import GridSearchCV
params = {'max_depth': [3, 5, 7, None]}
grid = GridSearchCV(tree, params, cv=5)
grid.fit(X_scaled, y)
print(f"最优深度:{grid.best_params_}")
特征重要性可视化
import matplotlib.pyplot as plt
rf.fit(X_scaled, y)
plt.barh(range(13), rf.feature_importances_, tick_label=data.columns[1:])
plt.title('特征重要性排序')
plt.show()
避坑指南
- 过拟合陷阱 :决策树默认参数容易完全拟合训练集,必须通过
max_depth或min_samples_split限制 - 特征理解:Color intensity 和 Proline 常是关键特征,但需结合业务理解
- 类别权重:虽然本数据集平衡,但实际场景可用
class_weight='balanced'
优化方向建议
- 尝试 PCA 降维后建模
- 对比 SVM 不同核函数效果
- 用 XGBoost 测试并调整学习率
完整代码模板
# 标准流程示例
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(StandardScaler(),
RandomForestClassifier(n_estimators=100, max_depth=5)
)
# 一键训练评估
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
pipe.fit(X_train, y_train)
print(f"测试集准确率:{pipe.score(X_test, y_test):.2f}")
总结
通过本案例可以掌握:
– 标准化处理对树模型的影响
– 决策树与随机森林的核心差异
– 可视化辅助调参的方法
建议下一步尝试用 sklearn.metrics 输出分类报告,深入分析各类别的识别情况。
正文完
发表至: 未分类
近一天内
