前言
kNN的玩法强化练习一下。
数据集准备
here。
数据集处理读取
说是Cross-validation文件,不过我也只是把它当训练测试集用,前面有一些不需要读取的数据可以删掉:
再看数据部分:
可以看到每个数字图片为32x32的大小,最后一行是其标签。
读取数据集:
def file2matrix(filename):
f = open(filename)
arrayOfLines = f.readlines()
numberOfLines = len(arrayOfLines)
assert numberOfLines % 33 == 0
numberOfDigits = int(numberOfLines / 33)
myMat = zeros((numberOfDigits, 1024))
labels = []
for x in range(numberOfDigits):
for y in range(32):
for z in range(32):
myMat[x, 32 * y + z] = int(arrayOfLines[x * 33 + y][z])
labels.append(arrayOfLines[x * 33 + 32].strip())
return myMat, labels
归一化就不用做了,然后分割训练测试,因为文本中的数据原本就是乱序,所以直接取前70%做训练集:
trainRatio = 0.7
myMat, labels = file2matrix("E:/dataSet/kNN/optdigits-orig.cv")
numberOfMat = myMat.shape[0]
numberForTrain = int(trainRatio * numberOfMat)
numberForTest = numberOfMat - numberForTrain
kNN = KNeighborsClassifier(8)
kNN.fit(myMat[:numberForTrain], labels[:numberForTrain])
predictResult = kNN.predict(myMat[numberForTrain:])
errorCount = 0
index = 0
for result in predictResult:
print("the classifier came back, with: %d, the real answer is: %d" % (predictResult[index] ,labels[numberForTrain + index]))
if (predictResult[index] != labels[numberForTrain + index]):
errorCount += 1.0
index += 1
print("the total error rate is: %f" % (errorCount / float(numberForTest)))
最后结果:
大概有95.8%的准确率,还行。
后记
这个数据集有900多个样本,kNN处理速度还行。