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

简介:

本节书摘来自异步社区《Python数据科学指南》一书中的第2章,第2.4节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

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

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


b62204e0fa0ce6c36f214978471ab66305e442a9

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


02e8bb278de5923930f89eedc0a43b918845c059

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

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

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

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


b74e79f74b8aa6cd2583e440a7b9b70b826de2a6

如你所见,预测器集合里有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]


5253a7319f2e40b3ccf8e0aa2753c7b3f524e959

如你所见,预测器里有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是类标签。这两个同心圆说明了预测器里两个变量的关系是非线性的。


7824dcb37f0c1c4fb7eb04dcd61a82ed3f438b92

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来理解非线性关系。


17f6acc1800f7c243ec8960f5c36d93a61cf19ef

新月图形说明了预测器集合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所示。


a79b788d050b3efbc9701a5797d15f988081c0f0

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所示。


cbc476497b63bdbe10d26bcc1c1910ebe94e306c

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环境”中“绘图技巧”的相关内容。

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

相关文章
|
1天前
|
机器学习/深度学习 人工智能 算法
利用Python实现简单的机器学习算法——线性回归
本文介绍了如何使用Python语言和相关库,通过实现线性回归算法来进行简单的机器学习模型训练和预测。通过详细的代码示例和解释,帮助读者了解机器学习中的基础概念和实践操作。
|
1天前
|
机器学习/深度学习 数据处理 算法框架/工具
Python 与机器学习:构建高效数据处理流程
在当今信息爆炸的时代,大数据处理和机器学习应用的需求日益增长。本文将介绍如何利用Python语言及其丰富的库来构建高效的数据处理流程,从而为机器学习模型的训练和优化提供可靠的数据基础。
10 2
|
2天前
|
机器学习/深度学习 算法 Java
现代数据科学中的机器学习技术发展与应用
本文探讨了现代数据科学领域中机器学习技术的发展和应用。我们介绍了机器学习的基本概念和原理,并探讨了它在前端、后端、Java、Python、C以及数据库等多种技术领域的具体应用。通过深入剖析不同领域的案例研究,我们展示了机器学习在解决实际问题和推动技术创新方面的巨大潜力。最后,我们对未来机器学习技术的发展趋势进行了展望。
|
10天前
|
Python
在python中使用SimpleImputer类(来自scikit-learn库)
在python中使用SimpleImputer类(来自scikit-learn库)
106 46
|
14天前
|
机器学习/深度学习 JavaScript Python
GEE机器学习——混淆矩阵Classifier.confusionMatrix()和errorMatrix()和exlain()的用法(js和python代码)
GEE机器学习——混淆矩阵Classifier.confusionMatrix()和errorMatrix()和exlain()的用法(js和python代码)
11 0
|
14天前
|
机器学习/深度学习 自然语言处理 JavaScript
GEE机器学习——最大熵分类器案例分析(JavaScript和python代码)
GEE机器学习——最大熵分类器案例分析(JavaScript和python代码)
15 0
|
14天前
|
机器学习/深度学习 搜索推荐 算法
构建推荐系统:Python 与机器学习
推荐系统是一种利用机器学习算法和用户的历史行为数据来预测用户可能感兴趣的内容的技术。在当今的数字化时代,推荐系统已经成为许多互联网应用的核心组件,如电子商务、社交媒体和在线娱乐等。在 Python 中,我们可以使用各种机器学习库和工具来构建和实现推荐系统。
|
17天前
|
机器学习/深度学习 数据挖掘 程序员
深入理解Python协程:提升并发编程效率基于Python的机器学习入门:从理论到实践
本文旨在探讨Python协程(Coroutine)的内部机制及其在并发编程中的应用。区别于传统的线程和进程,协程提供了一种更轻量级、高效的并发编程模式。通过深入分析协程的工作原理,本文将展示如何利用协程优化程序性能,实现高效的异步任务处理。我们将通过实例探讨协程的创建、事件循环的管理、以及与异步IO的集成,为读者提供一套完整的协程应用方案。此外,本文还将对比协程与其他并发模型(如多线程和多进程)的优劣,帮助读者全面理解协程在现代编程中的重要性。 在本文中,我们将深入探讨机器学习的核心概念,并通过Python实现其基础应用。不同于传统的技术文章摘要,我们希望通过一个故事性的引入,让读者感受到
|
17天前
|
机器学习/深度学习 数据采集 TensorFlow
Python与机器学习:开启智能应用的新纪元
在数字化时代,机器学习技术正迅速改变我们的世界,成为推动许多行业进步的关键力量。Python,作为一种高效、易学的编程语言,已经成为机器学习领域的首选工具。本文旨在探讨Python在机器学习领域的应用,并通过介绍其生态系统中的几个关键库(如NumPy、Pandas、Scikit-learn、TensorFlow等),展示如何利用这些工具开发智能应用。通过具体实例,我们将深入了解Python在数据处理、模型构建、训练及评估方面的强大功能,以及它如何帮助研究人员和开发者在机器学习项目中实现快速迭代和创新。
|
17天前
|
机器学习/深度学习 算法 数据库
深入浅出:利用Python与机器学习优化数据库性能
本文介绍了一种创新的方法,结合Python编程语言和机器学习技术,来优化数据库性能。传统的数据库性能优化方法往往依赖于数据库管理员(DBA)的经验和直觉,而本文所提出的方法通过自动化的方式,利用机器学习模型对数据库查询进行分析和优化,从而实现更高效、更智能的数据库性能管理。本文首先介绍了使用Python进行数据库操作的基础知识,然后详细阐述了如何应用机器学习算法来预测和改善数据库查询性能,最后通过一个实际案例展示了该方法的有效性。本文旨在为数据库管理员、开发者以及对数据库性能优化感兴趣的读者提供一种全新的视角和工具。

相关产品

  • 云迁移中心