scikit-learn学习日记(1)

最近开始学习使用scikit-learn,每天都写一下学到的东西,既能提示自己一天学了什么东西,也方便回顾。

在我的虚拟机Ubuntu上安装了scikit-learn,安装流程很简单 。由于我常用python所以我的Ubuntu虚拟机早就安装了pip、numpy、scipy、matplotlib、Cython依赖库。

源码地址:https://github.com/scikit-learn/scikit-learn

安装完依赖库后,在github上下载scikit-learn源码,cd到源码目录python setup.py install。然后进入python交互界面,import sklearn不报错即安装完成。

先体验一下用scikit-learn做SVM分类,推荐在用scikit-learn之前还是要对机器学习的方法有基本了解,这样才能改变参数来改进训练模型。

1 from sklearn import datasets
2 from sklearn import svm
3 iris=datasets.load_iris()
4 digits=datasets.load_digits()
5 clf=svm.SVC(gamma=0.001,C=100.)    #C为惩罚参数的误差项,gamma为学习速率
6 clf.fit(digits.data[:-1],digits.target[:-1])    #训练SVM模型
7 clf.predict(digits.data[:-1])    #使用SVM模型预测

iris与digits为scikit-learn自带的数据集,digits.data是手写数字0-9的图像特征,digits.target是数字0-9,最后训练的SVM模型就是利用手写数字的图像特征来预测所表示的数字。模型训练完可能不只用一次,参数可以用来作多次的预测,所以在训练完模型之后需要记录参数以便以后的预测,记录参数有两种方法,第一种是字符串储存参数:

 1 from sklearn import svm
 2 from sklearn import datasets
 3 clf=svm.SVC()
 4 iris=datasets.load_iris()
 5 X,y=iris.data,iris.target
 6 clf.fit(X,y)
 7 import pickle
 8 s=pickle.dumps(clf)
 9 clf2=pickle.loads(s)
10 clf2.predict(X[0:1])
11 print y[0]

将clf的参数存入s中,clf2载入s后取得了clf的参数,使用clf2和clf预测的效果是一样的。第二种方法是使用文件储存参数:

1 from sklearn.externals import joblib
2 joblib.dump(clf,‘filename.pkl‘)
3 clf=joblib.load(‘filename.pkl‘)

在scikit-learn中一般输入的数组中的数据都要求是float64位的,如果不是的话应该用如下程序转化成float64

 1 import numpy as np
 2 from sklearn import random_projection
 3
 4 rng=np.random.RandomState(0)
 5 X=rng.rand(10,2000)
 6 X=np.array(X,dtype=‘float32‘)
 7 print X.dtype
 8 #dtype(‘float32‘)
 9 transformer=random_projection.GaussianRandomProject()
10 X_new=transformer.fit_transform(X)
11 print X_new.dtype
12 #dtype(‘float64‘)

改变和更新参数 下面的代码是示范在SVM训练模型中改变核空间,先是从rbf改变成linear再改变回来

 1 import numpy as np
 2 from sklearn.svm import SVC
 3
 4 rng=np.random.RandomState(0)
 5 X=rng.rand(100,10)
 6 y=rng.binomial(1,0.5,100)
 7 #binomial生成两项分布,参数分别是n、p、size
 8 X_test=rng.rand(5,10)
 9 clf=SVC()
10 clf.set_params(kernal=‘linear‘).fit(X,y)
11 clf.predict(X_test)
12 clf.set_params(kernel=‘rbf‘).fit(X,y)
13 clf.predict(X_test)
时间: 2024-10-15 05:25:34

scikit-learn学习日记(1)的相关文章

机器学习-scikit learn学习笔记

scikit-learn官网:http://scikit-learn.org/stable/ 通常情况下,一个学习问题会包含一组学习样本数据,计算机通过对样本数据的学习,尝试对未知数据进行预测. 学习问题一般可以分为: 监督学习(supervised learning) 分类(classification) 回归(regression) 非监督学习(unsupervised learning) 聚类(clustering) 监督学习和非监督学习的区别就是,监督学习中,样本数据会包含要预测的标签(

Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)

所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的垂直搜索引擎,专门为用户提供团购.优惠券的检索:同时存在一个通用的搜索引擎,比如百度,通用搜索引擎希望能够识别出一个Query是否具有O2O检索意图,如果有则调用O2O垂直搜索引擎,获取结果作为通用搜索引擎的结果补充. 我们的目的是学习出一个分类器(classifier),分类器可以理解为一个函数,

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

学习日记

五一耍了三天,自己的计划有泡汤,那种制止力哪里去了,不过我认真起来还有有废寝忘食的时候,不过希望这种时候多一点,回家妈妈告诉我,她给老师打电话了的,老师说了我的一些情况,不过我没有老师说的那么好,学习在班上算中等.我觉得还算不上吧!任重而道远吧. Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量

学习日记之解释器模式和Effective C++

解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. (1),如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子.这样可以构建一个解释器,该解释器通过解释这些句子来解决该问题. (2),当一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式. (3),容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变和扩展该文法

学习日记之中介者模式和Effective C++

中介者模式(Mediator):用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. (1),中介者模式很容易在系统中应用,也很容易在系统中误用.当系统出现多对多交互复杂的对象群时,不要急于使用中介者模式,而要反思你在系统的设计上是不是合理. (2),中介者的出现减少了各个对象的耦合,使得可以独立地改变和复用各个对象和中介者. (3),由于把对象如何协作进行了抽象,将中介者作为一个独立的概念并将其封装在一个对象中,这样关注

学习日记之职责链模式和Effective C++

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着该条链传递该请求,直到有一个对象处理它为止. (1),当客户提交一个请求时,请求时沿着链传递直到有一个 ConcreteHandler 对象负责处理它. (2),接收者和发送者都没有对方的明确信息,切链中的对象自己也不知道链的结构.结果是职责链可简化为对象之间的连接,它们仅需保留一个指向其后继者的引用.而不惜保留它所有的候选接收者的引用

学习日记之单例模式和Effective C++

单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点. (1),通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法就是,让类自身负责保存它的唯一实例.这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法. (2),lock 是确保当一个线程位于代码的临界区时,另一个线程不进入临界区.如果其他线程试图进入锁定的代码,则它将一直等待,知道该对象被释放. (3),双重锁定解决效率问题. (4),C#与公共语言运行库

学习日记之迭代器模式和Effective C++

迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示. (1),当需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑迭代器模式. (2),你需要对聚集有多种方式遍历时,可以考虑用迭代器模式. (3),当遍历不同的聚集结构,应提供如开始.下一个.当前项等统一的接口. (4),迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器来负责,这样即可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据. Effec

学习日记之适配器模式和Effective C++

适配器模式(Adapter):将一个类的接口转换为客户希望的另一个接口.Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. (1),系统的数据和行为都正确,但接口不符时,我们应该考虑适配器模式,目的是使控制范围之外的一个原有对象与某个接口匹配.适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. (2),使用一个已经存在的类,但如果他的接口,也就是他的方法和你的要求不相同时,经营该考虑适配器模式. (3),两个类所做的事情相同或相似,但是具