代码如下:
import random
from sklearn import datasets #导入数据集
from sklearn.neighbors import KNeighborsClassifier as KNN #导入KNN模型
from sklearn.model_selection import train_test_split #导入数据分离包 用法:X_train,X_test, y_train, y_test = train_test_split(train_data, train_target, test_size, random_state, shuffle)
import numpy
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
data=datasets.load_breast_cancer()
#print(data)
#key=data.keys()
#print(key) #dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
sample=data['data']
#print(sample)
#print(sample.shape)#(569, 30) 一共569行 每行数据都有30个特征
#print(data['target'])
target=data['target']
#print(data['target_names'])#['malignant' 'benign']三种类型分别对应:0,1
b={0:'malignant',1:'benign'}#简单构造一个类型和标签对应的字典,为了后面使用的方便
#数据分离
traindata,testdata,traintarget,testtarget = train_test_split(sample,target,test_size=0.1,random_state=2020)
print(traindata.shape)#(512, 30)
print(testdata.shape)#(57, 30)
#调用KNN模型
knn=KNN(n_neighbors=10) #k值设为10
knn.fit(traindata,traintarget)#使用训练集数据训练模型 traindata:训练集的特征数据,特征数据的维度必须是二维 traintarget:训练集的标签数据,一维的
pred=knn.predict(testdata) #利用训练的模型预测结果
print('测数据集预测的结果:',pred)
print('真实的结果:',testtarget)
print('预测训练集的结果与训练集真实结果相比的准确度:',knn.score(traindata,traintarget))#0.939453125
print('预测测试集的结果与测试集真实结果相比的准确度:',knn.score(testdata,testtarget))#0.9473684210526315
#预测数据
arr = [[random.randint(1, 100) for _ in range(30)]]
a=arr
print(a)
a=numpy.array(a)
print(knn.predict(a))
print(b[knn.predict(a)[0]])
#优化思路一:交叉验证
pre=[]
k=[]
for i in range(10,13):
knn=KNN(n_neighbors=i)
pr=cross_val_score(knn,traindata,traintarget,cv=10).mean()
#print(pr)
pre.append(pr)
k.append(i)
# print(pre)
# print(k)
plt.plot(k,pre)
plt.show()
#经过优化,当k值为11时,样本准确率最高,取k=11
knn=KNN(n_neighbors=11) #k值设为4
knn.fit(traindata,traintarget)#使用训练集数据训练模型 traindata:训练集的特征数据,特征数据的维度必须是二维 traintarget:训练集的标签数据,一维的
pred=knn.predict(testdata) #利用训练的模型预测结果
print('测数据集预测的结果:',pred)
print('真实的结果:',testtarget)
print('预测训练集的结果与训练集真实结果相比的准确度:',knn.score(traindata,traintarget))#0.93359375
print('预测测试集的结果与测试集真实结果相比的准确度:',knn.score(testdata,testtarget))#0.9298245614035088
#果然k折交叉验证的得到的k值,只能说是对未知数据最优k值的一个,估计值,仅仅只是作为一个参考数值
#优化思路二:更改训练集和测试集的占比
x=[0.1,0.2,0.3,0.4,0.5,0.6,0.7]
pre1=[]
for y in x:
traindata1,testdata1,traintarget1,testtarget1 = train_test_split(sample,target,test_size=y,random_state=2020)
print(traindata1.shape)
print(testdata1.shape)
#调用KNN模型
knn1=KNN(n_neighbors=10) #k值设为10
knn1.fit(traindata1,traintarget1)#使用训练集数据训练模型 traindata:训练集的特征数据,特征数据的维度必须是二维 traintarget:训练集的标签数据,一维的
pred1=knn.predict(testdata1) #利用训练的模型预测结果
#print('测数据集预测的结果:',pred1)
#print('真实的结果:',testtarget1)
#print(knn1.score(traindata1,traintarget1))#预测训练集的结果与训练集真实结果相比的准确度
print(knn1.score(testdata1,testtarget1))
pre1.append(knn1.score(testdata1,testtarget1))
print(pre1)
plt.plot(x,pre1)
plt.show()
#由图可知测试集占比为0.1,k=10时最好 准确率为0.9473684210526315
优化方法一的图
优化方法二的图:
本次只是直接使用knn解决二分类问题,只给代码其余不多加赘述,若想了解具体如何使用,可点击kNN算法的快速使用及其代码实现(sklearn鸢尾花数据集实战)