Python 机器学习:Scikit-learn 鸢尾花分类
以下是针对“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参数,如使用
- 数学扩展: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实现鸢尾花分类:
- 数据集加载和预处理。
- SVM模型的训练和预测。
- 性能评估(准确率)。 此方法高效可靠,准确率高。如需进一步学习,可探索Scikit-learn文档或尝试其他数据集。
更多推荐
所有评论(0)