怎样开始阅读python scikit learn-learn的源码?是否值得读

Kaggle案例——使用scikit-learn解决DigitRecognition问题_数据挖掘DW-爱微帮
&& &&& Kaggle案例——使用scikit-l…
数据挖掘资料,点击底部&阅读原文&,手慢无1、scikit-learn简介scikit-learn是一个基于NumPy、SciPy、Matplotlib的开源机器学习工具包,采用Python语言编写,主要涵盖分类、回归和聚类等算法,例如knn、SVM、逻辑回归、朴素贝叶斯、随机森林、k-means等等诸多算法,官网上代码和文档都非常不错,对于机器学习开发者来说,是一个使用方便而强大的工具,节省不少开发时间。scikit-learn官网指南:上一篇文章(回复本公众号“kaggle”可获取) 我分两部分内容介绍了Kaggle,在第二部分中,我记录了解决Kaggle上的竞赛项目DigitRecognition的整个过程,当时我是用自己写的kNN算法,尽管自己写歌kNN算法并不会花很多时间,但是当我们想尝试更多、更复杂的算法,如果每个算法都自己实现的话,会很浪费时间,这时候scikit-learn就发挥作用了,我们可以直接调用scikit-learn的算法包。当然,对于初学者来说,最好还是在理解了算法的基础上,来调用这些算法包,如果有时间,自己完整地实现一个算法相信会让你对算法掌握地更深入。2、使用scikit-learn解决DigitRecognition我发现自己很喜欢用DigitRecognition这个问题来练习分类算法,因为足够简单。如果你还不知道DigitRecognition问题是什么,请先简单了解一下(/c/digit-recognizer),在我上一篇文章中也有描述。下面我使用scikit-learn中的算法包kNN(k近邻)、SVM(支持向量机)、NB(朴素贝叶斯)来解决这个问题,解决问题的关键步骤有两个:1、处理数据。2、调用算法。(1)处理数据这一部分与上一篇文章 中第二部分的数据处理是一样的,本文不打算重复,下面只简单地罗列各个函数及其功能,在本文最后部分也有详细的代码。def loadTrainData():
#这个函数从train.csv文件中获取训练样本:trainData、trainLabeldef loadTestData():
#这个函数从test.csv文件中获取测试样本:testDatadef 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中的算法kNN算法#调用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 testLabelkNN算法包可以自己设定参数k,默认k=5,上面的comments有说明。更加详细的使用,推荐上官网查看:SVM算法#调用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 testLabelSVC()的参数有很多,核函数默认为'rbf'(径向基函数),C默认为1.0更加详细的使用,推荐上官网查看:朴素贝叶斯算法#调用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)第二步:接这个分类器要使用哪些训练数据?调用fit方法,比如:svcClf.fit(trainData,ravel(trainLabel))fit(X,y)说明:X: 对应trainDataarray-like, shape = [n_samples, n_features],X是训练样本的特征向量集,n_samples行n_features列,即每个训练样本占一行,每个训练样本有多少特征就有多少列。y: 对应trainLabelarray-like, shape = [n_samples],y必须是一个行向量,这也是上面为什么使用numpy.ravel()函数的原因。第三步:使用分类器预测测试样本,比如: testLabel=svcClf.predict(testData)调用predict方法。第四步:保存结果,这一步是取决于我们解决问题的要求,因为本文以DigitRecognition为例,所以有:saveResult(testLabel,'sklearn_SVC_C=5.0_Result.csv')(3)make a submission上面基本就是整个开发过程了,下面看一下各个算法的效果,在Kaggle上make a submissionknn算法的效果,准确率95.871%朴素贝叶斯,alpha=1.0,准确率81.043%SVM,linear核,准确率93.943%3、工程文件下载:回复本公众号“kaggle”可获取。贴一下代码:#!/usr/bin/python
# -*- coding: utf-8 -*-
Created on Tue Dec 16 21:59:00 2014
@author: wepon
@blog:http://blog.csdn.net/u
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():
with open('train.csv') as file:
lines=csv.reader(file)
for line in lines:
l.append(line) #
l.remove(l[0])
l=array(l)
label=l[:,0]
data=l[:,1:]
return nomalizing(toInt(data)),toInt(label)
#label 1*42000
#return trainData,trainLabel
def loadTestData():
with open('test.csv') as file:
lines=csv.reader(file)
for line in lines:
l.append(line)#
l.remove(l[0])
data=array(l)
return nomalizing(toInt(data))
#return testData
def loadTestResult():
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.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”可获取word文字阅读版及实验代码。更多资料关注下面二维码,加微信:hai299014戳“阅读原文”找数据挖掘/机器学习资料!↓↓↓
点击展开全文
实战学习资料提供。涵盖数据分析工具使用,数据挖掘算法原理与案例,机器学习,R语言,Python编程,爬虫。如需发布广告请联系: hai299014
您的【关注和订阅】是作者不断前行的动力
本站文章来自网友的提交收录,如需删除可发送邮件到 bang@ 或联系QQ ,
(C)2014&&版权所有&&&|&&&
京ICP备号-2&&&&京公网安备34试读一下就知道了。如果你是python用户的话,其实sklearn的代码是不值得读的,因为涉及到速度的部分,都会被用c来重写的。比如KNN,很多书里会给你一个遍历样本,计算相似度寻找最近邻的K个样本。但是,在sklearn里,是直接使用c写了kdtree来实现KNN,不方便pythoner来直接学习。但是,对于很多模块,可以看到sklearn里的用法还是很值的学习的。比如ROC曲线的计算,自己写的ROC脚本就是很慢,但是sklearn里就是特别的快。对比之后发现,sklearn会非常善用numpy的一些特性,而不是用list去遍历。如果是学习机器学习算法的话,我个人是不建议读的。但是,如果是想去优化代码的话,还是可以翻看的;如果是高级玩家,我就没资格说话了。
作为scikit-learn的一个小contributor,来简单说下个人看法吧。&br&&br&首先,我认为这取决于题主本身在Python、机器学习方面的水平。因为题主没有提供这方面信息,我也只能简单介绍一下scikit-learn的现状,让题主自行判断。&br&&br&scikit-learn作为一个开源项目,其代码质量、风格变化是非常大的,覆盖的算法跨度也相当大,因为这些东西基本都是不同人写的。前面也有匿名用户说了,有些需要速度的地方是用了cython的,但这通常是早期代码,目前scikit-learn的重点已经不是速度,而是代码的可读性和易用性,还有文档的完善性。&br&&br&如果你打开任何一个比较大的,包含new feature的pull request,至少都能看到上百条comment,从API设计到合适的default parameter,到doc里的错字。各方面都讨论的非常详细,经过多人review之后才能merge。当然因为项目太大,这样还是很难避免有遗漏,比如我最近merge的那个,经过了200多comment的讨论后,现在还有些小bug我准备修。。&br&&br&我这么说想表达的意思是,scikit-learn的代码,一般来说是挺可读的,但要真看懂某个算法的代码,不可避免的需要懂这个算法的原理。如果你没有一定理论基础的话,应该是读不下去的。这不仅适用于scikit-learn,对任何机器学习库都一样。&br&&br&如果你理论基础不错,Python基础也扎实,只是想看看那些机器学习算法比较靠谱的实现,那读scikit-learn的代码应该是没错的。虽然不少常用算法,比如decision tree用了cython,svm直接wrap了libsvm,但后期的代码基本原则都是优先Python实现,只有Python实在太慢的时候才会考虑用cython加速。&br&&br&另,如果真是初学者为了学机器学习的话,与其看别人代码不如自己尝试实现,不一定要效率高,但至少得能用。这样比你一知半解的看完scikit-learn都有用。
作为scikit-learn的一个小contributor,来简单说下个人看法吧。首先,我认为这取决于题主本身在Python、机器学习方面的水平。因为题主没有提供这方面信息,我也只能简单介绍一下scikit-learn的现状,让题主自行判断。scikit-learn作为一个开源项目,其代码…
建议可以自己先实现一遍,然后再参照sklearn里面的实现。比如你可以自己去实现一个decision tree,一般来说会比sklearn的速度慢很多,然后你再看看他们是怎么实现的,会学到一些东西。
建议可以自己先实现一遍,然后再参照sklearn里面的实现。比如你可以自己去实现一个decision tree,一般来说会比sklearn的速度慢很多,然后你再看看他们是怎么实现的,会学到一些东西。
已有帐号?
无法登录?
社交帐号登录利用scikit-learn进行机器学习简介 - 简书
下载简书移动应用
写了624118字,被322人关注,获得了174个喜欢
利用scikit-learn进行机器学习简介
一般而言,一个学习问题处理一组包含n个样本的数据集,然后预测未知数据的属性。如果每个样本不止有一个数据,例如多维条目(又叫做多维数据),这种情况被称为拥有多组属性或特征。我们可以将学习问题氛围几个大类:监督学习:这类学习中数据包含我们想要预测的附加属性,这个问题可以被分为分类和回归。分类问题:样本属于两个或者更多的类,我们通过学习已经加过标签的数据来预测未加标签的数据所属的类。手写体数字识别问题是一个分类问题的实例,其目的是将有限个输入向量分配到有限数目、离散的种类中。另外一种分类的理解方式可以认为分类是一种离散的监督学习。回归:如果所希望的输出有一个或多个连续的随机变量组成,这种学习任务被称为回归。一个回归的简单例子就是通过鲑鱼的年龄和体重的函数来预测鲑鱼的长度。无监督学习:训练数据是由输入向量x组成的集合,该训练数据没有任何相关的目标值。在这类问题中,目标是发现数据集中相似样本族,这时该学习问题被称为聚类。或者判断在输入空间里数据分布情况,这时称为密度估计。或者将数据从高维空间映射到二维或三维空间中,称之为数据可视化问题。训练集和测试集:机器学习是通过一组数据集学习一些属性,然后将他们应用到新的数据中。这是为什么在评价机器学习算法时,常见做法是将数据集分为两部分,一部分称之为训练数据,用于学习数据属性,一个称之为测试集合用来测试学习到的属性。scikit-learn带有一些标准数据集,例如用于分类的iris和digits数据集,用于回归的bostonhouse prices数据集。接下来我们从shell启动一个Python解释器,然后载入iris和digits数据集。我们的符号约定$表示shell提示,&&&表示Python解释器提示。[python]$ python&&&fromsklearnimportdatasets&&& iris = datasets.load_iris()&&& digits = datasets.load_digits()数据集是一个类似字典的对象,包含的所有数据和一些关于数据的元数据。数据存储在.data中,是个n_samples, n_features的数组。在监督问题的情况下,一个活多个相关变量存储在.target成员中。更多有关不同数据集合的细节可以在专门部分查找。例如,在digits数据集情况下,digits.data提供了可用于分类数字样本的特征。[python]&&&print(digits.data)[[0.0.5....,0.0.0.][0.0.0....,10.0.0.][0.0.0....,16.9.0.]...,[0.0.1....,6.0.0.][0.0.2....,12.0.0.][0.0.10....,12.1.0.]]并且digits.target给定了digit数据集的真实结果,每个数字对应于每个我们正在学习的图像。[python]&&& digits.targetarray([0,1,2, ...,8,9,8])可以通过网址访问。在digits数据集中,给定一幅手写数字的数字图像,任务是预测结果。我们被给定的样本有10类(是数字0到9),基于此我们建立一个估计方法能够预测我们没有见过的样本属于哪一类。在scikit-learn中,分类的估计模型是一个实现了fit(x,y)函数和predict(T)函数的python对象。估计模型的例子是在实现了支持向量机的类sklearn.svm.SVC。估计模型的构造函数带有模型参数,但是目前,我们将估计模型当做一个黑盒。[python]&&&fromsklearnimportsvm&&& clf = svm.SVC(gamma=0.001, C=100.)我们将我们的估计模型实例clf成为一个分类器。它现在必定十分适合这个模型。我们通过将数据集传递给fit函数完成。作为训练集,除了最后一个样本,我们选择其余所有样本。我们通过python语句[:-1]选择样本,这条语句将从digits.data中产生一个除了最后一个样本的新数组。[python]clf.fit(digits.data[:-1], digits.target[:-1])SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,gamma=0.001, kernel='rbf', max_iter=-1, probability=False,random_state=None, shrinking=True, tol=0.001, verbose=False)接下来我们可以预测新的输入值,特别是我们可以问分类器在digits数据集中最后一个我们在训练分类器是我们没有使用的图像是数字几.图像相应的图像如下所示:
正如你所看到的,这是一个具有挑战性的任务:图像的分辨率都很低。你是否同意这个分类器呢?有个完整的分类问题例子--您可以运行和研究。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:没办法把自己的数据导入 scikit-learn 里使用???? - 科技_易房网生活频道
没办法把自己的数据导入 scikit-learn 里使用????
/ 作者:admin
易房网摘要:机器学习
没办法把自己的数据导入 scikit-learn 里使用????,上一篇:
下一篇: 。我正在做一个text mining的题目。收集了2014年的新闻,想把这些文字转成数字,然后做一个线性回归的模型。我自己的数据已经整理好,但是怎么也导入不了scikit-learn,那个feature extraction 根本就没反应。不知道问题出在哪了。。。请问哪位有经验,你们都
我正在做一个text mining的题目。收集了2014年的,想把这些文字转成数字,然后做一个线性回归的模型。我自己的数据已经整理好,但是怎么也导入不了scikit-learn,那个feature extraction 根本就没反应。不知道问题出在哪了。。。请问哪位有经验,你们都很顺利吗?易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
from sklearn.feature_extraction.text import CountVectorizercv = CountVectorizer(ngram_range=(1, 2), stop_words = 'english')train = cv.fit_transform(train_data) 不明白什么叫没有反应,不会是他给你一个sparse matrix你不知道是怎么回事吧。。
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
你的问题中没有任何线索,我只能回答,我这边做的很顺利。
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
这个库分词 不支持 汉字 找个汉字分词库(jieba)就可以了
没办法把自己的数据导入 scikit-learn 里使用????
通过E-mail将您的想法和建议发给我们
商务合作QQ:
广告投放QQ:Scikit-Learn使用方法
一、cross_validation的train_test_split做交叉验证
(1)作用:它的目的是得到可靠稳定的模型,具体做法是拿出大部分数据进行建模,留小部分样本用刚刚建立的模型进行预测,并求出这小部分样本预测的误差,记录它们的平方和,这个过程一直进行,直到所有的样本都恰好被预测了一次,交叉验证在克服过拟合问题上非常有效
(2)函数说明:X_train, X_test, y_train, y_test =
cross_validation.train_test_split(train_data,train_target,
test_size=0.4, random_state=0)
test_size是样本占比。如果是整数的话就是样本的数量。random_state是随机数的种子。
(3)实例:
import numpy as np
from sklearn.cross_validation import train_test_split
x = np.array([[1,1],
y = np.array([['no'],
& ['yes'],
& ['yes'],
& ['yes'],
& ['yes']])
x_train, x_test, y_train, y_test = train_test_split(x, y,
test_size=0.2)
print x_train
二、决策树tree.DecisionTreeClassifier()
(1)作用:决策树分类
(2)函数说明:
(3)实例:
基于第一点的例子,树形结构在tree.dot文件中
from sklearn import tree
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(x_train, y_train)
answer = clf.predict([3,7])
print answer打印预测的结果
with open("tree.dot", 'w') as f: &
tree.export_graphviz(clf, out_file=f) &
三、scipy.stats.norm.rvs正态分布
(1)作用:构造正态分布的数据
(2)函数:scipy.stats.norm.rvs(size=100,loc=0,scal=1)&
scipy.norm正态分布模块的随机变量函数rvs,size=100是样本大小,loc=0是均值,scal=1是标准差
(3)实例:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
x = np.arange(0, 1, 0.002)
y = norm.rvs(loc=0, size=500, scale=0.1)
plt.scatter(x, y)
plt.show()
构造y值在0的上下正态分布;scale是标准差,该值越小则越集中在y=0的位置
四、pipeline包
(1)作用:提供了Pipeline类来进行流水线处理。流水线上除最后一个工作以外,其他都要执行fit_transform方法,且上一个工作输出作为下一个工作的输入。最后一个工作必须实现fit方法,输入为上一个工作的输出;但是不限定一定有transform方法,因为流水线的最后一个工作是训练
(2)示例:
五、线性回归LinearRegression和PolynomialFeatures
(1)作用:线性回归的方式进行数据拟合,分linear regression和polynomial
regresson两种
第一种的方程式为:
第二种的方程式为:
(2)实例:
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import
PolynomialFeatures&
from sklearn import linear_model
x = np.arange(0, 1, 0.002)
y = norm.rvs(0, size=500, scale=0.1)
y = y + x**2
plt.scatter(x, y, s=5)
degree = [1, 2, 100]
y_test = []
y_test = np.array(y_test)
#clf = LinearRegression(fit_intercept=False)
clf = Pipeline([('poly', PolynomialFeatures(degree=2)),
& & ('linear',
LinearRegression(fit_intercept=False))])
clf.fit(x[:, np.newaxis], y)
y_test = clf.predict(x[:, np.newaxis])
plt.plot(x, y_test, linewidth=2)
plt.grid()
plt.show()
曲线的图形如下:
六、KNN分类算法
(1)作用:要确定测试样本属于哪一类,就寻找所有训练样本中与该测试样本“距离”最近的前K个样本,然后看这K个样本大部分属于哪一类,那么就认为这个测试样本也属于哪一类。简单的说就是让最相似的K个样本来投票决定。
(2)实例:
from sklearn import neighbors
neighbors.KNeighborsClassifier(algorithm='kd_tree')
clf.fit(x_train, y_train)
KNeighborsClassifier可以设置3种算法:‘brute’,‘kd_tree’,‘ball_tree’。如果不知道用哪个好,设置‘auto’让KNeighborsClassifier自己根据输入去决定。
七、load_files(from sklearn.datasets &import
load_files)使用
(1)作用:数据集的组织方式是,一个文本存放在文件下,标签相同的文件放在同一个文件夹下。sklearn.datasets.load_files,可以很好的加载这种结构的数据集,数据加载完成后,就可以形成data-target对应的分类。
(2)实例:endata目录结果如下,分pos/neg/gab三个子目录
from sklearn.datasets &import
load_files
movie_reviews = load_files('endata')
print movie_reviews.data
print movie_reviews.target
最后显示为:['hello your mother', 'sb movie.', 'a shit movie.', 'nb!
nb movie!', 'worth it! ', 'waste my money.', 'your baby ok?', 'a nb
movie.', 'nb!', 'waste of time.', 'worth my money.', 'shit.',
'what?', 'waste of money.', 'I love this movie!']
[0 1 1 2 2 1 0 2 2 1 2 1 0 1 2]
八、文本特征抽取与向量化
(1)目的:解决从英文中抽取情感态度而进行分类,见:
(2)名字解释
a,"stop_word"停用词,这类词是可以忽略掉不做统计。
b,TF-IDF:词频和逆向文件频率
TF:就是针对一个文件t,某个单词Nt 出现在该文档中的频率。比如文档“I love this
movie”,单词“love”的TF为1/4。如果去掉停用词“I"和”it“,则为1/2
IDF:对于某个单词t,凡是出现了该单词的文档数Dt,占了全部测试文档D的比例,再求自然对数。
TF-IDF:就是把二者简单的乘在一起即可。
(3)实例:
from sklearn.datasets &import
load_files
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import
TfidfVectorizer
movie_reviews = load_files('endata')
doc_terms_train, doc_terms_test, y_train, y_test =
train_test_split(movie_reviews.data,
& movie_reviews.target,
& test_size=0.3)
count_vec = TfidfVectorizer(binary=False,
decode_error='ignore',
stop_words='english')
x_train = count_vec.fit_transform(doc_terms_train)
x_test = count_vec.transform(doc_terms_test)
print doc_terms_train
print count_vec.get_feature_names()
print x_train.toarray()
print movie_reviews.target
count_vec.get_stop_words()查看TfidfVectorizer内置的所有停用词
九、朴素贝叶斯分类器
(1)原理:
(2)示例:
from sklearn.datasets &import
load_files
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import
TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
import scipy as sp
import numpy as np
movie_reviews = load_files('endata')
sp.save('movie_data.npy', movie_reviews.data)
sp.save('movie_target.npy', movie_reviews.target)
movie_data = sp.load('movie_data.npy')
movie_target = sp.load('movie_target.npy')
x = movie_data
y = movie_target
count_vec = TfidfVectorizer(binary=False,
decode_error='ignore',
& & stop_words='english')
x_train, x_test, y_train, y_test =
train_test_split(movie_data, movie_target, test_size=0.2)
x_train = count_vec.fit_transform(x_train)
x_test = count_vec.transform(x_test)
clf = MultinomialNB().fit(x_train, y_train)
doc_class_predicted = clf.predict(x_test)
#print doc_class_predicted
print (np.mean(doc_class_predicted == y_test))
我们选用的朴素贝叶斯分类器类别:MultinomialNB,这个分类器以出现次数作为特征值,我们使用的TF-IDF也能符合这类分布。其他的朴素贝叶斯分类器如GaussianNB适用于高斯分布(正态分布)的特征,而BernoulliNB适用于伯努利分布(二值分布)的特征。
十、逻辑回归分类
(1)原理:
(2)实例:
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression().fit(x_train, y_train)
doc_class_predicted = clf.predict(x_test)
十一、SVM支持向量机
(1)作用:通过某种核函数,将数据在高维空间里寻找一个最优超平面,能够将两类数据分开。
(2)实例:
线性函数:形如K(x,y)=x*y这样的线性函数;
多项式函数:形如K(x,y)=[(x·y)+1]^d这样的多项式函数;
径向基函数:形如K(x,y)=exp(-|x-y|^2/d^2)这样的指数函数;
Sigmoid函数:就是上一篇文章中讲到的Sigmoid函数。
from sklearn import svm &
clf_linear = svm.SVC(kernel='linear').fit(x, y)
clf_poly = svm.SVC(kernel='poly', degree=3).fit(x, y)
clf_rbf = svm.SVC().fit(x, y)
clf_sigmoid = svm.SVC(kernel='sigmoid').fit(x, y)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 python scikit learn 的文章

 

随机推荐