本文代码主要是为了练习Kaggle流程,精确度不高。
main.py
1 #encoding:utf-8 2 from functions import * 3 from sklearn import neighbors 4 5 #读取训练集数据 6 trainData,trainLabel=readTrainData('train.csv') 7 #读取测试集数据 8 testData=readTestData('test.csv') 9 10 #KNN算法中的k值,即最近邻的个数 11 n_neighbors=5 12 #KNN算法的加权的两种方式 13 weights=['uniform', 'distance'] 14 #定义一个knn算法 15 clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights[1]) 16 #训练模型 17 clf.fit(trainData,trainLabel) 18 #将模型应用于测试集 19 testLabel=clf.predict(testData) 20 #测试结果输出为Kaggle要求的格式 21 getResult(testLabel)
functions.py
1 #encoding:utf-8 2 import numpy as np 3 import pandas as pd 4 from pandas import Series,DataFrame 5 6 #定义读取训练集数据的函数,该函数将训练数据集中的项和标签分开 7 def readTrainData(fileName): 8 #读取训练数据集 9 df=pd.read_csv(fileName) 10 11 #训练数据集的第一列为标签列,此时为Series数据结构 12 trainLabel=df['label'] 13 #将Series转换为ndarray数据结构,长度为42000,每一个ndarray项为一个0~9的数字 14 trainLabel=trainLabel.values 15 16 #删除训练数据集的标签列,余下的为训练数据集,42000*784 17 del df['label'] 18 #此时df仍为DataFrame数据结构,所以在此时对df进行简化处理 19 #简化函数定义见后面代码 20 df=simplify(df) 21 #将训练数据集从DataFrame数据结构转换为ndarray数据结构, 22 #长度为42000,每一个ndarray项为一个长度为784的list 23 trainData=df.values 24 return trainData,trainLabel 25 26 27 def readTestData(fileName): 28 #读取测试数据集 29 df=pd.read_csv(fileName) 30 #对训练集进行了简化处理,要对测试集进行同样的处理 31 df=simplify(df) 32 #测试数据集由于没有标签列, 33 #所以直接将测试数据集从DataFrame数据结构转换为ndarray数据结构 34 testData=df.values 35 return testData 36 37 #为了减少模型训练时的计算量,可以对测试数据项和训练数据项进行简化处理 38 #思想:由于是识别字迹,所以是什么颜色不是重点,重点是RGB值是0或不是0 39 #所以,将非0的值都设置为1 40 #注意:传入的数据格式为DataFrame格式 41 def simplify(data): 42 #DataFrame的applymap方法,对元素进行函数应用 43 data=data.applymap(returnOneOrZero) 44 return data 45 46 #将非0的值替换为1,注意要return 0,否则结果0所在的位置都会变成NaN 47 def returnOneOrZero(num): 48 if num: 49 return 1 50 else: 51 return 0 52 53 54 def getResult(testLabel): 55 #通过scikit-learn得到的测试标签为ndarray格式,将其转换为Series数据结构 56 testLabel=Series(testLabel) 57 #加表头ImageId和Label。即第一列为ImageId列,第二列为Label,np.arange要加1 58 df={'ImageId':np.arange(28000)+1,'Label':testLabel} 59 #将df转换为DataFrame数据结构 60 df=DataFrame(df) 61 #讲结果输出到csv格式的文本中 62 df.to_csv('result.csv',index=False)
analysis.py
1 # -*- coding: utf-8 -*- 2 import pandas as pd 3 def getDiff(benchmark,result,test): 4 list=[] 5 for i in range(28000): 6 if benchmark['Label'][i]==result['Label'][i]: 7 list.append(i) 8 benchmark=benchmark.drop(list) 9 result=result.drop(list) 10 test=test.drop(list) 11 test['Label_right']=benchmark['Label'] 12 test['Label_wrong']=result['Label'] 13 return test 14 16 benchmark=pd.read_csv('rf_benchmark.csv') 17 result=pd.read_csv('result.csv') 18 test=pd.read_csv('test.csv') 19 errorAnalysis=getDiff(benchmark,result,test) 20 print len(errorAnalysis) 21 errorAnalysis.to_csv('errorAnalysis.csv',index=False)