昨天对数据进行预处理后发现准确率和最佳k值都未发生变化,肯定是某个环节出了问题,于是对代码进行了修正。修正后的代码,数据在正则化,归一化,标准化后,准确率与最佳k值均发生了变化。bug修复成功。
#导入numpy,pandas,knn分类算法和训练集与测试集的切分工具
import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
#读取数据,不要header(标头),用空格分割每种特征
data = pd.read_csv('./datingTestSet2.txt',header = None,sep ='\t')
#将data转为可用的array,原为dataframe
dataArray = np.array(data)
#分割特征与目标变量
X = dataArray[:,0:3]
y = dataArray[:,3]
#定义一个函数,在随机切分的同时选择不同的k值,以确定最佳k值。返回最佳k值与最佳k值下的准确率。
def begin(a,b):
X_train,X_test,y_train,y_test = train_test_split(a,b)
score = 0
k = 0
for i in range(1,22):
knn = KNeighborsClassifier(n_neighbors=i)
knn.fit(X_train,y_train)
ks = knn.score(X_test,y_test)
if ks > score:
score = ks
k = i
return k,score
#print('最佳k值为:',k,'。准确率为:',score)
#重复多次以求平均准确率与最佳k值(最佳k值即为出现次数最多的k值)
sc = 0
l = []
for i in range(0,100):
begin(X,y)
sc+=score
l.append(k)
print('平均正确率为:',sc/100)
print('最佳k值为:',max(l, key=l.count))
此时的结果为:
平均正确率为: 0.8198399999999999
最佳k值为: 19
#标准化数据
#导入数据预处理模块
from sklearn import preprocessing
#标准化数据
X_scaled = preprocessing.scale(X)
#重复多次以求平均准确率与最佳k值(最佳k值即为出现次数最多的k值)
sc = 0
l = []
for i in range(0,100):
k,score = begin(X_scaled,y)
sc+=score
l.append(k)
print('平均正确率为:',sc/100)
print('最佳k值为',max(l, key=l.count))
标准化后的结果为:
平均正确率为: 0.9601999999999997
最佳k值为: 3
#归一化数据
min_max_scaler = preprocessing.MinMaxScaler()
X_minmax = min_max_scaler.fit_transform(X)
sc = 0
l = []
for i in range(0,100):
k,score = begin(X_minmax,y)
sc+=score
l.append(k)
print('平均正确率为:',sc/100)
print('最佳k值为',max(l, key=l.count))
归一化后的结果为:
平均正确率为: 0.9583999999999996
最佳k值为 3
X_normalized = preprocessing.normalize(X, norm='l2')
sc = 0
l = []
for i in range(0,100):
k,score = begin(X_normalized,y)
sc+=score
l.append(k)
print('平均正确率为:',sc/100)
print('最佳k值为:',max(l, key=l.count))
正则化后的结果为:
平均正确率为: 0.8131600000000002
最佳k值为 11
准确率甚至比未处理还要低,很明显此数据不适合正则化。