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。
- 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)
- l.remove(l[0])
- l=array(l)
- label=l[:,0]
- data=l[:,1:]
- return nomalizing(toInt(data)),toInt(label)
-
由于从文件中读出的Label是字符,所以我们需要将它转化为数字(toInt函数)。另外,我们都知道图像可以表示成灰度矩阵,而题目给我们的数据就是手写数字图像的灰度矩阵,对于灰度级我们是不关心的,即我们不关心字迹的深浅,我们关心的是字的有无,所以可以使用二值化的方法对原始数据进行处理(nomalizing函数)。 然后读取测试集
- def loadTestData():
- l=[]
- with open('test.csv') as file:
- lines=csv.reader(file)
- for line in lines:
- l.append(line)
- l.remove(l[0])
- data=array(l)
- return nomalizing(toInt(data))
-
有了训练集和测试集的数据,下一步就是用训练集训练模型并预测测试集。调用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)
-
- 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