Kaggle入门

    由于选修了数据挖掘课程,课程作业是完成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) #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,为什么呢?首先看一下文件内部

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

发布了35 篇原创文章 · 获赞 19 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章