Python实现KNN算法对鸢尾花数据集进行分类
介绍
KNN(K-Nearest-Neighbor)算法是一种非常常用且简单的分类算法之一。它的基本思想是把未知数据的标签与训练集中最邻近的K个数据的标签相比较,得票最多的标签就是未知数据的标签。本文将介绍如何使用Python实现对鸢尾花数据集进行KNN分类。
步骤
- 加载数据
首先,我们需要加载鸢尾花数据集。sklearn库中提供了该数据集,我们可以使用load_iris()函数进行加载。
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data # 特征矩阵
y = iris.target # 标签数组
- 数据预处理
为了保证KNN算法的准确性,我们需要对数据进行预处理。这里我们采用Z-score标准化方法对特征矩阵进行归一化处理。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)
- 分割训练集和测试集
为了避免过拟合,我们需要将数据集分为训练集和测试集。我们使用train_test_split函数来将数据集随机划分成70%的训练集和30%的测试集。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
- 训练模型
现在我们可以开始训练模型了。KNN算法只有一个参数——K值。对于这个参数,我们需要进行调参。在本次实验中,我们使用交叉验证法来训练模型并选择最佳的K值。
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
k_range = range(1, 31)
scores = []
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
score = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy').mean()
scores.append(score)
plt.plot(k_range, scores)
plt.xlabel('K')
plt.ylabel('Accuracy')
plt.show()
运行以上代码后,我们会得到一个准确率随着K值变化的折线图。基于该图,我们可以选择最优的K值作为KNN模型的参数。
- 预测
在得到最优的K值后,我们可以开始对测试集进行预测了。在本次实验中,我们选择K=5进行预测。
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
- 评价模型
最后,我们需要评价模型的准确率。我们可以使用scikit-learn库中的accuracy_score函数来评价模型的准确率。
from sklearn.metrics import accuracy_score
score = accuracy_score(y_test, y_pred)
print('Accuracy:', score)
示例
下面我们给出两个使用Python实现KNN算法的鸢尾花数据集分类示例。
示例一
在此示例中,我们将调节K值,并输出最优的K值和其对应的准确率。完整代码如下:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
iris = load_iris()
X = iris.data
y = iris.target
k_range = range(1, 31)
max_score = 0
max_k = 0
for k in k_range:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
score = accuracy_score(y_test, y_pred)
if score > max_score:
max_score = score
max_k = k
print('The best accuracy:', max_score, 'with the best k:', max_k)
在运行以上代码后,我们会输出最优的K值和其对应的准确率。
示例二
在此示例中,我们将训练KNN模型,并使用该模型对测试集进行预测。完整代码如下:
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
iris = load_iris()
X = iris.data
y = iris.target
scaler = StandardScaler()
X = scaler.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print('Accuracy:', accuracy_score(y_test, y_pred))
在运行以上代码后,我们会输出模型的准确率。
结论
本文介绍了如何使用Python实现对鸢尾花数据集进行KNN分类,并给出了两个具体实现示例。KNN算法简单、易于理解,它虽然不如其他一些机器学习算法精度高,但在某些问题上表现出色。我们可以通过模型调优和数据预处理等手段来提高算法的准确性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python KNN算法实现鸢尾花数据集分类 - Python技术站