Kaggle入门——使用scikit-learn解决DigitRecognition问题
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
2、使用scikit-learn解决DigitRecognition
(1)处理数据
- def loadTrainData():
- #这个函数从train.csv文件中获取训练样本:trainData、trainLabel
- def loadTestData():
- #这个函数从test.csv文件中获取测试样本:testData
- def toInt(array):
- def nomalizing(array):
- #这两个函数在loadTrainData()和loadTestData()中被调用
- #toInt()将字符串数组转化为整数,nomalizing()归一化整数
- def loadTestResult():
- #这个函数加载测试样本的参考label,是为了后面的比较
- def saveResult(result,csvName):
- #这个函数将result保存为csv文件,以csvName命名
“处理数据”部分,我们从train.csv、test.csv文件中获取了训练样本的feature、训练样本的label、测试样本的feature,在程序中我们用trainData、trainLabel、testData表示。
(2)调用scikit-learn中的算法
- #调用scikit的knn算法包
- from sklearn.neighbors import KNeighborsClassifier
- def knnClassify(trainData,trainLabel,testData):
- knnClf=KNeighborsClassifier()#default:k = 5,defined by yourself:KNeighborsClassifier(n_neighbors=10)
- knnClf.fit(trainData,ravel(trainLabel))
- testLabel=knnClf.predict(testData)
- saveResult(testLabel,'sklearn_knn_Result.csv')
- return testLabel
kNN算法包可以自己设定参数k,默认k=5,上面的comments有说明。
更加详细的使用,推荐上官网查看:http://scikit-learn.org/stable/modules/neighbors.html
- #调用scikit的SVM算法包
- from sklearn import svm
- def svcClassify(trainData,trainLabel,testData):
- svcClf=svm.SVC(C=5.0) #default:C=1.0,kernel = 'rbf'. you can try kernel:‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
- svcClf.fit(trainData,ravel(trainLabel))
- testLabel=svcClf.predict(testData)
- saveResult(testLabel,'sklearn_SVC_C=5.0_Result.csv')
- return testLabel
SVC()的参数有很多,核函数默认为'rbf'(径向基函数),C默认为1.0
更加详细的使用,推荐上官网查看:http://scikit-learn.org/stable/modules/svm.html
- #调用scikit的朴素贝叶斯算法包,GaussianNB和MultinomialNB
- from sklearn.naive_bayes import GaussianNB #nb for 高斯分布的数据
- def GaussianNBClassify(trainData,trainLabel,testData):
- nbClf=GaussianNB()
- nbClf.fit(trainData,ravel(trainLabel))
- testLabel=nbClf.predict(testData)
- saveResult(testLabel,'sklearn_GaussianNB_Result.csv')
- return testLabel
- from sklearn.naive_bayes import MultinomialNB #nb for 多项式分布的数据
- def MultinomialNBClassify(trainData,trainLabel,testData):
- nbClf=MultinomialNB(alpha=0.1) #default alpha=1.0,Setting alpha = 1 is called Laplace smoothing, while alpha < 1 is called Lidstone smoothing.
- nbClf.fit(trainData,ravel(trainLabel))
- testLabel=nbClf.predict(testData)
- saveResult(testLabel,'sklearn_MultinomialNB_alpha=0.1_Result.csv')
- return testLabel
上面我尝试了两种朴素贝叶斯算法:高斯分布的和多项式分布的。多项式分布的函数有参数alpha可以自设定。
- svcClf=svm.SVC(C=5.0)
- svcClf.fit(trainData,ravel(trainLabel))
fit(X,y)说明:
- testLabel=svcClf.predict(testData)
调用predict方法。
- saveResult(testLabel,'sklearn_SVC_C=5.0_Result.csv')
(3)make a submission
上面基本就是整个开发过程了,下面看一下各个算法的效果,在Kaggle上make a submission
3、工程文件
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- """
- Created on Tue Dec 16 21:59:00 2014
- @author: wepon
- @blog:http://blog.csdn.net/u012162613
- """
- from numpy import *
- import csv
- 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
- 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
- def loadTestResult():
- l=[]
- with open('knn_benchmark.csv') as file:
- lines=csv.reader(file)
- for line in lines:
- l.append(line)#28001*2
- l.remove(l[0])
- label=array(l)
- return toInt(label[:,1]) # label 28000*1
- #result是结果列表
- #csvName是存放结果的csv文件名
- def saveResult(result,csvName):
- with open(csvName,'wb') as myFile:
- myWriter=csv.writer(myFile)
- for i in result:
- tmp=[]
- tmp.append(i)
- myWriter.writerow(tmp)
- #调用scikit的knn算法包
- from sklearn.neighbors import KNeighborsClassifier
- def knnClassify(trainData,trainLabel,testData):
- knnClf=KNeighborsClassifier()#default:k = 5,defined by yourself:KNeighborsClassifier(n_neighbors=10)
- knnClf.fit(trainData,ravel(trainLabel))
- testLabel=knnClf.predict(testData)
- saveResult(testLabel,'sklearn_knn_Result.csv')
- return testLabel
- #调用scikit的SVM算法包
- from sklearn import svm
- def svcClassify(trainData,trainLabel,testData):
- svcClf=svm.SVC(C=5.0) #default:C=1.0,kernel = 'rbf'. you can try kernel:‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
- svcClf.fit(trainData,ravel(trainLabel))
- testLabel=svcClf.predict(testData)
- saveResult(testLabel,'sklearn_SVC_C=5.0_Result.csv')
- return testLabel
- #调用scikit的朴素贝叶斯算法包,GaussianNB和MultinomialNB
- from sklearn.naive_bayes import GaussianNB #nb for 高斯分布的数据
- def GaussianNBClassify(trainData,trainLabel,testData):
- nbClf=GaussianNB()
- nbClf.fit(trainData,ravel(trainLabel))
- testLabel=nbClf.predict(testData)
- saveResult(testLabel,'sklearn_GaussianNB_Result.csv')
- return testLabel
- from sklearn.naive_bayes import MultinomialNB #nb for 多项式分布的数据
- def MultinomialNBClassify(trainData,trainLabel,testData):
- nbClf=MultinomialNB(alpha=0.1) #default alpha=1.0,Setting alpha = 1 is called Laplace smoothing, while alpha < 1 is called Lidstone smoothing.
- nbClf.fit(trainData,ravel(trainLabel))
- testLabel=nbClf.predict(testData)
- saveResult(testLabel,'sklearn_MultinomialNB_alpha=0.1_Result.csv')
- return testLabel
- def digitRecognition():
- trainData,trainLabel=loadTrainData()
- testData=loadTestData()
- #使用不同算法
- result1=knnClassify(trainData,trainLabel,testData)
- result2=svcClassify(trainData,trainLabel,testData)
- result3=GaussianNBClassify(trainData,trainLabel,testData)
- result4=MultinomialNBClassify(trainData,trainLabel,testData)
- #将结果与跟给定的knn_benchmark对比,以result1为例
- resultGiven=loadTestResult()
- m,n=shape(testData)
- different=0 #result1中与benchmark不同的label个数,初始化为0
- for i in xrange(m):
- if result1[i]!=resultGiven[0,i]:
- different+=1
- print different
Kaggle入门——使用scikit-learn解决DigitRecognition问题相关推荐
- 机器学习与Scikit Learn学习库
摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn. 在我科研的时候,机器学习(ML)是计算机科学领域中最 ...
- kaggle 入门_Kaggle入门:房价竞争
kaggle 入门 Founded in 2010, Kaggle is a Data Science platform where users can share, collaborate, and ...
- Scikit Learn: 在python中机器学习
Warning 警告:有些没能理解的句子,我以自己的理解意译. 翻译自:Scikit Learn:Machine Learning in Python 作者: Fabian Pedregosa, Ga ...
- Kaggle入门,看这一篇就够了
转载地址:https://zhuanlan.zhihu.com/p/25686876 之前发表了这篇关于 Kaggle 的专栏,旨在帮助对数据科学( Data Science )有兴趣的同学们更好的了 ...
- [转载]Scikit Learn: 在python中机器学习
原址:http://my.oschina.net/u/175377/blog/84420 目录[-] Scikit Learn: 在python中机器学习 载入示例数据 一个改变数据集大小的示例:数码 ...
- kaggle 入门:逻辑回归应用之Kaggle泰坦尼克之灾
经典又兼具备趣味性的Kaggle案例泰坦尼克号问题 kaggle入门--逻辑回归应用之kaggle泰坦尼克之灾 原文连接:https://blog.csdn.net/han_xiaoyang/arti ...
- 关于Kaggle入门,看这一篇就够了
这次酝酿了很久想给大家讲一些关于Kaggle那点儿事,帮助对数据科学(Data Science)有兴趣的同学们更好的了解这个项目,最好能亲身参与进来,体会一下学校所学的东西和想要解决一个实际的问题所需 ...
- 关于Kaggle入门
博客转载至:https://blog.csdn.net/bbbeoy/article/details/73274931 这次酝酿了很久想给大家讲一些关于Kaggle那点儿事,帮助对数据科学(Data ...
- Kaggle入门和学习资源
官网:https://www.kaggle.com/ 转载自:https://zhuanlan.zhihu.com/p/25686876 也可以看看:https://zhuanlan.zhihu.co ...
- 【scikit-learn】如何用Python和SciKit Learn 0.18实现神经网络
本教程的代码和数据来自于 Springboard 的博客教程.本文的作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:https://g ...
最新文章
- Open***异地机房互连以及负载均衡高可用解决方案
- 基于Android的红外测温设计,基于Android的红外三维重构移动APP设计与实现
- c语言中return的作用_C语言入门基础整理
- java count 在哪一类里_java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用...
- 踩内存是什么意思啊_abs防抱死制动系统是什么意思?
- python 时间模块 time datetime calendar
- win32开发(对话框启动)
- wordpress如何配置两个header。php_WordPress入门|WordPress建站详细流程
- 判断手机是否支持闪光灯的
- usb转rj45_超薄本也能有线上网,只需一个USB转网口小工具
- HCIE-RS--路由器交换机做整形的区别
- ubuntu 下安装 phpmyadmin 过程记录
- 使用晨曦记账本记账,将账目明细导出excel表格上
- Arduino下LCD1602综合探究(下)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法
- 一文读懂中国5G的真正实力
- css骨架图,【CSS】骨架屏 Skeleton 效果
- Android的在线考试app
- 耐人思考的“30秒法则”
- promethuesa监控 告警(二)
- idea 导入halo报错