由于选修了数据挖掘课程,课程作业是完成Kaggle上的一个比赛,所以在机缘巧合下就知道了Kaggle这个平台,事实上我认为这是用来练手数据挖掘的一个绝佳场所。这篇文章适合和我一样刚接触Kaggle的朋友,对于已经熟悉这个平台的朋友,欢迎指出我的错误,必定虚心受教。本文分为两个部分,第一部分简单介绍在上面完成比赛的流程,第二部分以手写数字识别为例子详细描述完成比赛的整个过程。
1、Kaggle简介
Kaggle是一个数据分析的竞赛平台,网址:https://www.kaggle.com/首先进入Kaggle网站,注册登陆后拉下来会看到进行中的比赛
其中对于我们新手而言更关心的是101练习赛先用来熟悉整个流程
点击digit Recognizer进入比赛,我们可以看到主要有三个部分是我们关心的,比赛介绍,数据获取和提交答案,如下图是刚点击进去就能够看到的比赛描述
点击Get the data跳转到一下页面就可以获取数据
点击Make a submission就会跳转到提交界面,在此界面点击click or drop your submission here,将我们跑出来的答案文件上传,再点击submit提交即可,然后就会跳转到排名版(learder board),我们就可以看到自己的排名以及准确率了。
关于比赛的细节:
1、我们下载得到的数据都是csv格式的数据,因为最后只需要提交结果,所以这中间我们使用任何语言任何算法都是可以的,没有任何限制
2、初始数据中训练集是有Label的,而测试数据是没有Label的,我们要做的是用训练集来训练模型,然后推测出测试集每个元组的Label,这些推测出来的Label组成的文件就是我们最后要提交的文件,必须以规定的形式,而且必须是csv格式。
3、系统会从最终数据中选25%的数据作为初评,也就是我们一提交看到的准确率和排名都是根据这25%的数据得出的。准确率的计算时,比如10个Label你的预测对了9个,那么准确率就是90%。并不是初评排名高就好,因为比赛结束后终评是使用剩下的75%的数据进行评测,所以最后准确率还是有可能有很大的变化。
2、竞赛项目解题全过程
(2)Digit Recognition解题过程
def toInt(array):
array=mat(array)
m,n=shape(array)
newArray=zeros((m,n))
for i in xrange(m):
for j in xrange(n):
newArray[i,j]=int(array[i,j])
return newArray
def nomalizing(array):
m,n=shape(array)
for i in xrange(m):
for j in xrange(n):
if array[i,j]!=0:
array[i,j]=1
return array
def loadTrainData():
l=[]
with open('train.csv') as file:
lines=csv.reader(file)
for line in lines:
l.append(line) #42001*785
l.remove(l[0])
l=array(l)
label=l[:,0]
data=l[:,1:]
return nomalizing(toInt(data)),toInt(label) #label 1*42000 data 42000*784
#return trainData,trainLabel
由于从文件中读出的Label是字符,所以我们需要将它转化为数字(toInt函数)。另外,我们都知道图像可以表示成灰度矩阵,而题目给我们的数据就是手写数字图像的灰度矩阵,对于灰度级我们是不关心的,即我们不关心字迹的深浅,我们关心的是字的有无,所以可以使用二值化的方法对原始数据进行处理(nomalizing函数)。def loadTestData():
l=[]
with open('test.csv') as file:
lines=csv.reader(file)
for line in lines:
l.append(line)#28001*784
l.remove(l[0])
data=array(l)
return nomalizing(toInt(data)) # data 28000*784
#return testData
有了训练集和测试集的数据,下一步就是用训练集训练模型并预测测试集。调用sklearn库的随机森林函数,建立分类器nbClf,参数n_estimators是设置决策树的棵数,一般不要小于100,然后用fit函数训练,用predict函数预测,则testLable是一个28000行的数组,每行存储对应的Label。from sklearn.ensemble import RandomForestClassifier
def RFClassify(trainData,trainLabel,testData):
nbClf=RandomForestClassifier(n_estimators=100)
nbClf.fit(trainData,ravel(trainLabel))
testLabel=nbClf.predict(testData)
saveResult(testLabel,'RF_Result.csv')
return testLabel
最后一步就是将数据写入csv文件,注意并不能直接每行一个数字这样地写,要按照要求的格式,即添加第一行的属性名,还有添加一列序号,调用saveResult进行写入def saveResult(result,csvName):
with open(csvName,'wb') as myFile:
myWriter=csv.writer(myFile)
myWriter.writerow(["ImageId","Label"])
index=0;
for i in result:
tmp=[]
index=index+1
tmp.append(index)
tmp.append(i)
#tmp.append(int(i))
myWriter.writerow(tmp)
将得到的csv文件提交上去后得到的准确率是0,为什么呢?首先看一下文件内部