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
DigitRecognition ,在我上一篇文章中也有描写叙述:《大数据竞赛平台—Kaggle入门》 。以下我使用scikit-learn中的算法包kNN(k近邻)、SVM(支持向量机)、NB(朴素贝叶斯)来解决问题,解决问题的关键步骤有两个:1、处理数据。2、调用算法。
(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、project文件
#!/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问题的更多相关文章
- Kaggle入门
Kaggle入门 1:竞赛 我们将学习如何为Kaggle竞赛生成一个提交答案(submisson).Kaggle是一个你通过完成算法和全世界机器学习从业者进行竞赛的网站.如果你的算法精度是给出数据集中 ...
- (原创)(四)机器学习笔记之Scikit Learn的Logistic回归初探
目录 5.3 使用LogisticRegressionCV进行正则化的 Logistic Regression 参数调优 一.Scikit Learn中有关logistics回归函数的介绍 1. 交叉 ...
- Scikit Learn: 在python中机器学习
转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...
- scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)
scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...
- (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探
一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...
- kaggle入门项目:Titanic存亡预测 (一)比赛简介
自从入了数据挖掘的坑,就在不停的看视频刷书,但是总觉得实在太过抽象,在结束了coursera上Andrew Ng 教授的机器学习课程还有刷完一整本集体智慧编程后更加迷茫了,所以需要一个实践项目来扎实之 ...
- Scikit Learn
Scikit Learn Scikit-Learn简称sklearn,基于 Python 语言的,简单高效的数据挖掘和数据分析工具,建立在 NumPy,SciPy 和 matplotlib 上.
- Kaggle 入门资料
kaggle入门之如何使用 - CSDN博客 http://blog.csdn.net/mdjxy63/article/details/78221955 kaggle比赛之路(一) -- 新手注册账号 ...
- 大数据竞赛平台——Kaggle 入门
Reference: http://blog.csdn.net/witnessai1/article/details/52612012 Kaggle是一个数据分析的竞赛平台,网址:https://ww ...
随机推荐
- 七天来学习ASP.NET MVC (两)——ASP.NET MVC 数据传输
通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上.因此须要确保您是否掌握了上一节的内容. 本章的目标是在今天学习结束时利用最佳实践解决方式创建一个小型的M ...
- thinkphp3.2 代码生成并点击验证码
本人小菜鸟一仅仅.为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识.小菜鸟创建了一个群.希望光临本博客的人能够进来交流.寻求 ...
- Spring【AOP】
AOP是OOP的延续,是软件开发中的一个热点. AOP技术,是OOP补充. OOP引入封装.继承和多态建立一种对象层次结构模拟公共行为集合,而对从左到右的关系则显得无能为力.对于AOP则恰恰适应这样的 ...
- Java Date API demo
package date; import java.text.DateFormat; import java.util.Calendar; import java.util.Date; /*2015- ...
- Windows Phone APP中禁用截图
原文:Windows Phone APP中禁用截图 Windows Phone 8 有系统自带的截图功能,快捷键:电源键+Win键,可以随意截图. Windows Phone 更新GDR2后新增了一个 ...
- ENode简介与各种资源汇总
ENode简介与各种资源汇总 ENode是什么 ENode是一个.NET平台开源的应用开发框架,为开发人员提供了一套完整的基于DDD+CQRS+ES+(in-memory)+EDA架构风格的解决方案. ...
- 【Socket规划】套接字Windows台C语言
[编译环境]:Visual Studio 2013 这是服务端实现流程. #include<stdio.h> #include<stdlib.h> #include<wi ...
- VisualStudio 怎么使用Visual Leak Detector
VisualStudio 怎么使用Visual Leak Detector 那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测 ...
- Topshelf创建Windows服务
使用Topshelf创建Windows服务 概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps ...
- nginx.conf 完整的集群配置
###############################nginx.conf 整配置############################### #user nobody; # user 主模 ...