KNN算法解决二分类问题(威斯康辛州乳腺癌数据集)

代码如下:

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鸢尾花数据集实战)

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值