好的,我们来构建一个KNN分类器并评估其在MNIST数据集上的性能。
首先,我们需要导入必要的库和数据集:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
# 加载MNIST数据集
mnist = fetch_openml('mnist_784', version=1)
X = mnist.data.astype('float32')
y = mnist.target.astype('int')
# 将像素值缩放到0-1之间
X /= 255.0
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
接下来,我们可以定义一个函数来实现KNN分类器:
def knn_classifier(X_train, y_train, X_test, k):
distances = []
# 计算测试样本与每个训练样本之间的欧氏距离
for i in range(len(X_test)):
dists = np.sqrt(np.sum((X_train - X_test[i])**2, axis=1))
distances.append(dists)
# 将距离排序,并获取k个最近邻样本的索引
indices = np.argsort(distances)[:, :k]
# 获取k个最近邻对应的标签
knn_labels = y_train[indices]
# 统计每个测试样本最常见的标签作为预测结果
y_pred = np.array([np.argmax(np.bincount(labels)) for labels in knn_labels])
return y_pred
接下来,我们可以使用不同的K值进行训练和测试,并找到在测试集上准确率最高的K值:
k_values = [1, 3, 5, 7, 9] # 不同的K值
accuracy_scores = []
for k in k_values:
# 使用KNN分类器进行预测
y_pred = knn_classifier(X_train, y_train, X_test, k)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
accuracy_scores.append(accuracy)
# 找到准确率最高的K值
best_k = k_values[np.argmax(accuracy_scores)]
print("最好的K值:", best_k)
最后,我们可以绘制混淆矩阵来评估模型在测试集上的性能:
# 使用最佳K值进行预测
y_pred_best = knn_classifier(X_train, y_train, X_test, best_k)
# 绘制混淆矩阵
confusion_mat = confusion_matrix(y_test, y_pred_best)
plt.imshow(confusion_mat, cmap='Blues')
plt.colorbar()
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.title('Confusion Matrix')
plt.show()
希望以上代码能够满足你的需求。
内容由零声教学AI助手提供,问题来源于学员提问




