from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import matplotlib.pyplot as plt
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# //////////////////k 折交叉验证选择 K 值的代码示例///////////////////
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# # 初始化K值范围
# k_values = range(1, 31)
# cv_scores = []
# # 进行k折交叉验证(这里使用5折交叉验证)
# for k in k_values:
# knn = KNeighborsClassifier(n_neighbors=k)
# scores = cross_val_score(knn, X_train, y_train, cv=5, scoring='accuracy')
# cv_scores.append(scores.mean())
# # 找到最优K值
# best_k = k_values[np.argmax(cv_scores)]
# print(f"最优的K值为: {best_k}")
# 绘制K值与交叉验证得分的关系图
# plt.rcParams['font.family'] = ['sans-serif']
# plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
# plt.rcParams['axes.unicode_minus'] = False
# plt.plot(k_values, cv_scores)
# plt.xlabel('K值')
# plt.ylabel('交叉验证平均准确率')
# plt.title('K值对交叉验证准确率的影响')
# plt.show()
# /////////////////////////////////////////////////////////////////
# //////////////////////////////////////
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 初始化KNN分类器,这里设置K值为5
knn = KNeighborsClassifier(n_neighbors=5)
# 使用训练集训练模型
knn.fit(X_train, y_train)
# 使用训练好的模型对测试集进行预测
y_pred = knn.predict(X_test)
# 计算模型在测试集上的准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型的准确率为: {accuracy}")
# 生成分类报告,包含精确率、召回率、F1值等指标
print("分类报告:\n", classification_report(y_test, y_pred))
# 生成混淆矩阵
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))
# /////////////////////////////////////////////////////////////////