分析K近邻算法的错误率
K近邻算法(K-Nearest Neighbors,KNN)是一种基本的机器学习算法,也是一种分类和回归方法。它的原理很简单,即根据特征相似度来进行分类或回归预测。K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一。
在KNN算法中,首先需要给定一个训练集,其中包含了已知分类标签的样本数据。然后,通过计算待预测样本与训练集中各个样本的特征距离,选择与待预测样本最相似的K个训练样本(即K个最近邻),并根据这K个并据这K个最近邻样本的分类标签来对待预测样本进行分类或回归预测。
对于分析K近邻算法的错误率,我们对于不同K值(从1到20),在Iris和sonar数据集上分别训练K近邻分类器,并计算错误率。因为Iris数据集相对简单,特征维度较低且类别之间有较好的可分性,所以K近邻算法可以相对容易的正确分类样本,这使得在Iris数据集上K近邻算法错误率为0。所以,我们可以使用交叉验证法,多次划分数据集进行训练和验证。
代码实现:
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
path=r"C:\Users\lenovo\Downloads\connectionist+bench+sonar+mines+vs+rocks\sonar.all-data"

加载Iris数据集

def load_iris_data():
iris = load_iris()
#iris.data包含特征数据
X = iris.data
#iris.target包含目标类别标签
y = iris.target
return X,y

加载sonar数据集

def load_sonar_data():
data = pd.read_csv(path, header=None, sep=‘,’)
#切除最后一列的所有列作为特征X
X = data.iloc[:, :-1].values
#取最后一列作为目标类别标签y
y = data.iloc[:, -1].values
return train_test_split(X, y, test_size=0.3, random_state=42)#数据切分

#k折交叉验证方法判断Iris数据集下错误率
def analyze_cross_validation_error_rate(X, y, k):
#创建一个K近邻分类器对象,n_neighbors=k,表示K值为k
knn = KNeighborsClassifier(n_neighbors=k)
#使用交叉验证方法评估模型,cross_val_score函数会将数据分成cv=5份
#依次用其中一份作为验证集,其余部分作为训练集,对模型进行评估,返回每次评估的得分
scores = cross_val_score(knn, X, y, cv=5)#5折交叉验证
#计算错误率,1减去平均得分得到错误率
error_rate = 1 - scores.mean()
return error_rate

def analyze_knn_error_rate(X_train, X_test, y_train, y_test, k=3):
#创建一个K近邻分类器对象,n_neighbors=k表示K值为k
knn = KNeighborsClassifier(n_neighbors=k)
#使用训练集训练K近邻分类器
knn.fit(X_train, y_train)
#使用训练好的分类器对测试集进行预测
y_pred = knn.predict(X_test)
#计算错误率,1-accuracy_score(y_test,y_pred),其中accuracy_score是计算准确率的函数
error_rate = 1 - accuracy_score(y_test, y_pred)
return error_rate

if name == “main”:
# 分析不同 k 值下在 Iris 数据集上的错误率
#调用load_iris_data函数加载iris数据集并划分为训练集和测试集
X,y =load_iris_data()
#创建一个包含1到20的整数序列,表示不同K值
k_values_iris = range(1, 21)
#对于每一个K值,调用analyze_cross_validation_error_rate函数计算错误率,并存储在列表中
error_rates_iris = [analyze_cross_validation_error_rate(X, y, k) for k in k_values_iris]

# 分析不同 k 值下在 Sonar 数据集上的错误率
X_train_sonar, X_test_sonar, y_train_sonar, y_test_sonar = load_sonar_data()
k_value_iris = range(1, 21)

#对于每一个K值,调用analyze_cross_validation_error_rate函数计算错误率,并存储在列表中
error_rates_iris = [analyze_cross_validation_error_rate(X, y, k) for k in k_values_iris]

分析不同 k 值下在 Sonar 数据集上的错误率

X_train_sonar, X_test_sonar, y_train_sonar, y_test_sonar = load_sonar_data()
k_values_sonar = range(1, 21)
error_rates_sonar = [analyze_knn_error_rate(X_train_sonar, X_test_sonar, y_train_sonar, y_test_sonar, k) for k in k_values_sonar]

绘制错误率曲线

plt.figure(figsize=(12, 6))
plt.plot(k_values_iris, error_rates_iris, label=‘Iris Dataset’)
plt.plot(k_values_sonar, error_rates_sonar, label=‘Sonar Dataset’)
plt.xlabel(‘K Value’)
plt.ylabel(‘Error Rate’)
plt.title(‘Error Rate vs K Value for KNN on Iris and Sonar Datasets’)
plt.legend()
plt.savefig(‘knn_error_rate.png’)
plt.show()
运行结果:

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐