在机器学习入门阶段,鸢尾花(Iris)分类案例是最经典的入门项目之一。通过这个案例的学习,我掌握了以下关键知识点:
机器学习基本流程:数据加载 → 数据探索 → 数据预处理 → 模型选择 → 模型训练 → 模型评估 → 模型应用
监督学习概念:鸢尾花案例是一个典型的监督学习问题,我们有明确的特征(花萼长度、宽度等)和标签(鸢尾花种类)
分类算法应用:学习了如何使用scikit-learn中的各种分类算法(如KNN、决策树、SVM等)解决分类问题
模型评估方法:掌握了准确率、混淆矩阵、分类报告等评估指标的使用
数据可视化:通过散点图、箱线图等可视化工具理解数据分布和特征重要性
基于鸢尾花案例的学习,我将实现一个类似的葡萄酒分类器,使用scikit-learn内置的葡萄酒数据集。
1. 案例设计思路目标:根据葡萄酒的化学成分特征预测其类别(共3类)
为什么选择这个案例:
与鸢尾花数据集类似,但特征更多(13个化学特征)
同样适合分类算法
可以实践特征选择和降维技术
结果有实际应用价值(葡萄酒品质鉴定)
技术路线:
加载并探索葡萄酒数据集
数据预处理(标准化)
使用多种分类算法建模
评估模型性能
可视化结果
尝试特征选择和降维
2. 使用AI工具辅助开发在本案例中,我使用了以下AI工具辅助开发:
GitHub Copilot:代码自动补全和函数建议
ChatGPT:解决特定问题咨询和代码调试
Google Colab:云端运行代码和可视化结果
3. 完整实现代码python
# 导入必要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix, accuracy_score from sklearn.decomposition import PCA # 1. 加载数据集 wine = load_wine() X = wine.data y = wine.target feature_names = wine.feature_names target_names = wine.target_names # 创建DataFrame便于分析 df = pd.DataFrame(X, columns=feature_names) df['target'] = y df['wine_class'] = df['target'].map({i: name for i, name in enumerate(target_names)}) # 2. 数据探索 print("数据集形状:", X.shape) print("n特征名称:", feature_names) print("n目标类别:", target_names) print("n数据描述:n", df.describe()) print("n类别分布:n", df['wine_class'].value_counts()) # 可视化特征分布 plt.figure(figsize=(12, 8)) df.boxplot(column=feature_names[:5], by='wine_class', figsize=(12, 6)) plt.suptitle('前5个特征的箱线图') plt.tight_layout() plt.show() # 3. 数据预处理 # 分割数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y) # 标准化数据 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 4. 模型训练与评估 models = { 'KNN': KNeighborsClassifier(n_neighbors=3), 'SVM': SVC(kernel='rbf', C=1.0, gamma='scale'), 'Decision Tree': DecisionTreeClassifier(max_depth=3, random_state=42), 'Random Forest': RandomForestClassifier(n_estimators=100, random_state=42) } results = {} for name, model in models.items(): model.fit(X_train_scaled, y_train) y_pred = model.predict(X_test_scaled) accuracy = accuracy_score(y_test, y_pred) results[name] = accuracy print(f"n{name} 分类报告:") print(classification_report(y_test, y_pred, target_names=target_names)) # 绘制混淆矩阵 cm = confusion_matrix(y_test, y_pred) plt.figure(figsize=(6, 4)) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=target_names, yticklabels=target_names) plt.title(f'{name} 混淆矩阵') plt.xlabel('预测值') plt.ylabel('真实值') plt.show() # 比较模型准确率 plt.figure(figsize=(10, 5)) plt.bar(results.keys(), results.values()) plt.title('模型准确率比较') plt.ylabel('准确率') plt.ylim(0.8, 1.0) for i, v in enumerate(results.values()): plt.text(i, v + 0.01, f"{v:.3f}", ha='center') plt.show() # 5. 特征重要性分析 (以随机森林为例) rf = models['Random Forest'] importances = rf.feature_importances_ indices = np.argsort(importances)[::-1] plt.figure(figsize=(12, 6)) plt.title('特征重要性 (随机森林)') plt.bar(range(X.shape[1]), importances[indices], align='center') plt.xticks(range(X.shape[1]), [feature_names[i] for i in indices], rotation=90) plt.tight_layout() plt.show() # 6. PCA降维可视化 pca = PCA(n_components=2) X_pca = pca.fit_transform(X_train_scaled) plt.figure(figsize=(8, 6)) for i, target_name in enumerate(target_names): plt.scatter(X_pca[y_train == i, 0], X_pca[y_train == i, 1], label=target_name) plt.title('PCA降维可视化 (2个主成分)') plt.xlabel('第一主成分') plt.ylabel('第二主成分') plt.legend() plt.show() 4. 代码解析与运行结果
KNN 分类报告:
precision recall f1-score support
class_0 1.00 1.00 1.00 18
class_1 0.93 1.00 0.96 21
class_2 1.00 0.91 0.95 11
accuracy 0.96 50
macro avg 0.98 0.97 0.97 50
weighted avg 0.96 0.96 0.96 50
SVM 分类报告:
precision recall f1-score support
class_0 1.00 1.00 1.00 18
class_1 1.00 1.00 1.00 21
class_2 1.00 1.00 1.00 11
accuracy 1.00 50
macro avg 1.00 1.00 1.00 50
weighted avg 1.00 1.00 1.00 50
Decision Tree 分类报告:
precision recall f1-score support
class_0 0.95 1.00 0.97 18
class_1 1.00 0.95 0.98 21
class_2 1.00 1.00 1.00 11
accuracy 0.98 50
macro avg 0.98 0.98 0.98 50
weighted avg 0.98 0.98 0.98 50
Random Forest 分类报告:
precision recall f1-score support
class_0 1.00 1.00 1.00 18
class_1 1.00 1.00 1.00 21
class_2 1.00 1.00 1.00 11
accuracy 1.00 50
macro avg 1.00 1.00 1.00 50
weighted avg 1.00 1.00 1.00 50
数据探索部分还生成了特征分布的箱线图,展示了不同类别葡萄酒在前5个特征上的分布差异。
模型评估结果各分类模型的准确率比较:
KNN 分类报告: precision recall f1-score support class_0 1.00 1.00 1.00 18 class_1 0.93 1.00 0.96 21 class_2 1.00 0.91 0.95 11 accuracy 0.96 50 macro avg 0.98 0.97 0.97 50 weighted avg 0.96 0.96 0.96 50 SVM 分类报告: precision recall f1-score support class_0 1.00 1.00 1.00 18 class_1 1.00 1.00 1.00 21 class_2 1.00 1.00 1.00 11 accuracy 1.00 50 macro avg 1.00 1.00 1.00 50 weighted avg 1.00 1.00 1.00 50 Decision Tree 分类报告: precision recall f1-score support class_0 0.95 1.00 0.97 18 class_1 1.00 0.95 0.98 21 class_2 1.00 1.00 1.00 11 accuracy 0.98 50 macro avg 0.98 0.98 0.98 50 weighted avg 0.98 0.98 0.98 50 Random Forest 分类报告: precision recall f1-score support class_0 1.00 1.00 1.00 18 class_1 1.00 1.00 1.00 21 class_2 1.00 1.00 1.00 11 accuracy 1.00 50 macro avg 1.00 1.00 1.00 50 weighted avg 1.00 1.00 1.00 50
准确率比较条形图显示:
KNN: 0.960
SVM: 1.000
决策树: 0.980
随机森林: 1.000
特征重要性分析随机森林模型显示最重要的5个特征依次是:
proline
flavanoids
color_intensity
od280/od315_of_diluted_wines
alcohol
PCA降维可视化二维PCA图清晰地展示了三个类别的分离情况,说明这些化学特征确实能够有效区分不同类别的葡萄酒。
通过这个案例实践,我深刻理解了:
数据预处理的重要性:标准化对SVM等算法的性能影响显著
算法选择的影响:不同算法在不同数据集上表现各异,需要实际验证
可视化价值:好的可视化能直观展示模型效果和特征关系
未来改进方向:
尝试更多特征工程方法
实现超参数调优(如使用GridSearchCV)
部署为简单的Web应用
尝试深度学习模型比较效果
相关知识
从鸢尾花到葡萄酒:机器学习分类实战完整指南
机器学习实战第1天:鸢尾花分类任务
机器学习实战:鸢尾花分类
【机器学习】鸢尾花分类:机器学习领域经典入门项目实战
鸢尾花、葡萄酒分类数据集
机器学习入门实战1:鸢尾花分类
从0到1:Python机器学习实战全攻略(8/10)
机器学习项目实战
机器学习(三):感知器算法实现鸢尾花分类项目实战
机器学习:鸢尾花(Iris)分类
网址: 从鸢尾花到葡萄酒:机器学习分类实战完整指南 https://m.huajiangbk.com/newsview2198119.html
上一篇: 癞葡萄的分类 |
下一篇: 【机器学习】任务四:使用贝叶斯算 |