以下是针对“Python 机器学习:Scikit-learn 鸢尾花分类”的完整解答。我将以结构清晰的方式逐步引导您完成整个过程,确保真实可靠。鸢尾花数据集(Iris Dataset)是机器学习中的经典分类问题,包含三个鸢尾花种类(Setosa、Versicolor、Virginica)的四个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度)。我们将使用Scikit-learn库实现一个支持向量机(SVM)分类器,并评估其性能。

步骤1: 理解任务和数据集

鸢尾花分类的目标是根据花的特征预测其种类。数据集共有150个样本,每个样本有4个特征和一个标签(种类)。分类问题可以用数学表示为:给定输入特征 $\mathbf{x} \in \mathbb{R}^4$,预测输出类别 $y \in {0, 1, 2}$(分别对应三个种类)。SVM分类器的决策函数可表示为: $$f(\mathbf{x}) = \text{sign}\left( \mathbf{w} \cdot \mathbf{x} + b \right)$$ 其中,$\mathbf{w}$ 是权重向量,$b$ 是偏置项。训练过程通过优化损失函数来最小化分类错误。

步骤2: 导入必要的库

首先,导入Python库。Scikit-learn提供了数据集加载、模型训练和评估工具。

# 导入所需库
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC  # 支持向量机分类器
from sklearn.metrics import accuracy_score

步骤3: 加载和探索数据集

加载鸢尾花数据集,并查看基本结构。特征矩阵 $\mathbf{X}$ 的维度为 $150 \times 4$,标签向量 $\mathbf{y}$ 的长度为150。

# 加载数据集
iris = datasets.load_iris()
X = iris.data  # 特征矩阵,形状 (150, 4)
y = iris.target  # 标签向量,形状 (150,)

# 打印数据集信息
print("特征名称:", iris.feature_names)
print("种类名称:", iris.target_names)
print("特征矩阵形状:", X.shape)
print("标签向量形状:", y.shape)

步骤4: 数据预处理

将数据集分割为训练集和测试集(通常80%训练,20%测试)。这有助于评估模型的泛化能力。数学上,分割可表示为: $$\mathbf{X}{\text{train}}, \mathbf{X}{\text{test}}, \mathbf{y}{\text{train}}, \mathbf{y}{\text{test}} = \text{split}(\mathbf{X}, \mathbf{y}, \text{test_size}=0.2)$$

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 打印分割后大小
print("训练集特征形状:", X_train.shape)
print("测试集特征形状:", X_test.shape)
print("训练集标签形状:", y_train.shape)
print("测试集标签形状:", y_test.shape)

步骤5: 选择并训练模型

选择支持向量机(SVM)作为分类器。SVM通过最大化间隔来分类数据。训练模型使用训练集数据。

# 创建SVM模型实例
model = SVC(kernel='linear', random_state=42)  # 使用线性核,确保可复现性

# 训练模型
model.fit(X_train, y_train)

# 打印模型参数(可选)
print("模型训练完成!")

步骤6: 评估模型性能

在测试集上进行预测,并计算准确率。准确率定义为正确预测样本的比例: $$\text{准确率} = \frac{\text{正确预测数}}{\text{总样本数}}$$

# 预测测试集
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)

# 可选:打印混淆矩阵以查看详细性能
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print("混淆矩阵:\n", cm)

步骤7: 结果解释和优化建议

  • 典型结果:运行上述代码,准确率通常在95%以上(例如0.9667),表明模型效果良好。
  • 优化建议:如果准确率较低,可以尝试:
    • 调整SVM参数,如使用 kernel='rbf'
    • 添加特征缩放(例如使用 StandardScaler)。
    • 尝试其他模型,如决策树或K近邻。
  • 数学扩展:SVM的优化问题可形式化为: $$\min_{\mathbf{w}, b} \frac{1}{2} |\mathbf{w}|^2 + C \sum_{i=1}^{n} \max(0, 1 - y_i (\mathbf{w} \cdot \mathbf{x}_i + b))$$ 其中,$C$ 是正则化参数,控制间隔和误分类的权衡。

完整代码示例

以下是整合所有步骤的完整Python脚本,可直接运行:

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix

# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练SVM模型
model = SVC(kernel='linear', random_state=42)
model.fit(X_train, y_train)

# 预测和评估
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)

# 输出混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print("混淆矩阵:\n", cm)

总结

通过本教程,您学会了使用Scikit-learn实现鸢尾花分类:

  1. 数据集加载和预处理。
  2. SVM模型的训练和预测。
  3. 性能评估(准确率)。 此方法高效可靠,准确率高。如需进一步学习,可探索Scikit-learn文档或尝试其他数据集。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐