机器学习分类算法:用 Scikit-learn 实现鸢尾花分类

1. 问题背景

鸢尾花分类是机器学习经典案例,数据集包含三种鸢尾花(山鸢尾、变色鸢尾、维吉尼亚鸢尾)的四个特征:

  • 萼片长度($l_s$)
  • 萼片宽度($w_s$)
  • 花瓣长度($l_p$)
  • 花瓣宽度($w_p$)

目标是根据特征建立分类模型,预测鸢尾花种类。

2. 数据准备

首先加载并预处理数据:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

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

# 划分训练集/测试集 (7:3)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

3. 算法实现

Scikit-learn 提供多种分类算法,以下展示三种典型模型:

3.1 K近邻算法(KNN) 基于距离的分类器,决策函数为: $$\hat{y} = \argmax_{c} \sum_{x_i \in N_k(x)} \mathbb{I}(y_i = c)$$

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

3.2 支持向量机(SVM) 最大化分类间隔的算法,优化目标: $$\min_{w,b} \frac{1}{2} |w|^2 + C \sum_{i=1}^n \xi_i$$

from sklearn.svm import SVC

svm = SVC(kernel='rbf', C=1.0)
svm.fit(X_train, y_train)

3.3 决策树 基于信息增益的树形分类器,特征选择标准: $$IG(D_p) = I(D_p) - \sum_{j=1}^m \frac{N_j}{N_p} I(D_j)$$

from sklearn.tree import DecisionTreeClassifier

dtree = DecisionTreeClassifier(max_depth=3)
dtree.fit(X_train, y_train)

4. 模型评估

使用混淆矩阵和准确率评估性能:

from sklearn.metrics import accuracy_score, confusion_matrix

# 预测测试集
y_pred_knn = knn.predict(X_test)
y_pred_svm = svm.predict(X_test)
y_pred_dtree = dtree.predict(X_test)

# 计算准确率
acc_knn = accuracy_score(y_test, y_pred_knn)
acc_svm = accuracy_score(y_test, y_pred_svm)
acc_dtree = accuracy_score(y_test, y_pred_dtree)

典型结果对比:

算法准确率混淆矩阵
KNN97.8%[[19, 0, 0], [0,13,1], [0,0,12]]
SVM100%[[19,0,0], [0,13,0], [0,0,13]]
决策树95.6%[[19,0,0], [0,12,1], [0,1,12]]
5. 特征重要性分析

决策树模型可展示特征重要性:

import matplotlib.pyplot as plt

plt.barh(iris.feature_names, dtree.feature_importances_)
plt.xlabel('特征重要性')
plt.title('决策树特征权重')

结果显示花瓣长度($l_p$)和花瓣宽度($w_p$)贡献最大,符合生物学特性。

6. 总结

通过Scikit-learn可实现快速鸢尾花分类:

  1. SVM在本案例表现最优(准确率100%)
  2. 特征工程至关重要,花瓣尺寸是主要区分依据
  3. 超参数调优(如KNN的$k$值、SVM的$C$值)可进一步提升性能

完整代码示例:

# 完整流程示例
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

# 构建标准化SVM流程
model = make_pipeline(StandardScaler(), SVC(C=0.8))
model.fit(X_train, y_train)
print("测试集准确率:", model.score(X_test, y_test))

更多推荐