文档章节

sklearn 快速入门 - 0.18 中文翻译

片刻
 片刻
发布于 2017/07/11 19:30
字数 2773
阅读 168
收藏 0
点赞 0
评论 0

机器学习问题的简要介绍,以及如何使用scikit-learn来解决这些问题。介绍基本概念和惯例。

原文链接 : http://scikit-learn.org/stable/tutorial/basic/tutorial.html

译文链接 : http://cwiki.apachecn.org/pages/viewpage.action?pageId=10813673

贡献者 : 片刻 ApacheCN Apache中文网

在本节中,我们介绍 我们在scikit-learn学习中使用的机器学习词汇,并给出一个简单的学习示例。

机器学习:问题设置

一般来说,学习问题考虑了一组n 个数据样本,然后尝试预测未知数据的属性。如果每个样本多于单个数字,并且例如多维条目(又称多变量 数据),则称其具有多个属性或特征

我们可以分开几个大类的学习问题:

  • 监督学习,其中数据带有我们想要预测的附加属性(点击此处 进入scikit-learn监督学习页面)。这个问题可以是:

    • 分类:样本属于两个或更多类,我们想从已经标记的数据中学习如何预测未标记数据的类别。分类问题的一个例子是手写数字识别示例,其目的是将每个输入向量分配给有限数目的离散类别之一。考虑分类的另一种方法是作为监督学习的离散(而不是连续的)形式,其中有一个类型有限,并且对于所提供的n个样本中的每一个,一个是尝试用正确的类别或类别来标记它们。
    • 回归:如果期望的输出由一个或多个连续变量组成,则该任务称为回归。回归问题的一个例子是预测鲑鱼的长度是其年龄和体重的函数。

  • 无监督学习,其中训练数据由没有任何相应目标值的一组输入向量x组成。这种问题的目标可能是在数据中发现类似示例的组,称为聚类,或者确定输入空间内的数据分布,称为 密度估计,或从高维数据投影数据空间缩小到两维或三维以进行可视化 (点击此处 转到scikit-learn无监督学习页面)。

训练集和测试

机器学习是关于学习数据集的一些属性并将其应用于新数据。这就是为什么在机器的普遍做法学习评价的算法是手头上的数据分成两组,一个是我们所说的训练集上,我们了解到,我们称之为数据属性和一个测试集 上,我们测试这些属性。

 

加载示例数据集

scikit-learn提供了一些标准数据集,例如 用于分类的 虹膜数字数据集和波士顿房价回归数据集

在下文中,我们从shell中启动一个Python解释器,然后加载irisdigits数据集。我们的符号约定是 $表示shell提示符,而>>>表示python解释器提示符:

$ python

>>> from sklearn import datasets

>>> iris = datasets.load_iris()

>>> digits = datasets.load_digits() 

数据集是一个类似字典的对象,它保存有关数据的所有数据和一些元数据。该数据存储在.data成员中,它是一个数组。在监督问题的情况下,一个或多个响应变量存储在成员中。有关不同数据集的更多详细信息,请参见专用部分n_samples, n_features.target 

例如,在数字数据集的情况下digits.data,可以访问可用于对数字样本进行分类的功能:

>>> 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给出数字数据集的基本真相,即我们正在尝试学习的每个数字图像对应的数字:

>>> digits.target

array([012, ..., 898]) 

数据阵列的形状

数据总是2D数组,形状虽然原始数据可能有不同的形状。在数字的情况下,每个原始样本是形状的图像,可以使用以下方式访问:(n_samples, n_features)(8, 8)

>>> digits.images[0]

array([[  0.,   0.,   5.,  13.,   9.,   1.,   0.,   0.],

       [  0.,   0.,  13.,  15.,  10.,  15.,   5.,   0.],

       [  0.,   3.,  15.,   2.,   0.,  11.,   8.,   0.],

       [  0.,   4.,  12.,   0.,   0.,   8.,   8.,   0.],

       [  0.,   5.,   8.,   0.,   0.,   9.,   8.,   0.],

       [  0.,   4.,  11.,   0.,   1.,  12.,   7.,   0.],

       [  0.,   2.,  14.,   5.,  10.,  12.,   0.,   0.],

       [  0.,   0.,   6.,  13.,  10.,   0.,   0.,   0.]]) 

数据集上简单示例说明了如何从原始问题开始,可以在scikit-learn中形成消费数据。

从外部数据集加载

要从外部数据集加载,请参阅加载外部数据集

 

学习和预测

在数字数据集的情况下,任务是给出图像来预测其表示的数字。我们给出了10个可能类(数字从零到九)中的每一个的样本,我们在其上拟合一个 估计器,以便能够预测 看不见的样本所属的类。

在scikit-learn,分类的估计是实现方法的Python对象和。fit(X, y)predict(T)

估计器的一个例子是sklearn.svm.SVC实现支持向量分类的类。估计器的构造函数作为模型的参数作为参数,但目前我们将把估计器视为黑盒子:

>>> from sklearn import svm

>>> clf = svm.SVC(gamma=0.001, C=100.

选择模型的参数

在这个例子中,我们设置gamma手动的值。通过使用诸如网格搜索交叉验证等工具,可以自动找到参数的良好值。

 

我们称之为我们的估计器实例clf,因为它是一个分类器。它现在必须适应模型,也就是说,它必须从模型中学习。这是通过将我们的训练集传递给该fit方法来完成的。作为一个训练集,让我们使用除最后一个数据集的所有图像。我们用[:-1]Python语法选择这个训练集,它产生一个包含除最后一个条目之外的所有数组的新数组digits.data

>>> clf.fit(digits.data[:-1], digits.target[:-1]) 

SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,

  decision_function_shape=None, degree=3, gamma=0.001, kernel='rbf',

  max_iter=-1, probability=False, random_state=None, shrinking=True,

  tol=0.001, verbose=False

现在,您可以预测新值,特别是可以向分类器询问digits数据集中最后一个图像的数字是什么,我们还没有用来对分类器进行训练:

>>> clf.predict(digits.data[-1:])

array([8]) 

相应的图像如下:

正如你所看到的,这是一项具有挑战性的任务:图像分辨率差。你同意分类器吗?

这个分类问题的一个完整例子可以作为一个例子,您可以运行和学习: 识别手写数字

 

模型持久化

可以通过使用Python的内置持久化模型(即pickle)将模型保存在scikit中:

>>> from sklearn import svm

>>> from sklearn import datasets

>>> clf = svm.SVC()

>>> iris = datasets.load_iris()

>>> X, y = iris.data, iris.target

>>> clf.fit(X, y) 

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,

  decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',

  max_iter=-1, probability=False, random_state=None, shrinking=True,

  tol=0.001, verbose=False)

 

>>> import pickle

>>> s = pickle.dumps(clf)

>>> clf2 = pickle.loads(s)

>>> clf2.predict(X[0:1])

array([0])

>>> y[0]

0 

在scikit的具体情况下,使用joblib替换pickle(joblib.dumpjoblib.load)可能会更有意思,这对大数据更有效,但只能腌制到磁盘而不是字符串:

>>> from sklearn.externals import joblib

>>> joblib.dump(clf, 'filename.pkl')  

之后,您可以加载腌制模型(可能在另一个Python进程中):

>>> clf = joblib.load('filename.pkl')  

注意:joblib.dump并且joblib.load函数也接受类似文件的对象而不是文件名。有关Joblib的数据持久性的更多信息,请点击此处

请注意,泡菜有一些安全性和可维护性问题。有关使用scikit-learn的模型持久的更多详细信息,请参阅模型持久性部分。

 

约定

scikit-learn估计器遵循某些规则,使其行为更具预测性。

类型转换

除非另有规定,输入将被转换为float64

>>> import numpy as np

>>> from sklearn import random_projection

 

>>> rng = np.random.RandomState(0)

>>> X = rng.rand(102000)

>>> X = np.array(X, dtype='float32')

>>> X.dtype

dtype('float32')

 

>>> transformer = random_projection.GaussianRandomProjection()

>>> X_new = transformer.fit_transform(X)

>>> X_new.dtype

dtype('float64'

在这个例子中,Xfloat32,它被转换为float64通过 fit_transform(X)

回归目标被归结为float64,维护分类目标:

>>> from sklearn import datasets

>>> from sklearn.svm import SVC

>>> iris = datasets.load_iris()

>>> clf = SVC()

>>> clf.fit(iris.data, iris.target) 

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,

  decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',

  max_iter=-1, probability=False, random_state=None, shrinking=True,

  tol=0.001, verbose=False)

 

>>> list(clf.predict(iris.data[:3]))

[000]

 

>>> clf.fit(iris.data, iris.target_names[iris.target]) 

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,

  decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',

  max_iter=-1, probability=False, random_state=None, shrinking=True,

  tol=0.001, verbose=False)

 

>>> list(clf.predict(iris.data[:3])) 

['setosa''setosa''setosa'

这里,第一个predict()返回一个整数数组,因为iris.target 使用了一个整数数组fit。第二个predict()返回一个字符串数组,因为iris.target_names是用于拟合。

修改和更新参数

估计器的超参数可以在通过该sklearn.pipeline.Pipeline.set_params方法构建之后进行更新。fit() 多次呼叫将覆盖任何以前的内容fit()

>>> import numpy as np

>>> from sklearn.svm import SVC

 

>>> rng = np.random.RandomState(0)

>>> X = rng.rand(10010)

>>> y = rng.binomial(10.5100)

>>> X_test = rng.rand(510)

 

>>> clf = SVC()

>>> clf.set_params(kernel='linear').fit(X, y) 

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,

  decision_function_shape=None, degree=3, gamma='auto', kernel='linear',

  max_iter=-1, probability=False, random_state=None, shrinking=True,

  tol=0.001, verbose=False)

>>> clf.predict(X_test)

array([10110])

 

>>> clf.set_params(kernel='rbf').fit(X, y) 

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,

  decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',

  max_iter=-1, probability=False, random_state=None, shrinking=True,

  tol=0.001, verbose=False)

>>> clf.predict(X_test)

array([00010]) 

在这里,默认内核rbf首先被改变到linear估计器被构造之后SVC(),并且改回到rbf重新设计估计器并进行第二预测。

多类与多标签拟合

使用时,所执行的学习和预测任务取决于适合的目标数据的格式:multiclass classifiers

 

>>> from sklearn.svm import SVC

>>> from sklearn.multiclass import OneVsRestClassifier

>>> from sklearn.preprocessing import LabelBinarizer

 

>>> X = [[12], [24], [45], [32], [31]]

>>> y = [00112]

 

>>> classif = OneVsRestClassifier(estimator=SVC(random_state=0))

>>> classif.fit(X, y).predict(X)

array([00112]) 

在上述情况下,分类器适合于1d类数组的多类标签,predict()因此该方法提供了相应的多类预测。还可以使用二维标签二维数组:

>>> y = LabelBinarizer().fit_transform(y)

>>> classif.fit(X, y).predict(X)

array([[100],

       [100],

       [010],

       [000],

       [000]]) 

这里,分类器是fit() 上的2D二进制标记表示y,使用LabelBinarizer。在这种情况下,predict()返回一个表示相应多重标签预测的2d数组。

请注意,第四个和第五个实例返回所有零,表示它们不匹配三个标签之一fit。使用multilabel输出,类似地可以为一个实例分配多个标签:

>> from sklearn.preprocessing import MultiLabelBinarizer

>> y = [[01], [02], [13], [023], [24]]

>> y = preprocessing.MultiLabelBinarizer().fit_transform(y)

>> classif.fit(X, y).predict(X)

array([[11000],

       [10100],

       [01010],

       [10110],

       [00101]]) 

在这种情况下,分类器适合每个分配多个标签的实例。所述MultiLabelBinarizer用于multilabels的2D阵列以二进制化fit时。因此, predict()返回具有每个实例的多个预测标签的2d数组。

© 著作权归作者所有

共有 人打赏支持
片刻
粉丝 93
博文 268
码字总数 306559
作品 0
海淀
高级程序员
Scikit-Learn (Sklearn) 中文文档 0.19

Scikit-Learn (Sklearn) 中文文档 0.19 scikit-learn 是基于 Python 语言的机器学习工具。 简单高效的数据挖掘和数据分析工具 可供大家在各种环境中重复使用 建立在 NumPy ,SciPy 和 matplo...

wizardforcel ⋅ 2017/12/10 ⋅ 0

Scikit-Learn (Sklearn) 中文文档 0.19

Scikit-Learn (Sklearn) 中文文档 0.19 scikit-learn 是基于 Python 语言的机器学习工具。 简单高效的数据挖掘和数据分析工具 可供大家在各种环境中重复使用 建立在 NumPy ,SciPy 和 matplo...

龙哥盟飞龙 ⋅ 2017/12/10 ⋅ 0

开源电子书

目录 语言无关类 操作系统 智能系统 分布式系统 编译原理 函数式概念 计算机图形学 WEB服务器 版本控制 编辑器 NoSQL PostgreSQL MySQL 管理和监控 项目相关 设计模式 Web 大数据 编程艺术 ...

zting科技 ⋅ 2017/12/11 ⋅ 0

免费的编程中文书籍索引【收藏速度】

语言无关类 优质博客 PyTab在线手册中心 ImportNew 廖雪峰的官方网站 程序员博客墙 操作系统 开源世界旅行手册 鸟哥的Linux私房菜 Linux 系统高级编程 The Linux Command Line (中英文版) L...

yonghu86 ⋅ 2015/04/15 ⋅ 0

Fanta/free-programming-books-zh_CN

免费的编程中文书籍索引 免费的编程中文书籍索引,欢迎投稿。 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版。 stackoverflow 上的程序员应该阅读的非编程类书籍有哪些? 中文版...

Fanta ⋅ 2016/11/14 ⋅ 0

总有你要的编程书单(GitHub )

目录 IDE IntelliJ IDEA 简体中文专题教程 MySQL 21分钟MySQL入门教程 MySQL索引背后的数据结构及算法原理 NoSQL Disque 使用教程 Neo4j .rb 中文資源 Redis 命令参考 Redis 设计与实现 The ...

汇智网 ⋅ 2017/11/22 ⋅ 0

free-programming-books-zh.md

语言无关MySQL NoSQL PostgreSQL Web WEB服务器 其它 函数式概念 分布式系统 在线教育 大数据 操作系统 数据库 智能系统 正则表达式 版本控制 程序员杂谈 管理和监控 编程艺术 编译原理 编辑...

银月光海 ⋅ 2016/05/20 ⋅ 0

PHP版 RabbitMQ官方中文入门教程

工作中用到 RabbitMQ,但是RabbitMQ官方的 Tutorials 是英文Python和Jave的,官网的教程很好,正好最近业余在撸Python,所以直接来搞个PHP版本的,仅供PHP菜鸟一起来入门学习,如有错误和问题...

Yuansir ⋅ 2013/06/03 ⋅ 0

Expression Blend实例中文教程系列文章汇总

Silverlight经历3年多的发展,从当初的1.0版本到现在4.0,已经逐步趋向成熟。当前市面上关于Silverlight开发的中文资料很少,介绍Expression Blend更是少之又少,为了让更多开发人员学习和了...

冷秋寒 ⋅ 2010/04/15 ⋅ 0

迷渡:免费的编程中文书籍索引

本文之前发布过,近半年后,本文作者(迷渡,JustJavaC)大幅度进行了更新,因此再次分享给大家。感谢 @justjavac 和众多的分享者!感谢写作这些文档、手册的人们! 语言无关类 操作系统 开源...

山哥 ⋅ 2015/01/22 ⋅ 4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 25分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 45分钟前 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 58分钟前 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部