《机器学习分类算法:用 Scikit-learn 实现鸢尾花分类》
·
机器学习分类算法:用 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)
典型结果对比:
| 算法 | 准确率 | 混淆矩阵 |
|---|---|---|
| KNN | 97.8% | [[19, 0, 0], [0,13,1], [0,0,12]] |
| SVM | 100% | [[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可实现快速鸢尾花分类:
- SVM在本案例表现最优(准确率100%)
- 特征工程至关重要,花瓣尺寸是主要区分依据
- 超参数调优(如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))
更多推荐
所有评论(0)