《Python数据科学指南》——2.4 使用scikit-learn进行机器学习

2.4 使用scikit-learn进行机器学习

scikit-learn是Python中的一个全能的机器学习库,我们在本书中会大量使用它。我们使用的版本为0.15.2。你可以在命令行里调用_version_属性来检查版本,如图2-17所示。

2.4.1 准备工作

本节里,我们会演示一些scikit-learn包的功能,学习它的一些API架构,为后续章节的学习打下基础。

2.4.2 操作方法

scikit-learn提供了一个内置数据集,我们看看如何访问和使用它。

#Recipe_3a.py
from sklearn.datasets import load_iris,load_boston,make_classification
make_circles, make_moons

# Iris数据集
data = load_iris()
x = data['data']
y = data['target']
y_labels = data['target_names']
x_labels = data['feature_names']

print
print x.shape
print y.shape
print x_labels
print y_labels

# Boston数据集
data = load_boston()
x = data['data']
y = data['target']
x_labels = data['feature_names']
print
print x.shape
print y.shape
print x_labels

# 制作一些分类数据集
x,y = make_classification(n_samples=50,n_features=5, n_classes=2)

print
print x.shape
print y.shape

print x[1,:]
print y[1]

# 一些非线性数据集
x,y = make_circles()
import numpy as np
import matplotlib.pyplot as plt
plt.close('all')
plt.figure(1)
plt.scatter(x[:,0],x[:,1],c=y)

x,y = make_moons()
import numpy as np
import matplotlib.pyplot as plt
plt.figure(2)
plt.scatter(x[:,0],x[:,1],c=y)

plt.show()

我们来看看如何调用scikit-learn里的这些机器学习函数。

#Recipe_3b.py
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
# 数据预处理
x = np.asmatrix([[1,2],[2,4]])
poly = PolynomialFeatures(degree = 2)
poly.fit(x)
x_poly = poly.transform(x)

print "Original x variable shape",x.shape
print x
print
print "Transformed x variables",x_poly.shape
print x_poly

# 另一种写法
x_poly = poly.fit_transform(x)

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

data = load_iris()
x = data['data']
y = data['target']

estimator = DecisionTreeClassifier()
estimator.fit(x,y)
predicted_y = estimator.predict(x)
predicted_y_prob = estimator.predict_proba(x)
predicted_y_lprob = estimator.predict_log_proba(x)

from sklearn.pipeline import Pipeline

poly = PolynomialFeatures(n=3)
tree_estimator = DecisionTreeClassifier()

steps = [('poly',poly),('tree',tree_estimator)]
estimator = Pipeline(steps=steps)
estimator.fit(x,y)
predicted_y = estimator.predict(x)

2.4.3 工作原理

为了使用内置的数据集,我们得先加载scikit-learn库,库的模块里包含着各种各样的函数。

from sklearn.datasets import load_iris,load_boston,make_classification

第1个数据集是iris,请参见以下地址来获取更多细节信息。

https://en.wikipedia.org/wiki/Iris_flower_data_set。

这是一个由Donald Fisher先生引入的分类问题的经典数据集。

data = load_iris()
x = data['data']
y = data['target']
y_labels = data['target_names']
x_labels = data['feature_names']

我们调用的load_iris函数返回一个字典。使用合适的键,可以从这个字典对象中查询获取到自变器x、因变量y、因变量名、各个特征属性名等信息。

我们将这些信息打印出来看看它们的值,结果如图2-18所示。

print
print x.shape
print y.shape
print x_labels
print y_labels

如你所见,预测器里有150个实例和4种属性,因变量有150个实例,每个预测集合里的记录都有一个类别标签。我们接着打印输出属性名:花瓣、花萼的宽度和长度,以及类别标签。在后续章节里,我们还会多次使用这个数据集。

我们接着要看的是另一个数据集:Boston住房数据集,它属于回归问题。

# Boston数据集
data = load_boston()
x = data['data']
y = data['target']
x_labels = data['feature_names']

这个数据集的加载过程和iris基本一样,从字典的各个键也可以查询到数据的各个组成部分,包括预测器和因变量。我们打印输出这些变量来看一下,如图2-19所示。

如你所见,预测器集合里有506个实例和13种属性,因变量有506个条目。最后,我们也打印输出属性名。

scikit-learn也给我们提供了一些函数来产生随机分类的数据集,并可以指定一些需要的属性。

# 产生一些分类数据集
x,y = make_classification(n_samples=50,n_features=5, n_classes=2)

make_classification函数用来产生分类数据集。本例中,我们指定n_samples参数生成50个实例,n_features参数生成5个属性,n_classes参数生成两个类集合。请看这个函数的输出,如图2-20所示。

print x.shape
print y.shape

print x[1,:]
print y[1]

如你所见,预测器里有150个实例和5种属性,因变量有150个实例,每个预测集合里的记录都有一个类别标签。

我们将预测器集合x里的第2条记录打印出来,你会看到这是一个五维的向量,与5个我们所需的特征相关联。最后,我们把因变量y也打印出来。预测器里的第2条记录的类别标签是1。

scikit-learn也给我们提供了一些函数来产生非线性关系。

# 一些非线性数据集
x,y = make_circles()
import numpy as np
import matplotlib.pyplot as plt
plt.close('all')
plt.figure(1)
plt.scatter(x[:,0],x[:,1],c=y)

你应该已经从前面的章节中了解了pyplot,现在通过它绘制的图来帮助我们理解非线性关系。

如图2-21所示,我们的分类结果产生了两个同心圆。x是两个变量的数据集,变量y是类标签。这两个同心圆说明了预测器里两个变量的关系是非线性的。

scikit-learn里还有一个有趣的函数make_moons也能产生非线性关系。

x,y = make_moons()
import numpy as np
import matplotlib.pyplot as plt
plt.figure(2)
plt.scatter(x[:,0],x[:,1],c=y)

我们看一下它生成的图2-22来理解非线性关系。

新月图形说明了预测器集合x里的属性之间的关系是非线性的。

接下来我们要来讨论scikit-learn的API架构,使用API架构的主要优势在于它十分简洁。所有源于BaseEstimator的数据模型必须严格实现fit和transform函数。我们将从一些示例中详细了解。

我们先从scikit-learn的预处理模块开始。

import numpy as np
from sklearn.preprocessing import PolynomialFeatures

我们使用PolynomialFeatures类来演示使用scikit-learn的SDK的方便快捷之处。要了解PolynomialFeatures的更多信息,请参见:

https://en.wikipedia.org/wiki/Polynomial。

有时我们需要往预测器变量集合中增加新的变量,以判断模型精度是否提高。我们可以将已有特征的多项式作为新特证,PolynomialFeatures帮助我们实现这一目标。

# 数据预处理
x = np.asmatrix([[1,2],[2,4]])

首先,我们要创建一个数据集。本例中,数据集有两个实例和两个属性。

poly = PolynomialFeatures(degree = 2)

然后,我们将采用所需的多项式阶数来实例化PolynomialFeatures类。本例中,阶数为2。

poly.fit(x)
x_poly = poly.transform(x)

接着要介绍的是fit和transform函数。fit函数用来在数据转换时做必需的计算。本例中它是多余的,不过在本节后面部分我们会遇到一些如何使用它的示例。

transform函数接收输入数据,并基于fit函数的计算结果将输入数据进行转换。

# 换一种方式
x_poly = poly.fit_transform(x)

本例还有另外一种方式,在一个操作中调用fit和transform。我们来看看变量x初始和转换之后的数值和形态,如图2-23所示。

scikit-learn中所有实现机器学习方法的类都来自BaseEstimator,请参见:http://scikit-learn.org/stable/modules/ generated/sklearn.base.BaseEstimator.html。

BaseEstimator要求用以实现的类提供fit和transform两种方法,这样才能保持API简洁清晰。

我们再看另一个示例,从tree模块中引入Decision TreeClassifier类,它实现了决策树算法。

from sklearn.tree import DecisionTreeClassifier

我们把这个类放到实践操作中。

from sklearn.datasets import load_iris

data = load_iris()
x = data['data']
y = data['target']

estimator = DecisionTreeClassifier()
estimator.fit(x,y)
predicted_y = estimator.predict(x)
predicted_y_prob = estimator.predict_proba(x)
predicted_y_lprob = estimator.predict_log_proba(x)

我们使用iris数据集来看来怎样使用树算法。先把iris数据集加载到变量x和y中,然后把DecisionTreeClassifier实例化,接着调用fit函数,传递预测器x和因变量y来建立模型。这样就建立了一个树模型,我们现在可以用它来进行预测。我们用predict函数对给定的输入预测其类标签。如你所见,和在PolynomialFeatures里一样,我们也使用了相同的fit和predict方法。还有另外两个方法:predict_proba和predict_log_proba。前者给出预测的概率,后者给出预测概率的对数。

现在来看另一个有趣的功能pipe lining,使用这个功能,不同的机器学习方法可以被链接在一起。

from sklearn.pipeline import Pipeline

poly = PolynomialFeatures(3)
tree_estimator = DecisionTreeClassifier()

我们从实例化PolynomialFeatures和DecisionTreeClassifier数据处理规范开始。

steps = [('poly',poly),('tree',tree_estimator)]

我们先定义一个元组列表来标示我们的链接顺序。运行多项式特征生成器之后,再执行决策树。

estimator = Pipeline(steps=steps)
estimator.fit(x,y)
predicted_y = estimator.predict(x)

我们通过steps变量声明的列表将Pipeline对象实例化。现在就能像以往那样调用fit和predict方法了。

我们可以调用named_steps属性来查看模型在pipeline里的不用阶段的情况,如图2-24所示。

2.4.4 更多内容

scikit-learn里还有更多的数据集生成函数,请参见:

http://scikit-learn.org/stable/datasets/。

在使用make_circle和make_moons函数的时候,我们曾经提到可以给数据集加入许多想要的属性,如果包含了不正确的类标签,数据可能会受到轻微的损坏。下面的链接列出了许多描述这些细微差别的选项,请参见:

http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_circles.html和

http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_moons.html。

2.4.5 参考资料

第2章“Python环境”中“绘图技巧”的相关内容。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-09-20 23:16:11

《Python数据科学指南》——2.4 使用scikit-learn进行机器学习的相关文章

《Python数据科学指南》——2.2 使用NumPy库

2.2 使用NumPy库 Python中,NumPy提供了一条高效处理超大数组的途径.大多数Python科学计算库中都在内部使用NumPy处理数组和矩阵操作.在本书中,NumPy被广泛应用,我们在本节介绍它. 2.2.1 准备工作 我们先写一系列语句来操作数组和矩阵,学习如何使用NumPy.目的是让您习惯使用NumPy数组,它也是本书大多数内容的基础. 2.2.2 操作方法 我们先创建一些简单的矩阵和数组. # Recipe_1a.py # 导入NumPy库,命名为np import numpy

《Python数据科学指南》——导读

前 言 如今,我们生活在一个万物互联的世界,每天都在产生海量数据,不可能依靠人力去分析产生的所有数据并做出决策.人类的决策越来越多地被计算机辅助决策所取代,这也得益于数据科学的发展.数据科学已经深入到我们互联世界中的每个角落,市场对那些十分了解数据科学算法并且有能力用这些算法进行编程的人才需求是不断增长的.数据科学是多领域交叉的,简单列举几个:数据挖掘.机器学习.统计学等.这对那些渴望成为数据科学家以及已经从事这一领域的人们在各方面都倍感压力.把算法当成黑盒子应用到决策系统里,可能会适得其反.面

《Python数据科学指南》——1.2 使用字典对象

1.2 使用字典对象 在Python语言中,容器是一种对象,它能够容纳任意数量.任意类型的对象.它可以对子对象进行操作,还可以迭代操作.字典.元组.列表还有集合都是容器对象.在collections模块中,Python提供了更多的容器类型.在这一节中,我们先来仔细了解字典. 1.2.1 准备工作 我们先通过一个Python的脚本示例来理解字典是如何操作的,这段脚本用来统计词频,也就是每个词在给定的文本中出现的次数. 1.2.2 操作方法 下面的示例演示了在Python中对字典对象如何操作.通过对

《Python数据科学指南》——1.3 使用字典的字典

1.3 使用字典的字典 我们之前提到,为了完成目标,你得创造性地应用各类数据结构,这样才能发挥它们的威力.接下来,我们通过一个实例来帮助理解"字典的字典". 1.3.1 准备工作 请看表1-1. 第1列中列出了3个用户,其他列都是电影,单元格里是每个用户给电影的评分.我们要把这些数据放到内存中,这样大型程序的其他部分也能方便地访问,此时我们将使用"字典的字典". 1.3.2 操作方法 我们通过匿名函数来创建一个user_movie_rating的字典对象,以此展示&

《Python数据科学指南》——第1章 Python在数据科学中的应用 1.1 简介

第1章 Python在数据科学中的应用 在这一章里,我们将探讨以下主题. 使用字典对象 使用字典的字典 使用元组 使用集合 写一个列表 从另一个列表创建列表--列表推导 使用迭代器 生成一个迭代器和生成器 使用可迭代对象 将函数作为变量传递 在函数中嵌入函数 将函数作为参数传递 返回一个函数 使用装饰器改变函数行为 使用lambda创造匿名函数 使用映射函数 使用过滤器 使用zip和izip函数 从表格数据使用数组 对列进行预处理 列表排序 采用键排序 使用itertools 1.1 简介 Py

《Python数据科学指南》——1.20 从表格数据使用数组

1.20 从表格数据使用数组 数据科学的应用程序要成功解决一个问题,必须先找到适当的处理数据的方法.例如在机器学习中对数据进行预测或分类,要么采用有监督的方法,要么采用无监督的方法.而在此之前,传输数据,把数据清洗到匹配算法,可能已经花费了很长的时间. 通常,有很多种方法对数据进行整理使之适合数据科学程序进行处理,数据科学程序开发者首先面对的挑战是如何访问数据,并用Python的数据结构让这些数据持续可用.掌握使用Python访问数据的诀窍是非常有用的,能让你避过纷扰,直接面对问题的核心内容.

《Python数据科学指南》——1.4 使用元组

1.4 使用元组 在Python中,元组是一种顺序型的容器对象.元组是不可变的,元组中的元素由逗号分隔开,可以对不同类别构成的对象进行排序,不允许插入操作,支持以下操作. in和not in. 比较.串联.切片和索引.min ()和max (). 1.4.1 准备工作 我们讲解字典的时候,描述了完整的功能,对于元组,我们通过一些小段的代码来聚焦于元组的创建与维护操作. 1.4.2 操作方法 先让我们看看一些元组创建和维护的示例代码. # 1.创建一个元组 a_tuple = (1,2,'a')

《Python数据科学指南》——1.8 使用迭代器

1.8 使用迭代器 毫无疑问,对于数据科学的程序而言,数据是极其重要的输入.数据的大小是可变的,有些能装载到内存中,有些则不能.而记录访问架构也是随一种数据格式到另一种而变化.有趣的是,不同的算法处理数据时,需要的是可变长度的组块.例如,假如你在写一个随机梯度下降的算法,你希望在每个时间片传送5000条记录的数据块,如果你对如何访问数据.理解数据格式.依次传送数据.给调用者需要的数据等流程有着清晰的概念,那你才能成功.这样能让你写出清晰的代码.大多数时候,最有趣的部分是我们如何处理数据,而不是我

《Python数据科学指南》——1.10 使用可迭代对象

1.10 使用可迭代对象 可迭代对象和生成器十分相似,但是有一个重要的区别:我们可以重复地访问一个可迭代对象,即使我们已经访问完了序列中的所有元素,我们还可以从头重新访问它,这和生成器是完全不同的. 如果不保持任何状态,它们就是基于对象的生成器.所有带有iter方法的类,在用来产生数据时,都可以被作为无状态对象生成器来使用. 1.10.1 准备工作 我们通过一个简单的示例来理解可迭代对象.如果理解了之前介绍的生成器和迭代器,你也能很容易地理解这个概念. 1.10.2 操作方法 我们来创建一个简单

《Python数据科学指南》——1.19 使用zip和izip函数

1.19 使用zip和izip函数 zip函数将两个相同长度的集合合并成对,它是Python的内置函数. 1.19.1 准备工作 我们通过一个简单示例来演示zip函数. 1.19.2 操作方法 我们传递两个序列给zip函数,并打印输出. print zip(range(1,5),range(1,5)) 1.19.3 工作原理 本例中zip函数的两个参数是两个列表,这两个列表都是由从1到5的数值组成.range函数有3个参数:起始数值.结束数值和步长,默认步长为1.本例中,我们分别把1和5作为列表