使用Python实现基于KNN的鸢尾花分类
机器学习是当今技术领域中一个热门的话题,它在许多实际应用中都有广泛的应用。本文将介绍如何使用Python和Scikit-learn库来实现一个简单的机器学习模型——K近邻算法(K-Nearest Neighbors, KNN),并将其应用于经典的鸢尾花数据集进行分类任务。
K近邻算法简介
K近邻算法是一种监督学习算法,其基本思想是:对于一个待分类样本,在训练集中找到与它最近的K个邻居,然后根据这K个邻居的类别来进行投票,选择票数最多的类别作为该样本的预测类别。距离度量通常采用欧氏距离等方法。
KNN算法具有简单易懂、无需训练的优点,但它也有一些缺点,例如当数据量很大时计算效率较低,对异常值敏感等。
鸢尾花数据集
鸢尾花数据集(Iris dataset)是机器学习领域中非常经典的数据集之一。它包含了150个样本,分为3个类别(山鸢尾、变色鸢尾和维吉尼亚鸢尾),每个类别有50个样本。每个样本有4个特征,分别是萼片长度、萼片宽度、花瓣长度和花瓣宽度。
我们可以通过以下代码加载鸢尾花数据集:
from sklearn.datasets import load_irisiris = load_irqs()X = iris.data # 特征矩阵y = iris.target # 标签向量
为了更好地理解数据,我们可以查看数据集的一些基本信息:
print(iris.DESCR) # 打印数据集描述信息print(X.shape) # 查看特征矩阵的形状print(y.shape) # 查看标签向量的形状
数据预处理
(一)划分训练集和测试集
为了评估模型的性能,我们需要将数据集划分为训练集和测试集。训练集用于训练模型,测试集用于评估模型在未见过的数据上的表现。这里我们将数据集按照7:3的比例划分为训练集和测试集。
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
其中test_size=0.3
表示测试集占总数据集的30%,random_state=42
用于保证每次运行代码时划分结果相同,方便复现实验结果。
(二)标准化
由于不同特征的取值范围可能差异较大,为了提高KNN算法的性能,我们通常需要对数据进行标准化处理。标准化的目标是使每个特征的均值为0,方差为1。
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)
构建KNN模型
使用Scikit - learn库中的KNeighborsClassifier
类可以很方便地构建KNN模型。下面的代码创建了一个KNN分类器,并设置了K值为3(即每个样本的3个最近邻居参与投票)。
from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier(n_neighbors=3)knn.fit(X_train_scaled, y_train)
模型评估
(一)准确率
准确率是最常用的评估分类模型性能的指标之一,它表示预测正确的样本数占总样本数的比例。
from sklearn.metrics import accuracy_scorey_pred = knn.predict(X_test_scaled)accuracy = accuracy_score(y_test, y_pred)print(f"Accuracy: {accuracy:.2f}")
(二)混淆矩阵
混淆矩阵可以更详细地展示模型在各个类别上的预测情况。行表示真实类别,列表示预测类别,矩阵中的元素表示属于某一真实类别但被预测为另一类别的样本数量。
from sklearn.metrics import confusion_matriximport seaborn as snsimport matplotlib.pyplot as pltcm = confusion_matrix(y_test, y_pred)sns.heatmap(cm, annot=True, fmt='d')plt.xlabel('Predicted')plt.ylabel('True')plt.show()
优化K值
K值的选择对KNN算法的性能有很大影响。较小的K值可能导致过拟合,较大的K值可能导致欠拟合。我们可以通过交叉验证的方法来寻找最优的K值。
from sklearn.model_selection import cross_val_scoreks = range(1, 31)cv_scores = []for k in ks: knn = KNeighborsClassifier(n_neighbors=k) scores = cross_val_score(knn, X_train_scaled, y_train, cv=5, scoring='accuracy') cv_scores.append(scores.mean())optimal_k = ks[cv_scores.index(max(cv_scores))]print(f"Optimal K value: {optimal_k}")plt.plot(ks, cv_scores)plt.xlabel('K')plt.ylabel('Cross - validated Accuracy')plt.show()
通过上述代码,我们可以绘制出不同K值对应的交叉验证准确率曲线,从而确定最优的K值。
总结
本文介绍了如何使用Python和Scikit - learn库实现基于KNN的鸢尾花分类。从数据加载、预处理到模型构建和评估,再到K值的优化,涵盖了整个机器学习建模流程。虽然这是一个相对简单的例子,但它为我们理解机器学习的基本概念和技术提供了很好的入门指导。在实际应用中,我们还需要考虑更多因素,如特征选择、模型融合等,以进一步提高模型的性能。