13.1 分类实战:鸢尾花品种分类
Scikit-learn教程:鸢尾花分类实战与完整项目流程解析
本章节通过Scikit-learn实战项目,详细介绍鸢尾花品种分类的完整流程,包括数据解析、预处理、多分类算法训练、模型评估与调优,帮助初学者掌握分类任务的基础实现方法。
分类实战:鸢尾花品种分类
欢迎来到Scikit-learn教程的实战章节!本章将带你通过一个经典的机器学习项目——鸢尾花品种分类,系统地学习分类任务的基础流程。鸢尾花数据集是机器学习入门的最佳实践,因为它简单、清晰,适合新手快速上手。我们将从项目需求出发,一步步解析数据、预处理、训练模型、评估调优,最后总结整个流程。这不仅是一个技术演练,更是你掌握分类任务核心技能的关键一步。
项目需求与数据解析
在开始任何机器学习项目前,明确项目需求至关重要。本项目目标:使用鸢尾花的特征(如花萼长度、宽度等)预测其品种(如Setosa、Versicolor、Virginica)。这是一个典型的多分类问题,因为品种有三个类别。
首先,我们来解析数据。Scikit-learn内置了鸢尾花数据集,使用它非常方便。通过load_iris()函数加载数据,它会返回一个包含特征矩阵和目标向量的对象。特征矩阵有150个样本,每个样本4个特征(花萼和花瓣的长度与宽度);目标向量有3个类别标签。解析数据后,我们可以初步查看数据分布和统计信息,确保数据质量良好。例如,使用iris.data获取特征,iris.target获取标签,并用pandas或简单打印来检查。
代码示例(Python):
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
X = iris.data # 特征矩阵
y = iris.target # 目标向量
df = pd.DataFrame(X, columns=iris.feature_names)
df['species'] = y
print(df.head())
print("特征形状:", X.shape)
print("类别分布:", pd.Series(y).value_counts())
解析数据显示,数据均衡,特征值在合理范围内,没有缺失值,这简化了后续处理。
数据预处理与特征工程(简单标准化)
数据预处理是提升模型性能的关键步骤。对于鸢尾花数据,特征值具有不同量纲(例如,长度单位),直接使用可能导致某些算法(如SVM)偏好大数值特征。因此,我们采用简单标准化(Standardization),将特征缩放为均值为0、方差为1的标准正态分布。
Scikit-learn的StandardScaler类能轻松实现这一点。标准化不仅加速算法收敛,还提高模型稳定性。我们先将数据分为训练集和测试集,然后对训练集进行标准化,并用同样的变换应用到测试集,以避免数据泄露。
步骤:
- 使用
train_test_split划分数据(例如,80%训练,20%测试)。 - 用
StandardScaler拟合训练集特征。 - 转换训练集和测试集特征。
代码示例:
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
标准化后,特征值范围一致,模型训练更高效。
多分类算法训练(逻辑回归 / SVM / 随机森林)
现在进入核心环节:训练多分类模型。我们将介绍三种常用算法——逻辑回归(Logistic Regression)、支持向量机(SVM)和随机森林(Random Forest),并展示如何在Scikit-learn中实现。
- 逻辑回归:尽管名为回归,但它广泛用于分类任务。Scikit-learn的
LogisticRegression默认支持多分类(使用OvR策略)。适合线性可分数据。 - 支持向量机(SVM):通过核函数处理非线性边界。使用
SVC类,对于多分类,内部使用一对一或一对多策略。 - 随机森林:基于决策树的集成方法,能处理复杂模式且不易过拟合。
RandomForestClassifier天生支持多分类。
我们将分别训练这些模型,使用标准化后的训练数据,并保持简单配置以便比较。
代码示例:
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
models = {
'Logistic Regression': LogisticRegression(random_state=42),
'SVM': SVC(random_state=42),
'Random Forest': RandomForestClassifier(random_state=42)
}
for name, model in models.items():
model.fit(X_train_scaled, y_train)
print(f"{name} 训练完成")
每个模型都有其优势和适用场景,后续评估将帮助选择最佳模型。
模型评估与调优(交叉验证 + 网格搜索)
训练模型后,评估其性能至关重要。我们使用准确率作为主要指标,但多分类问题也需考虑混淆矩阵等。首先,用测试集进行初步评估。
初步评估:
from sklearn.metrics import accuracy_score
for name, model in models.items():
y_pred = model.predict(X_test_scaled)
acc = accuracy_score(y_test, y_pred)
print(f"{name} 测试集准确率: {acc:.2f}")
为了优化模型,我们采用交叉验证和网格搜索。交叉验证(如5折交叉验证)减少过拟合风险,网格搜索自动寻找最佳超参数。
- 交叉验证:使用
cross_val_score评估模型稳定性。 - 网格搜索:用
GridSearchCV探索参数组合,例如SVM的C和kernel参数。
示例以SVM调优:
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
grid_search = GridSearchCV(SVC(random_state=42), param_grid, cv=5)
grid_search.fit(X_train_scaled, y_train)
print("最佳参数:", grid_search.best_params_)
print("最佳交叉验证得分:", grid_search.best_score_)
通过调优,模型性能可能提升,并选出最适合该数据的算法。
项目总结:分类任务基础流程落地
恭喜你完成鸢尾花分类实战!本章节通过一个完整项目,演示了分类任务的基础流程:
- 需求明确:设定分类目标。
- 数据解析:加载和检查数据。
- 预处理:标准化特征以优化训练。
- 模型训练:尝试多种算法,比较初步效果。
- 评估调优:使用交叉验证和网格搜索提升模型。
关键点:
- 数据预处理(如标准化)是模型成功的基础。
- 多分类问题中,算法选择需考虑数据特性和复杂度。
- 评估与调优确保模型泛化能力,避免过拟合。
对于初学者,这个流程是机器学习项目的通用模板。鸢尾花数据集虽简单,但原理可扩展到更复杂场景。继续实践,探索更多算法和技巧,逐步提升你的Scikit-learn技能!
在后续章节,我们将深入高级主题,如特征选择、模型集成等。保持学习,机器学习之路越走越宽。