大数据竞赛平台——Kaggle 入门

From:http://blog.csdn.net/u012162613/article/details/41929171



大数据竞赛平台——Kaggle 入门篇



这篇文章适合那些刚接触Kaggle、想尽快熟悉Kaggle并且独立完成一个竞赛项目的网友,对于已经在Kaggle上参赛过的网友来说,大可不必耗费时间阅读本文。本文分为两部分介绍Kaggle,第一部分简单介绍Kaggle,第二部分将展示解决一个竞赛项目的全过程。如有错误,请指正!


1、Kaggle简介

Kaggle是一个数据分析的竞赛平台,网址:https://www.kaggle.com/

企业或者研究者可以将数据、问题描述、期望的指标发布到Kaggle上,以竞赛的形式向广大的数据科学家征集解决方
案,类似于KDD-CUP(国际知识发现和数据挖掘竞赛)。Kaggle上的参赛者将数据下载下来,分析数据,然后运用机
器学习、数据挖掘等知识,建立算法模型,解决问题得出结果,最后将结果提交,如果提交的结果符合指标要求并且在参赛者中排名第一,将获得比赛丰厚的奖金。更多内容可以参阅:大数据众包平台

下面我以图文的形式介绍Kaggle:

进入Kaggle网站:


这是当前正在火热进行的有奖比赛,有冠军杯形状的是“Featured”,译为“号召”,召集数据科学高手去参赛。下面那个灰色的有试剂瓶形状的是“Research”,奖金少一点。这两个类别的比赛是有奖竞赛,难度自然不小,作为入门者,应该先做练习赛:



左图的比赛是“101”,右图的是“Playground”,都是练习赛,适合入门。入门Kaggle最好的方法就是独立完成101和playground这两个级别的竞赛项目。本文的第二部分将选101中的“Digit Recognition”作为讲解。

点击进入赛题“Digit Recognition


这是一个识别数字0~9的练习赛,“Competition Details“是这个比赛的描述,说明参赛者需要解决的问题。”Get the Data“是数据下载,参赛者用这些数据来训练自己的模型,得出结果,数据一般都是以csv格式给出:



其中,train.csv就是训练样本,test.csv就是测试样本,由于这个是训练赛,所以还提供了两种解决方案,knn_benchmark.R和rf_benchmark.R,前者是用R语。言写的knn算法程序,后者是用R语言写的随机森林算法程序,它们的结果分别是knn_benchmark.csv和rf_benchmark.csv。关于csv格式文件,我前一篇文章有详述:【Python】csv模块的使用。

得出结果后,接下来就是提交结果”Make a submission“


要求提交的文件是csv格式的,假如你将结果保存在result.csv,那么点击”Click or drop submission here“,选中result.csv文件上传即可,系统将测试你提交的结果的准确率,然后排名。

另外,除了“Competition Details“、”Get the Data“、”Make a submission“,侧边栏的”Home“、”Information“、"Forum"等,也提供了关于竞赛的一些相关信息,包括排名、规则、辅导......

【以上是第一部分,暂且写这么多,有补充的以后再更】


2、竞赛项目解题全过程

(1)知识准备


首先,想解决上面的题目,还是需要一点ML算法的基础的,另外就是要会用编程语言和相应的第三方库来实现算法,常用的有:
Python以及对应的库numpy、scipy、scikit-learn(实现了ML的一些算法,可以直接用)、theano(DeepLearning的算法包)。
R语言、weka
如果用到深度学习的算法,cuda、caffe也可以用
总之,使用什么编程语言、什么平台、什么第三方库都无所谓,无论你用什么方法,Kaggle只需要你线上提交结果,线下你如何实现算法是没有限制的。

Ok,下面讲解题过程,以”Digit Recognition“为例,数字识别这个问题我之前写过两篇文章,分别用kNN算法和Logistic算法去实现,有完整的代码,有兴趣可以阅读:kNN算法实现数字识别、 Logistic回归实现数字识别


(2)Digit Recognition解题过程


下面我将采用kNN算法来解决Kaggle上的这道Digit Recognition训练题。上面提到,我之前用kNN算法实现过,这里我将直接copy之前的算法的核心代码,核心代码是关于kNN算法的主体实现,我不再赘述,我把重点放在处理数据上。

以下工程基于Python、numpy

  • 获取数据

从”Get the Data“下载以下三个csv文件:


  • 分析train.csv数据

train.csv是训练样本集,大小42001*785,第一行是文字描述,所以实际的样本数据大小是42000*785,其中第一列的每一个数字是它对应行的label,可以将第一列单独取出来,得到42000*1的向量trainLabel,剩下的就是42000*784的特征向量集trainData,所以从train.csv可以获取两个矩阵trainLabel、trainData。

下面给出代码,另外关于如何从csv文件中读取数据,参阅:csv模块的使用


[python] view plain copy
  1. def loadTrainData():  
  2.     l=[]  
  3.     with open('train.csv') as file:  
  4.          lines=csv.reader(file)  
  5.          for line in lines:  
  6.              l.append(line) #42001*785  
  7.     l.remove(l[0])  
  8.     l=array(l)  
  9.     label=l[:,0]  
  10.     data=l[:,1:]  
  11.     return nomalizing(toInt(data)),toInt(label)  

这里还有两个函数需要说明一下,toInt()函数,是将字符串转换为整数,因为从csv文件读取出来的,是字符串类型的,比如‘253’,而我们接下来运算需要的是整数类型的,因此要转换,int(‘253’)=253。toInt()函数如下:

[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  



nomalizing()函数做的工作是归一化,因为train.csv里面提供的表示图像的数据是0~255的,为了简化运算,我们可以将其转化为二值图像,因此将所有非0的数字,即1~255都归一化为1。nomalizing()函数如下:

[python] view plain copy
  1. def nomalizing(array):  
  2.     m,n=shape(array)  
  3.     for i in xrange(m):  
  4.         for j in xrange(n):  
  5.             if array[i,j]!=0:  
  6.                 array[i,j]=1  
  7.     return array  



  • 分析test.csv数据

test.csv里的数据大小是28001*784,第一行是文字描述,因此实际的测试数据样本是28000*784,与train.csv不同,没有label,28000*784即28000个测试样本,我们要做的工作就是为这28000个测试样本找出正确的label。所以从test.csv我们可以得到测试样本集testData,代码如下:

[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)  
  7.      #28001*784  
  8.     l.remove(l[0])  
  9.     data=array(l)  
  10.     return nomalizing(toInt(data))    


  • 分析knn_benchmark.csv

前面已经提到,由于digit recognition是训练赛,所以这个文件是官方给出的参考结果,本来可以不理这个文件的,但是我下面为了对比自己的训练结果,所以也把knn_benchmark.csv这个文件读取出来,这个文件里的数据是28001*2,第一行是文字说明,可以去掉,第一列表示图片序号1~28000,第二列是图片对应的数字。从knn_benchmark.csv可以得到28000*1的测试结果矩阵testResult,代码:

[python] view plain copy
  1. def loadTestResult():  
  2.     l=[]  
  3.     with open('knn_benchmark.csv') as file:  
  4.          lines=csv.reader(file)  
  5.          for line in lines:  
  6.              l.append(line)  
  7.      #28001*2  
  8.     l.remove(l[0])  
  9.     label=array(l)  
  10.     return toInt(label[:,1])  


到这里,数据分析和处理已经完成,我们获得的矩阵有:trainData、trainLabel、testData、testResult


  • 算法设计
这里我们采用kNN算法来分类,核心代码:
[python] view plain copy
  1. def classify(inX, dataSet, labels, k):  
  2.     inX=mat(inX)  
  3.     dataSet=mat(dataSet)  
  4.     labels=mat(labels)  
  5.     dataSetSize = dataSet.shape[0]                    
  6.     diffMat = tile(inX, (dataSetSize,1)) - dataSet     
  7.     sqDiffMat = array(diffMat)**2  
  8.     sqDistances = sqDiffMat.sum(axis=1)                    
  9.     distances = sqDistances**0.5  
  10.     sortedDistIndicies = distances.argsort()              
  11.     classCount={}                                        
  12.     for i in range(k):  
  13.         voteIlabel = labels[0,sortedDistIndicies[i]]  
  14.         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1  
  15.     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)  
  16.     return sortedClassCount[0][0]  

关于这个函数,参考:kNN算法实现数字识别

简单说明一下,inX就是输入的单个样本,是一个特征向量。dataSet是训练样本,对应上面的trainData,labels对应trainLabel,k是knn算法选定的k,一般选择0~20之间的数字。这个函数将返回inX的label,即图片inX对应的数字。
对于测试集里28000个样本,调用28000次这个函数即可。

  • 保存结果
kaggle上要求提交的文件格式是csv,上面我们得到了28000个测试样本的label,必须将其保存成csv格式文件才可以提交,关于csv,参考:【Python】csv模块的使用
代码:
[python] view plain copy
  1. def saveResult(result):  
  2.     with open('result.csv','wb') as myFile:      
  3.         myWriter=csv.writer(myFile)  
  4.         for i in result:  
  5.             tmp=[]  
  6.             tmp.append(i)  
  7.             myWriter.writerow(tmp)  


  • 综合各函数

上面各个函数已经做完了所有需要做的工作,现在需要写一个函数将它们组合起来解决digit recognition这个题目。我们写一个handwritingClassTest函数,运行这个函数,就可以得到训练结果result.csv。


[python] view plain copy
  1. def handwritingClassTest():  
  2.     trainData,trainLabel=loadTrainData()  
  3.     testData=loadTestData()  
  4.     testLabel=loadTestResult()  
  5.     m,n=shape(testData)  
  6.     errorCount=0  
  7.     resultList=[]  
  8.     for i in range(m):  
  9.          classifierResult = classify(testData[i], trainData, trainLabel, 5)  
  10.          resultList.append(classifierResult)  
  11.          print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, testLabel[0,i])  
  12.          if (classifierResult != testLabel[0,i]): errorCount += 1.0  
  13.     print "\nthe total number of errors is: %d" % errorCount  
  14.     print "\nthe total error rate is: %f" % (errorCount/float(m))  
  15.     saveResult(resultList)  

运行这个函数,可以得到result.csv文件:


2 0 9 9 3 7 0 3.......就是每个图片对应的数字。与参考结果knn_benchmark.csv比较一下:


28000个样本中有1004个与kknn_benchmark.csv中的不一样。错误率为3.5%,这个效果并不好,原因是我并未将所有训练样本都拿来训练,因为太花时间,我只取一半的训练样本来训练,即上面的结果对应的代码是:


[python] view plain copy
  1. classifierResult = classify(testData[i], trainData[0:20000], trainLabel[0:20000], 5)  

训练一半的样本,程序跑了将近70分钟(在个人PC上)。


  • 提交结果
将result.csv整理成kknn_benchmark.csv那种格式,即加入第一行文字说明,加入第一列的图片序号,然后make a submission,结果准确率96.5%:





下载工程代码:github地址

【完】


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

俄罗斯智库 | 人工智能在军事领域的发展现状及应用前景

本文来自:知远战略与防务研究所原文来自:俄罗斯外交和国防政策委员会网站人工智能在军事领域的发展现状及应用前景本文主要介绍了当今世界及俄罗斯本国人工智能技术发展的现状以及未来该技术在军事领域的应用前景,文章还重点分析了人工智能技…

Internet Explorer 8 使用技巧(3):安全上网

如何上网更安全? 听说过“网络钓鱼”吗?最简单的例子:有不法分子模仿真实的银行网站做了个一模一样的,然后通过邮件或其他方式骗你登录并输入银行账号和密码,结果信息泄露,钱被盗走——这就是最典型的“钓鱼…

java 常量折叠_深入理解Java虚拟机之早期编译器优化

Javac编译器Javac编译器是一个由Java语言编写的程序Javac的源码与调试从Sun Javac的代码来看,编译器大致分为3个过程:解析与填充符号表的过程插入式注解处理器的注解处理过程分析与字节码生成的过程Javac编译动作的入口为com.sun.tools.javac.main.JavaC…

Spring Data JPA 从入门到精通~JpaRepository介绍

从 JpaRepository 开始的子类,都是 Spring Data 项目对 JPA 实现的封装与扩展。JpaRepository 本身继承 PagingAndSortingRepository 接口,是针对 JPA 技术的接口,提供 flush()、saveAndFlush()、deleteInBatch()、deleteAllInBatch() 等方法…

深入理解程序从编译到运行

From:http://blog.chinaunix.net/uid-22327815-id-3540305.html 从 Hello World 说程序运行机制:http://www.sohu.com/a/132798003_505868 C/C 中如何在 main() 函数之前执行一条语句?:https://www.zhihu.com/question/26031933 …

技术力量 | 社会计算与计算社会: 智慧社会的基础与必然

来源:智慧城市决策参考摘要:基于社会计算,智慧社会可充分利用开放流动的大数据资源, 综合协调人、地、事、物和组织等各种要素, 形成信息对称、权利对等、扁平化组织的社会结构, 推动传统社会管理模式向分布式、集约化、信息化、智能化、全响…

php关闭当前页_php如何直接关闭页面注销SESSION

php如何直接关闭页面注销SESSION发布时间:2020-07-09 09:03:06来源:亿速云阅读:100作者:Leah这篇文章将为大家详细讲解有关php如何直接关闭页面注销SESSION,文章内容质量较高,因此小编分享给大家做个参考&a…

ELF格式文件符号表全解析及readelf命令使用方法

From:http://blog.csdn.net/yasi_xi/article/details/45197583 readelf命令:http://man.linuxde.net/readelf ELF文件格式解析:https://www.2cto.com/kf/201605/511370.html ELF文件格式解析:http://blog.csdn.net/earbao/arti…

Spring Data JPA 从入门到精通~QueryByExampleExecutor的使用

QueryByExampleExecutor 的使用 按示例查询(QBE)是一种用户友好的查询技术,具有简单的接口,它允许动态查询创建,并且不需要编写包含字段名称的查询。从 UML 图中,可以看出继承 JpaRepository 接口后&#…

谷歌大脑提出对智能体进行「正向-反向」强化学习训练,加速训练过程

原文来源:arXiv作者:Ashley D. Edwards、Laura Downs、James C. Davidson「雷克世界」编译:嗯~是阿童木呀、KABUDA、EVA在强化学习问题中,关于任务目标的制定,往往需要开发人员花费很多的精力,在本文中&…

Linux二进制实用工具Binutils工具集解析()

From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/software/binutils/ GNU Binutils详解:http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.html 交叉…

Spring Data JPA 从入门到精通~JpaSpecificationExecutor的使用方法

JpaSpecificationExecutor 源码和 API 我们也可以通过 idea 工具详细看其用法和实现类,JpaSpecificationExecutor 是 Repository 要继承的接口,而 SimpleJpaRepository 是其默认实现。而通过源码来看其提供的 API 比较简单、明了,有如下几个方…

谷歌人工智能野心:从“下围棋”开始走向商用赚钱

来源:腾讯科技作为人工智能研发的领先企业,谷歌已经开始从技术研发走向了产品商用,创造营收成为一个新目标。谷歌在人工智能领域进行研发的时间比较长,陆续收购了优秀的专业公司。鉴于此,谷歌获得了先发优势&#xff0…

Linux异步之信号(signal)机制分析

From:http://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html From:http://kenby.iteye.com/blog/1173862 Linux下的信号详解及捕捉信号:http://www.jb51.net/article/90695.htm linux信号详解:http://blog.csdn.net/f…

DeepMind集成AI智能体架构「MERLIN」:基于目标导向智能体中的无监督预测记忆

来源:arXiv摘要:在自然界中,动物往往会执行目标导向的行为,尽管它们的传感器的范围有限。作者:Greg Wayne、 Chia-Chun Hung、David Amos、Mehdi Mirza、Arun Ahuja、Agnieszka Grabska-Barwinska、Jack Rae、Piotr Mi…

手机反编译java源码,Android反编译(一)之反编译JAVA源码

Android反编译(一)之反编译JAVA源码[目录]1、工具2、反编译步骤步骤1:把apk文件后缀名改为.zip步骤2:解压zip包得到classes.dex步骤3:将Dex反编译为Jar包(工具:dex2jar)命令: CMD>dex2jar.bat classes.dex步骤4:用j…

一文详解计算机视觉的广泛应用:网络压缩、视觉问答、可视化、风格迁移等

作者 | 张皓(南京大学)来源:人工智能头条丨公众号引言深度学习目前已成为发展最快、最令人兴奋的机器学习领域之一,许多卓有建树的论文已经发表,而且已有很多高质量的开源深度学习框架可供使用。然而,论文通…

Linux-进程、进程组、作业、会话、控制终端详解

From:http://www.cnblogs.com/JohnABC/p/4079669.html Linux进程优先级的处理--Linux进程的管理与调度(二十二):http://blog.csdn.net/gatieme/article/details/51719208 进程 、进程组、会话、控制终端之间的关系:http://blog.csdn.net/y…

浅谈项目开发现状(一)

在现在的软件开发中,一些大的软件公司有充分的资金,所以他的公司人员组织架构能组成:需求分析团队(为了更好的了解用户的完整需求)--->研发团队(通过计算机语言来实现用户需求),方…

波士顿咨询:2018最具创新力企业50强

来源:前瞻网在波士顿咨询公司评选的2018年最具创新力公司中,有11家公司——其中包括前10名中的7家——都是“数字原住民”,按定义也就是“数字创新者”。榜单上大多数公司已经将数字技术建立在他们的创新计划中。这一趋势在各个行业都很普遍&…