sklearn学习(一)
学习网站
http://scikit-learn.org/stable/tutorial/basic/tutorial.html#machine-learning-the-problem-setting
内容
一般来说,学习问题可以被分为几大类:
- 监督学习(supervised learing)。数据包括一些我们可以预测的属性。
- 非监督学习(unsupervised learning)。数据有一堆输入向量,但是没有给输出的目标值。
监督学习分为:
- 分类(classification):当样本属于两个或者更多的数据的时候,我们可以通过学习一些贴好标签的数据,然后去预测一些没有给出标签的数据。(离散问题(discrete))
- 回归(regression):当希望预测的结果是一个或者多个连续的变量的时候,这就是回归。
非监督学习分为:
- 聚类(clustering):目标去发现一些有相似特征的类。
- 密度估计(Density estimation):描述一些输入数据的特征信息
- 数据降维:将高维数据降维到低维数据
一般将数据集分为训练集和测试集
sklearn内有一些标准数据,例如:iris(鸢尾花),手写数字数据为了分类,然后,还有波斯顿房价数据为了回归。
以导入iris数据为例
导入数据:
from sklearn import datasets
iris = datasets.load_iris()
数据集是有点像字典的类。包括一些数据,还有元数据。这些数据被存在
.data
中。内容是一个n个例子,还有n个特征的array。在监督学习的问题中,一个或者是更多的响应数据被存.target
中。
关于数据的操作具体的可以在下面的网址中找到。
http://scikit-learn.org/stable/datasets/index.html#datasets
关于上面的.data
和.target
是什么意思:
例如:
print(iris.data)
输出:(数据较多,就截取一部分)
[[5.1 3.5 1.4 0.2][4.9 3. 1.4 0.2][4.7 3.2 1.3 0.2][4.6 3.1 1.5 0.2]...[6.3 2.5 5. 1.9][6.5 3. 5.2 2. ][6.2 3.4 5.4 2.3][5.9 3. 5.1 1.8]]
print(iris.target)
输出:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2]
学习和预测
在数字数据集中,任务是预测一个图片,然后给出预测的数字。数字集合包括有0到9。
在sklearn中,对于分类器的估计是一个python类。实现了两个方法fit(X,y)
和predict(T)
一个估计类的例子的sklearn.svm.SVC是实现了支持向量机的分类器。分类器的构造函数会需要一些参数(我们称之为超参数)。从现在起,我们认为这个评估器,就是一个黑盒子。
from sklearn import svm
clf = svm.SVC(gamma=0.001, C=100.)
这里,我们给的时候是给了固定的参数,但是还有两种设置参数的方式。
grid-search http://scikit-learn.org/stable/modules/grid_search.html#grid-search
cross-validation http://scikit-learn.org/stable/modules/cross_validation.html#cross-validation
我们称评估器为clf
,因为它是一个分类器。它必须要从模型中学习。这项被完成是通过fit方法。
数字预测代码
from sklearn import svm
from sklearn import datasetsdigits = datasets.load_digits()
clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(digits.data[:-1], digits.target[:-1])
print("pridict:", clf.predict(digits.data[-1:]))
print("actually:", digits.target[-1:])
输出:
pridict: [8]
actually: [8]
注意:
选最后一个数据的时候要 digits.data[-1:] 这样方式。主要是为了使得在外面包一层,因为测试数据可能不止一个。所以,当必须要以集合的形式传进去。否者就会报下面的错误。
ValueError: Expected 2D array, got 1D array instead:
array=[ 0. 0. 10. 14. 8. 1. 0. 0. 0. 2. 16. 14. 6. 1. 0. 0. 0. 0.15. 15. 8. 15. 0. 0. 0. 0. 5. 16. 16. 10. 0. 0. 0. 0. 12. 15.15. 12. 0. 0. 0. 4. 16. 6. 4. 16. 6. 0. 0. 8. 16. 10. 8. 16.8. 0. 0. 1. 8. 12. 14. 12. 1. 0.].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
可以来看下到底最后一个数据是怎么样的:
其实确实有点像是8。
plt语句的最后一个参数含义是为了将这个变成灰色。否则颜色有点奇怪。
代码:
from sklearn import svm
from sklearn import datasets
import matplotlib.pyplot as pltdigits = datasets.load_digits()
clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(digits.data[:-1], digits.target[:-1])
print("pridict:", clf.predict(digits.data[-1:]))
print("actually:", digits.target[-1:])plt.imshow(digits.images[-1], cmap=plt.cm.gray_r) # 变灰色plt.show()
模型可持续性
相信很多哥们都遇到这样的问题,训练一个模型需要很久的时间,但是如果,一开始就已经有了这样的模型之后,以后就直接调用,岂不是美滋滋?所以,python原生的这样的操作。
pickle库
from sklearn import svm
from sklearn import datasets
import pickledigits = datasets.load_digits()
clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(digits.data[:-1], digits.target[:-1])
print("pridict:", clf.predict(digits.data[-1:]))
print("actually:", digits.target[-1:])s = pickle.dumps(clf)clf2 = pickle.loads(s)print(clf2.predict(digits.data[-1:]))
输出为;
pridict: [8]
actually: [8]
[8]
当然是可以保存为文件类型:
with open('clf', 'wb') as f:pickle.dump(clf, f)with open('clf', 'rb') as f:clf2 = pickle.load(f)print(clf2.predict(digits.data[-1:]))
用上面的代码来替换掉之前的 dumps还有loads也是可以。
当然,这样就在代码上多出一个这样的文件。不过可以被移植了,算是一个优点。
其实文件取什么名字都没有什么多大意义的。当然啦,选什么类型这种东西,对于程序员来说也是这样的,因为本质上都是二进制文件。
在sklearn中,除了python原生的pickle可以使用,还可以使用sklearn自带的joblib
joblib.dump(clf, 'clf2')
clf2 = joblib.load('clf2')
print(clf2.predict(digits.data[-1:]))
用这个代码代替之前的那段代码也是可以的。
而且, joblib对于处理大数据的时候会比pickle更有效(不过我还没有试过)。不过至少,我觉得写起来效率会比pickle更高。但是,就是没有在代码间的那种先放着,然后之后再做处理的操作。(虽然我目前还没意识到,为什么需要有这种操作。。。)
但是学好pickle也是很重要的,因为基本所有的数据都是可以用这个来做。在python上的课扩展性会更强点。
sklearn使用公约
类型转变:
除非特殊情况,否则,输入转变到float64
重新fit和更新超参数(Hyper-parameters)
- 超参数可以被更新,通过
sklearn.pipeline.Pipeline.set_params
方法。 - 只需要再调用一次fit之后,就会覆盖掉之前学习的效果。
比如下面的代码:
import numpy as np
from sklearn.svm import SVCrng = np.random.RandomState(0)
X = rng.rand(100, 10)
y = rng.binomial(1, 0.5, 100)
X_test = rng.rand(5, 10)
clf = SVC()
clf.set_params(kernel='linear').fit(X, y)
print(clf.predict(X_test))
clf.set_params(kernel='rbf').fit(X, y)
print(clf.predict(X_test))
输出是:
[1 0 1 1 0]
[0 0 0 1 0]
注意到,分类器这里重新设置了SVC的核函数。当然,设置了不同的核函数之后,最后的预测效果也不一样了。
不过考虑到,这是因为数据本身就是随机出来的效果。所以,在这里本身蕴含的信息就是一个混乱的。所以,根据不同的核函数的时候,就导致了很大的误差。实际应用中的效果应该是,就算是有效果,但是效果也不应该是这么明显的。
Multiclass vs. multilabel fitting
采用multiclass 中的分类器,学习和预测任务,是依赖于fit的时候的目标类型。
例如下面的这个代码:
from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier
from sklearn.preprocessing import LabelBinarizerX = [[1, 2], [2, 4], [4, 5], [3, 2], [3, 1]]
y = [0, 0, 1, 1, 2]classif = OneVsRestClassifier(estimator=SVC(random_state=0))
print(classif.fit(X, y).predict(X))# 数据二进制化
y = LabelBinarizer().fit_transform(y)
print(classif.fit(X, y).predict(X))
输出:
[0 0 1 1 2]
[[1 0 0][1 0 0][0 1 0][0 0 0][0 0 0]]
但是y的被转变之后的数据是
[[1 0 0][1 0 0][0 1 0][0 1 0][0 0 1]]
注意到后面两行的数据是不一样的,都是全0,表示的是,没有一个匹配到。
但是,如果是多个标签的情况下:
比如说,下面的这个y就是一个多标签的问题。
后面的输出矩阵,其实就转换成了一个bool值问题。即表示某个元素存在与否。
from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier
from sklearn.preprocessing import MultiLabelBinarizer
X = [[1, 2], [2, 4], [4, 5], [3, 2], [3, 1]]
y = [[0, 1], [0, 2], [1, 3], [0, 2, 3], [2, 4]]classif = OneVsRestClassifier(estimator=SVC(random_state=0))
# 数据二进制化
y = MultiLabelBinarizer().fit_transform(y)
print(classif.fit(X, y).predict(X))
输出为:
[[1 1 0 0 0][1 0 1 0 0][0 1 0 1 0][1 0 1 0 0][1 0 1 0 0]]
然后,我们看原来的y值为
[[1 1 0 0 0][1 0 1 0 0][0 1 0 1 0][1 0 1 1 0][0 0 1 0 1]]
sklearn学习(一)相关推荐
- 机器学习Sklearn学习总结
Sklearn学习资料推荐: sklearn中文文档 机器学习入门必看:使用 scikit-learn 构建模型的通用模板 机器学习神器Scikit-Learn保姆教程! python机器学习_FF_ ...
- sklearn学习07——集成学习
sklearn学习07--集成学习 前言 一.集成学习 1.1.什么是集成学习? 1.2.Boosting 算法 二.AdaBoost算法及实现 2.1.AdaBoost算法 2.2.调sklearn ...
- sklearn学习04——DecisionTree
sklearn学习04--DecisionTree 前言 一.决策树原理 1.1.算法基本流程 1.2.最优划分属性的选择 二.sklearn代码实践 2.1.引入库 2.2.查看数据集信息 2.3. ...
- SKlearn学习笔记——XGBoost
SKlearn学习笔记--XGBoost 1. 概述 1.1 xgboost库与XGB的sklearn API 1.2 XGBoost的三大板块 2. 梯度提升树 2.1 提升集成算法:重要参数 n_ ...
- sklearn学习05——K-means
sklearn学习05--K-means 前言 一.K-means算法思想 二.代码实现 K-means算法 2.1.引入相关库 2.2.生成数据集 2.3.训练 + 预测 2.3.惯性指标(iner ...
- Sklearn学习-iris数据集学习
Sklearn学习-逻辑回归(iris数据集) 使用load_iris加载数据集,查看包含的keys 查看数据的列名,分类目标的名称 获取data和target,并打印各自的shape 拆分训练集和测 ...
- sklearn pipeline_我的sklearn学习经验
scikit-learn是python进行数据挖掘与分析的重要而有效的工具,学习scikit-learn最重要的资料来源就是它的官网: scikit-learn: machine learning i ...
- sklearn学习总结(超全面)
https://blog.csdn.net/fuqiuai/article/details/79495865 前言 sklearn想必不用我多介绍了,一句话,她是机器学习领域中最知名的python模块 ...
- sklearn学习(三)
简述 从学习三开始,这个系列的blog会围绕着scikit-learn上的实例进行. General Examples (一般实例) 这些都是一些简单的实例 这次只看一个(本来准备写多个的..但是看了 ...
- sklearn学习(二)
学习网站 http://scikit-learn.org/stable/tutorial/statistical_inference/index.html Statistical learning: ...
最新文章
- Linux系统分辨率设置
- HDU 6168 Numbers 思维
- 笔记:python设计模式
- html 为什么ul不撑开,给li设置float浮动属性之后,无法撑开外层ul的问题。
- Recovery真的不是难事!
- Django——百知听课笔记一
- 问题三十六:ray tracing中的Inverse Mapping(0)——概要
- Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传
- c语言回顾之指针数组和数组指针
- 802.11a/b/g/n/ac速率表
- python smtp QQ邮箱 发送附件
- 怎么免费获取帆软9.0激活码,帆软8.0激活码,如何激活
- android选择头像弹窗,仿QQ的头像选择弹出的对话框
- java多线程之Executors
- tc275的flash
- 老枪的59条制胜法则
- 实验七 3 小希练打字
- MySQL日期类型详解
- Android定制化自己的开锁界面
- 离散余弦变换 - Discrete Cosine Transform