尝试在代码框执行以下代码:
(1)必要模块、库、数据集导入
#1. 导入所需要的模块和库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import MinMaxScaler
plt.style.use('ggplot')
#2. 建立数据集
data = load_breast_cancer()
X = data.data
y = data.target
X_train,X_test,y_train,y_test = train_test_split(X,y,# 特征和标签
test_size=0.3,random_state=420) # 测试集所占的比例
(2)参数调整过程「交叉验证&学习曲线」
#3. 数据归一化处理
minmax = MinMaxScaler() #实例化
minmax.fit(X_train)
X_train_minmax = minmax.transform(X_train) # 用训练集上的极小值和极差归一化训练集
X_test_minmax = minmax.transform(X_test) # 用训练集上的极小值和极差归一化测试集
#4. 绘制学习曲线
# 设置四个列表保存生成的评估结果
train_score_list = []
test_score_list = []
score = []
var = []
# 循环不断改变k值, 重新建模 , 重新训练, 然后评估
# k = 1- 20
for k in range(1, 21):
# 实例化
knn = KNeighborsClassifier(n_neighbors=k,weights='distance')
# 采用训练集进行训练
knn.fit(X_train_minmax, y_train)
# 评估模型
# 可以评估模型在训练集上的表现情况
train_score_list.append(knn.score(X_train_minmax, y_train))
# 评估在测试集上的表现情况
test_score_list.append(knn.score(X_test_minmax, y_test))
# 交叉验证平均分数
cross = cross_val_score(knn, X_train_minmax, y_train, cv=5)
score.append(cross.mean()) # 每次交叉验证返回的得分数组,再求数组均值
var.append(cross.var())
#5. 绘制成折线图
# 绘制成折线图
plt.figure(dpi=200)
plt.plot(range(1, 21), train_score_list, label='train_score');
plt.plot(range(1, 21), test_score_list, label='test_score');
plt.plot(range(1, 21), score, color='g',label='cross_score');
plt.plot(range(1, 21),np.array(score)+np.array(var)*2,c='red',linestyle='--')
plt.plot(range(1, 21),np.array(score)-np.array(var)*2,c='red',linestyle='--')
plt.xlabel('k_value')
plt.ylabel('socre')
plt.legend();
输出为:
#6. 评估模型在训练集的最优得分
max(score)
输出为:0.9672784
#7. 求最大值对应的k值
np.argmax(score)+1 # argmax找出最大值的索引值
输出为:9
(3)建立模型并输出结果
#8. 使用确定的参数完成最终建模
knn_final = KNeighborsClassifier(n_neighbors=9)
knn_final.fit(X_train_minmax, y_train)
# 输出预测得分
knn_final.score(X_test_minmax, y_test)
# 输出预测分类结果
knn_final.predict(X_test_minmax)
根据运行代码,尝试输出: 输出预测得分