Kaggle入门——使用scikit-learn解决DigitRecognition问题

@author: wepon

@blog: http://blog.csdn.net/u012162613

1、scikit-learn简介

scikit-learn是一个基于NumPy、SciPy、Matplotlib的开源机器学习工具包,采用Python语言编写,主要涵盖分类、

回归和聚类等算法,例如knn、SVM、逻辑回归、朴素贝叶斯、随机森林、k-means等等诸多算法,官网上代码和文档

都非常不错,对于机器学习开发者来说,是一个使用方便而强大的工具,节省不少开发时间。

scikit-learn官网指南:http://scikit-learn.org/stable/user_guide.html

上一篇文章《大数据竞赛平台—Kaggle入门》  我分两部分内容介绍了Kaggle,在第二部分中,我记录了解决Kaggle上的竞赛项目DigitRecognition的整个过程,当时我是用自己写的kNN算法,尽管自己写歌kNN算法并不会花很多时间,但是当我们想尝试更多、更复杂的算法,如果每个算法都自己实现的话,会很浪费时间,这时候scikit-learn就发挥作用了,我们可以直接调用scikit-learn的算法包。当然,对于初学者来说,最好还是在理解了算法的基础上,来调用这些算法包,如果有时间,自己完整地实现一个算法相信会让你对算法掌握地更深入。
OK,话休絮烦,下面进入第二部分。

2、使用scikit-learn解决DigitRecognition

我发现自己很喜欢用DigitRecognition这个问题来练习分类算法,因为足够简单。如果你还不知道DigitRecognition问题是什么,请先简单了解一下:Kaggle DigitRecognition ,在我上一篇文章中也有描述:《大数据竞赛平台—Kaggle入门》 。下面我使用scikit-learn中的算法包kNN(k近邻)、SVM(支持向量机)、NB(朴素贝叶斯)来解决这个问题,解决问题的关键步骤有两个:1、处理数据。2、调用算法。

(1)处理数据

这一部分与上一篇文章《大数据竞赛平台—Kaggle入门》 中第二部分的数据处理是一样的,本文不打算重复,下面只简单地罗列各个函数及其功能,在本文最后部分也有详细的代码。
[python] view plaincopy
  1. def loadTrainData():
  2. #这个函数从train.csv文件中获取训练样本:trainData、trainLabel
  3. def loadTestData():
  4. #这个函数从test.csv文件中获取测试样本:testData
  5. def toInt(array):
  6. def nomalizing(array):
  7. #这两个函数在loadTrainData()和loadTestData()中被调用
  8. #toInt()将字符串数组转化为整数,nomalizing()归一化整数
  9. def loadTestResult():
  10. #这个函数加载测试样本的参考label,是为了后面的比较
  11. def saveResult(result,csvName):
  12. #这个函数将result保存为csv文件,以csvName命名

“处理数据”部分,我们从train.csv、test.csv文件中获取了训练样本的feature、训练样本的label、测试样本的feature,在程序中我们用trainData、trainLabel、testData表示。

(2)调用scikit-learn中的算法

kNN算法
[python] view plaincopy
  1. #调用scikit的knn算法包
  2. from sklearn.neighbors import KNeighborsClassifier
  3. def knnClassify(trainData,trainLabel,testData):
  4. knnClf=KNeighborsClassifier()#default:k = 5,defined by yourself:KNeighborsClassifier(n_neighbors=10)
  5. knnClf.fit(trainData,ravel(trainLabel))
  6. testLabel=knnClf.predict(testData)
  7. saveResult(testLabel,'sklearn_knn_Result.csv')
  8. return testLabel

kNN算法包可以自己设定参数k,默认k=5,上面的comments有说明。

更加详细的使用,推荐上官网查看:http://scikit-learn.org/stable/modules/neighbors.html

SVM算法
[python] view plaincopy
  1. #调用scikit的SVM算法包
  2. from sklearn import svm
  3. def svcClassify(trainData,trainLabel,testData):
  4. svcClf=svm.SVC(C=5.0) #default:C=1.0,kernel = 'rbf'. you can try kernel:‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
  5. svcClf.fit(trainData,ravel(trainLabel))
  6. testLabel=svcClf.predict(testData)
  7. saveResult(testLabel,'sklearn_SVC_C=5.0_Result.csv')
  8. return testLabel

SVC()的参数有很多,核函数默认为'rbf'(径向基函数),C默认为1.0

更加详细的使用,推荐上官网查看:http://scikit-learn.org/stable/modules/svm.html

朴素贝叶斯算法
[python] view plaincopy
  1. #调用scikit的朴素贝叶斯算法包,GaussianNB和MultinomialNB
  2. from sklearn.naive_bayes import GaussianNB      #nb for 高斯分布的数据
  3. def GaussianNBClassify(trainData,trainLabel,testData):
  4. nbClf=GaussianNB()
  5. nbClf.fit(trainData,ravel(trainLabel))
  6. testLabel=nbClf.predict(testData)
  7. saveResult(testLabel,'sklearn_GaussianNB_Result.csv')
  8. return testLabel
  9. from sklearn.naive_bayes import MultinomialNB   #nb for 多项式分布的数据
  10. def MultinomialNBClassify(trainData,trainLabel,testData):
  11. nbClf=MultinomialNB(alpha=0.1)      #default alpha=1.0,Setting alpha = 1 is called Laplace smoothing, while alpha < 1 is called Lidstone smoothing.
  12. nbClf.fit(trainData,ravel(trainLabel))
  13. testLabel=nbClf.predict(testData)
  14. saveResult(testLabel,'sklearn_MultinomialNB_alpha=0.1_Result.csv')
  15. return testLabel

上面我尝试了两种朴素贝叶斯算法:高斯分布的和多项式分布的。多项式分布的函数有参数alpha可以自设定。

更加详细的使用,推荐上官网查看:http://scikit-learn.org/stable/modules/naive_bayes.html
使用方法总结: 

第一步:首先确定使用哪种分类器,这一步可以设置各种参数,比如:
[python] view plaincopy
  1. svcClf=svm.SVC(C=5.0)
第二步:接这个分类器要使用哪些训练数据?调用fit方法,比如:
[python] view plaincopy
  1. svcClf.fit(trainData,ravel(trainLabel))

fit(X,y)说明:

X:  对应trainData
array-like, shape = [n_samples, n_features],X是训练样本的特征向量集,n_samples行n_features列,即每个训练样本占一行,每个训练样本有多少特征就有多少列。
y:  对应trainLabel
array-like, shape = [n_samples],y必须是一个行向量,这也是上面为什么使用numpy.ravel()函数的原因。
第三步:使用分类器预测测试样本,比如:
[python] view plaincopy
  1. testLabel=svcClf.predict(testData)

调用predict方法。

第四步:保存结果,这一步是取决于我们解决问题的要求,因为本文以DigitRecognition为例,所以有:
[python] view plaincopy
  1. saveResult(testLabel,'sklearn_SVC_C=5.0_Result.csv')

(3)make a submission

上面基本就是整个开发过程了,下面看一下各个算法的效果,在Kaggle上make a submission

knn算法的效果,准确率95.871%
朴素贝叶斯,alpha=1.0,准确率81.043%
SVM,linear核,准确率93.943%

3、工程文件

CSDN下载:Kaggle 入门-使用scikit-learn解决DigitRecoginition
Github:https://github.com/wepe/Kaggle-Solution
贴一下代码:
[python] view plaincopy
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. Created on Tue Dec 16 21:59:00 2014
  5. @author: wepon
  6. @blog:http://blog.csdn.net/u012162613
  7. """
  8. from numpy import *
  9. import csv
  10. def toInt(array):
  11. array=mat(array)
  12. m,n=shape(array)
  13. newArray=zeros((m,n))
  14. for i in xrange(m):
  15. for j in xrange(n):
  16. newArray[i,j]=int(array[i,j])
  17. return newArray
  18. def nomalizing(array):
  19. m,n=shape(array)
  20. for i in xrange(m):
  21. for j in xrange(n):
  22. if array[i,j]!=0:
  23. array[i,j]=1
  24. return array
  25. def loadTrainData():
  26. l=[]
  27. with open('train.csv') as file:
  28. lines=csv.reader(file)
  29. for line in lines:
  30. l.append(line) #42001*785
  31. l.remove(l[0])
  32. l=array(l)
  33. label=l[:,0]
  34. data=l[:,1:]
  35. return nomalizing(toInt(data)),toInt(label)  #label 1*42000  data 42000*784
  36. #return trainData,trainLabel
  37. def loadTestData():
  38. l=[]
  39. with open('test.csv') as file:
  40. lines=csv.reader(file)
  41. for line in lines:
  42. l.append(line)#28001*784
  43. l.remove(l[0])
  44. data=array(l)
  45. return nomalizing(toInt(data))  #  data 28000*784
  46. #return testData
  47. def loadTestResult():
  48. l=[]
  49. with open('knn_benchmark.csv') as file:
  50. lines=csv.reader(file)
  51. for line in lines:
  52. l.append(line)#28001*2
  53. l.remove(l[0])
  54. label=array(l)
  55. return toInt(label[:,1])  #  label 28000*1
  56. #result是结果列表
  57. #csvName是存放结果的csv文件名
  58. def saveResult(result,csvName):
  59. with open(csvName,'wb') as myFile:
  60. myWriter=csv.writer(myFile)
  61. for i in result:
  62. tmp=[]
  63. tmp.append(i)
  64. myWriter.writerow(tmp)
  65. #调用scikit的knn算法包
  66. from sklearn.neighbors import KNeighborsClassifier
  67. def knnClassify(trainData,trainLabel,testData):
  68. knnClf=KNeighborsClassifier()#default:k = 5,defined by yourself:KNeighborsClassifier(n_neighbors=10)
  69. knnClf.fit(trainData,ravel(trainLabel))
  70. testLabel=knnClf.predict(testData)
  71. saveResult(testLabel,'sklearn_knn_Result.csv')
  72. return testLabel
  73. #调用scikit的SVM算法包
  74. from sklearn import svm
  75. def svcClassify(trainData,trainLabel,testData):
  76. svcClf=svm.SVC(C=5.0) #default:C=1.0,kernel = 'rbf'. you can try kernel:‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
  77. svcClf.fit(trainData,ravel(trainLabel))
  78. testLabel=svcClf.predict(testData)
  79. saveResult(testLabel,'sklearn_SVC_C=5.0_Result.csv')
  80. return testLabel
  81. #调用scikit的朴素贝叶斯算法包,GaussianNB和MultinomialNB
  82. from sklearn.naive_bayes import GaussianNB      #nb for 高斯分布的数据
  83. def GaussianNBClassify(trainData,trainLabel,testData):
  84. nbClf=GaussianNB()
  85. nbClf.fit(trainData,ravel(trainLabel))
  86. testLabel=nbClf.predict(testData)
  87. saveResult(testLabel,'sklearn_GaussianNB_Result.csv')
  88. return testLabel
  89. from sklearn.naive_bayes import MultinomialNB   #nb for 多项式分布的数据
  90. def MultinomialNBClassify(trainData,trainLabel,testData):
  91. nbClf=MultinomialNB(alpha=0.1)      #default alpha=1.0,Setting alpha = 1 is called Laplace smoothing, while alpha < 1 is called Lidstone smoothing.
  92. nbClf.fit(trainData,ravel(trainLabel))
  93. testLabel=nbClf.predict(testData)
  94. saveResult(testLabel,'sklearn_MultinomialNB_alpha=0.1_Result.csv')
  95. return testLabel
  96. def digitRecognition():
  97. trainData,trainLabel=loadTrainData()
  98. testData=loadTestData()
  99. #使用不同算法
  100. result1=knnClassify(trainData,trainLabel,testData)
  101. result2=svcClassify(trainData,trainLabel,testData)
  102. result3=GaussianNBClassify(trainData,trainLabel,testData)
  103. result4=MultinomialNBClassify(trainData,trainLabel,testData)
  104. #将结果与跟给定的knn_benchmark对比,以result1为例
  105. resultGiven=loadTestResult()
  106. m,n=shape(testData)
  107. different=0      #result1中与benchmark不同的label个数,初始化为0
  108. for i in xrange(m):
  109. if result1[i]!=resultGiven[0,i]:
  110. different+=1
  111. print different

Kaggle入门——使用scikit-learn解决DigitRecognition问题相关推荐

  1. 机器学习与Scikit Learn学习库

    摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn. 在我科研的时候,机器学习(ML)是计算机科学领域中最 ...

  2. kaggle 入门_Kaggle入门:房价竞争

    kaggle 入门 Founded in 2010, Kaggle is a Data Science platform where users can share, collaborate, and ...

  3. Scikit Learn: 在python中机器学习

    Warning 警告:有些没能理解的句子,我以自己的理解意译. 翻译自:Scikit Learn:Machine Learning in Python 作者: Fabian Pedregosa, Ga ...

  4. Kaggle入门,看这一篇就够了

    转载地址:https://zhuanlan.zhihu.com/p/25686876 之前发表了这篇关于 Kaggle 的专栏,旨在帮助对数据科学( Data Science )有兴趣的同学们更好的了 ...

  5. [转载]Scikit Learn: 在python中机器学习

    原址:http://my.oschina.net/u/175377/blog/84420 目录[-] Scikit Learn: 在python中机器学习 载入示例数据 一个改变数据集大小的示例:数码 ...

  6. kaggle 入门:逻辑回归应用之Kaggle泰坦尼克之灾

    经典又兼具备趣味性的Kaggle案例泰坦尼克号问题 kaggle入门--逻辑回归应用之kaggle泰坦尼克之灾 原文连接:https://blog.csdn.net/han_xiaoyang/arti ...

  7. 关于Kaggle入门,看这一篇就够了

    这次酝酿了很久想给大家讲一些关于Kaggle那点儿事,帮助对数据科学(Data Science)有兴趣的同学们更好的了解这个项目,最好能亲身参与进来,体会一下学校所学的东西和想要解决一个实际的问题所需 ...

  8. 关于Kaggle入门

    博客转载至:https://blog.csdn.net/bbbeoy/article/details/73274931 这次酝酿了很久想给大家讲一些关于Kaggle那点儿事,帮助对数据科学(Data ...

  9. Kaggle入门和学习资源

    官网:https://www.kaggle.com/ 转载自:https://zhuanlan.zhihu.com/p/25686876 也可以看看:https://zhuanlan.zhihu.co ...

  10. 【scikit-learn】如何用Python和SciKit Learn 0.18实现神经网络

    本教程的代码和数据来自于 Springboard 的博客教程.本文的作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:https://g ...

最新文章

  1. Open***异地机房互连以及负载均衡高可用解决方案
  2. 基于Android的红外测温设计,基于Android的红外三维重构移动APP设计与实现
  3. c语言中return的作用_C语言入门基础整理
  4. java count 在哪一类里_java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用...
  5. 踩内存是什么意思啊_abs防抱死制动系统是什么意思?
  6. python 时间模块 time datetime calendar
  7. win32开发(对话框启动)
  8. wordpress如何配置两个header。php_WordPress入门|WordPress建站详细流程
  9. 判断手机是否支持闪光灯的
  10. usb转rj45_超薄本也能有线上网,只需一个USB转网口小工具
  11. HCIE-RS--路由器交换机做整形的区别
  12. ubuntu 下安装 phpmyadmin 过程记录
  13. 使用晨曦记账本记账,将账目明细导出excel表格上
  14. Arduino下LCD1602综合探究(下)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法
  15. 一文读懂中国5G的真正实力
  16. css骨架图,【CSS】骨架屏 Skeleton 效果
  17. Android的在线考试app
  18. 耐人思考的“30秒法则”
  19. promethuesa监控 告警(二)
  20. idea 导入halo报错

热门文章

  1. 从零开始学安全(二十三)●用PHP编写留言板
  2. 1月10日云栖精选夜读:专访金榕:四年蜕变,阿里iDST是如何登上浪潮之巅的?...
  3. Engineer05
  4. 利用ESXI-Customizer制作定制化的ESXI
  5. 如何测试一个数组是否包含指定的值
  6. MySQL查看数据库、表的占用空间大小
  7. [Win32]创建模态窗口
  8. 在Style Report中制作主从分级报表
  9. 晓月antivirV8P绿色汉化扫描自由版
  10. LINUX中错误 SELinux is disabled