Kaggle入门

来源:互联网 发布:高级程序员php面试 编辑:程序博客网 时间:2024/05/20 09:10

  由于选修了数据挖掘课程,课程作业是完成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、竞赛项目解题全过程

(1)知识准备
    做数据挖掘用的比较多的语言是python和R语言,R语言我没接触过就不做介绍。python有一个很大的好处就是处理csv文件非常方便,而且还有很多ML、DM的库所以还是比较不错的选择。
    主要的几个库是:numpy、scipy、sklearn、theano
    这些库在ubuntu环境下都可以很轻松地用apt-get install numpy这样的指令安装,不推荐使用windows环境,因为本人在windows环境下装遇到了各种各样的问题,所以最终还是弃暗投明~

(2)Digit Recognition解题过程

    由于是第一次做所以不打算设计算法,就简单地使用sklearn库中的随机森林进行简单地建模。
    首先我们需要了解训练集的结构,训练集大小42001*785,第一行是文字描述,所以实际的样本数据大小是42000*785,其中第一列的每一个数字是它对应行的label,可以将第一列单独取出来,得到42000*1的向量trainLabel,剩下的就是42000*784的特征向量集trainData,所以从train.csv可以获取两个矩阵trainLabel、trainData。
[python] view plain copy
  1. def toInt(array):  
  2.     array=mat(array)  
  3.     m,n=shape(array)  
  4.     newArray=zeros((m,n))  
  5.     for i in xrange(m):  
  6.         for j in xrange(n):  
  7.                 newArray[i,j]=int(array[i,j])  
  8.     return newArray  
  9.       
  10. def nomalizing(array):  
  11.     m,n=shape(array)  
  12.     for i in xrange(m):  
  13.         for j in xrange(n):  
  14.             if array[i,j]!=0:  
  15.                 array[i,j]=1  
  16.     return array  
  17.       
  18. def loadTrainData():  
  19.     l=[]  
  20.     with open('train.csv') as file:  
  21.          lines=csv.reader(file)  
  22.          for line in lines:  
  23.              l.append(line) #42001*785  
  24.     l.remove(l[0])  
  25.     l=array(l)  
  26.     label=l[:,0]  
  27.     data=l[:,1:]  
  28.     return nomalizing(toInt(data)),toInt(label)  #label 1*42000  data 42000*784  
  29.     #return trainData,trainLabel  
 由于从文件中读出的Label是字符,所以我们需要将它转化为数字(toInt函数)。另外,我们都知道图像可以表示成灰度矩阵,而题目给我们的数据就是手写数字图像的灰度矩阵,对于灰度级我们是不关心的,即我们不关心字迹的深浅,我们关心的是字的有无,所以可以使用二值化的方法对原始数据进行处理(nomalizing函数)。
  然后读取测试集
[python] view plain copy
  1. def loadTestData():  
  2.     l=[]  
  3.     with open('test.csv') as file:  
  4.          lines=csv.reader(file)  
  5.          for line in lines:  
  6.              l.append(line)#28001*784  
  7.     l.remove(l[0])  
  8.     data=array(l)  
  9.     return nomalizing(toInt(data))  #  data 28000*784  
  10.     #return testData  
  有了训练集和测试集的数据,下一步就是用训练集训练模型并预测测试集。调用sklearn库的随机森林函数,建立分类器nbClf,参数n_estimators是设置决策树的棵数,一般不要小于100,然后用fit函数训练,用predict函数预测,则testLable是一个28000行的数组,每行存储对应的Label。
[python] view plain copy
  1. from sklearn.ensemble import RandomForestClassifier  
  2. def RFClassify(trainData,trainLabel,testData):  
  3.     nbClf=RandomForestClassifier(n_estimators=100)  
  4.     nbClf.fit(trainData,ravel(trainLabel))  
  5.     testLabel=nbClf.predict(testData)  
  6.     saveResult(testLabel,'RF_Result.csv')  
  7.     return testLabel  
  最后一步就是将数据写入csv文件,注意并不能直接每行一个数字这样地写,要按照要求的格式,即添加第一行的属性名,还有添加一列序号,调用saveResult进行写入
[python] view plain copy
  1. def saveResult(result,csvName):  
  2.     with open(csvName,'wb') as myFile:      
  3.         myWriter=csv.writer(myFile)  
  4.         myWriter.writerow(["ImageId","Label"])  
  5.         index=0;  
  6.         for i in result:  
  7.             tmp=[]  
  8.             index=index+1  
  9.             tmp.append(index)  
  10.             tmp.append(i)  
  11.             #tmp.append(int(i))  
  12.             myWriter.writerow(tmp)  
  将得到的csv文件提交上去后得到的准确率是0,为什么呢?首先看一下文件内部

  找到问题了,我们的Label应该是1,2,。。。9,而不是1.0,2.0.。。9.0,所以在写文件的时候把数据类型转成int就可以了。上传后跳转到排行版。由于只是简单地运用模型,以及本问题更适合用bp网络的原因,排名还是很低的。
 
  下载工程代码:Github
  最后:本文参考自http://blog.csdn.net/u012162613/article/details/41929171,对其中的过程进行重新梳理以及对一些细节进行补充,以及提出了自己在做的过程中遇到的一点小问题和解决方法。
0 0
原创粉丝点击