Scikit Learn 简明教程

Scikit Learn - Estimator API

在本章中,我们将学习 Estimator API (应用程序编程接口)。让我们从了解什么是估计器 API 开始。

What is Estimator API

它是 Scikit-learn 实现的主要 API 之一。它为广泛的机器学习应用程序提供了一致的接口,因此 Scikit-Learn 中的所有机器学习算法都是通过估计器 API 实现的。从数据学习的对象(拟合数据)是一个估计器。它可用于任何算法,例如分类、回归、聚类,甚至可用于从原始数据中提取有用特征的转换器。

为了拟合数据,所有估计器对象都会公开一个接收显示为以下形式的数据集的 fit 方法 −

estimator.fit(data)

接下来,估计器所有参数均可在通过相应属性实例化后设置,如下所示。

estimator = Estimator (param1=1, param2=2)
estimator.param1

上面的输出将是 1。

一旦数据被拟合使用估算器,则从手头数据中估算参数。现在,所有估算的参数将作为估算器对象以一个下划线结尾的属性,如下所示 −

estimator.estimated_param_

Use of Estimator API

估算器的主要用途如下 −

Estimation and decoding of a model

估算器对象用于模型的估算和解码。此外,该模型被估算为以下内容的确定性函数 −

  1. 对象构建中提供的参数。

  2. 如果估算器的 random_state 参数设为无,则为全局随机状态 (numpy.random)。

  3. 传递到 fit, fit_transform, or fit_predict 最近一次调用的任何数据。

  4. partial_fit 一系列调用中传递的任何数据。

Mapping non-rectangular data representation into rectangular data

它将非矩形数据表示映射到矩形数据中。简单来说,它接受输入,其中每个样本并不表示为固定长度的类似数组的对象,并将每个样本的特征生成为类似数组的对象。

Distinction between core and outlying samples

它使用以下方法构建核心和离群样本之间的区别 −

  1. fit

  2. fit_predict if transductive

  3. predict if inductive

Guiding Principles

在设计 Scikit-Learn API 时,遵循以下指导原则 −

Consistency

此原则指出,所有对象应共享从一系列方法中提取的通用接口。文档应保持一致。

Limited object hierarchy

此指导原则指出 −

  1. 算法应由 Python 类表示

  2. 数据集应表示为标准格式,如 NumPy 数组、Pandas 数据框、SciPy 稀疏矩阵。

  3. 参数名称应使用标准 Python 字符串。

Composition

我们知道,ML 算法可表示为多项基本算法的序列。Scikit-learn 在需要时利用这些基本算法。

Sensible defaults

根据此原则,Scikit-learn 库在 ML 模型需要用户指定的参数时,定义适当的默认值。

Inspection

根据此指导原则,暴露每个指定的参数值为公共属性。

Steps in using Estimator API

下列是使用 Scikit-Learn 估计器 API 的步骤 −

Step 1: Choose a class of model

在第一步中,我们需要选择模型类。可以通过从 Scikit-learn 导入适当的估计器类来完成。

Step 2: Choose model hyperparameters

在这一步中,我们需要选择类模型超参数。可以通过用所需值初始化类来完成。

Step 3: Arranging the data

接下来,我们需要将数据整理到特征矩阵 (X) 和目标向量 (y) 中。

Step 4: Model Fitting

现在,我们需要将模型拟合到你的数据。可以通过调用模型实例的 fit() 方法来完成。

Step 5: Applying the model

拟合模型后,我们可以将它应用到新数据。对于监督学习,使用 predict() 方法来预测未知数据的标签。而对于无监督学习,使用 predict()transform() 来推断数据的属性。

Supervised Learning Example

这里,作为此过程的一个示例,我们取将线拟合到 (x,y) 数据(即 simple linear regression )的常见案例。

首先,我们需要加载数据集,我们正在使用鸢尾花数据集 −

Example

import seaborn as sns
iris = sns.load_dataset('iris')
X_iris = iris.drop('species', axis = 1)
X_iris.shape

Output

(150, 4)

Example

y_iris = iris['species']
y_iris.shape

Output

(150,)

Example

现在,对于此回归示例,我们准备使用以下示例数据 −

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
rng = np.random.RandomState(35)
x = 10*rng.rand(40)
y = 2*x-1+rng.randn(40)
plt.scatter(x,y);

Output

supervised

因此,我们拥有上述数据来进行线性回归示例。

现在,我们可以使用此数据来应用上述步骤。

Choose a class of model

这里,我们计算一个简单的线性回归模型,需要导入线性回归类,如下所示 −

from sklearn.linear_model import LinearRegression

Choose model hyperparameters

一旦我们选择了模型类,我们就需要做出一些重要的选择,这些选择通常表示为超参数或模型拟合到数据之前必须设置的参数。这里,对于线性回归的此示例,我们希望使用 fit_intercept 超参数来拟合截距,如下所示 −

Example

model = LinearRegression(fit_intercept = True)
model

Output

LinearRegression(copy_X = True, fit_intercept = True, n_jobs = None, normalize = False)

Arranging the data

现在,正如我们所知,我们的目标变量 y 处于正确形式,即长度为 n_samples 的 1-D 数组。但是,我们需要重新整形特征矩阵 X 以使其成为大小为 [n_samples, n_features] 的矩阵。可按如下方式进行 −

Example

X = x[:, np.newaxis]
X.shape

Output

(40, 1)

Model fitting

一旦我们整理好数据,就可以拟合模型,即可以将我们的模型应用于数据。这可以通过 fit() 方法来完成,如下所示 −

Example

model.fit(X, y)

Output

LinearRegression(copy_X = True, fit_intercept = True, n_jobs = None,normalize = False)

在 Scikit-learn 中, fit() 进程有一些尾随的下划线。

对于此示例,下方的参数显示了数据的简单线性拟合的斜率 −

Example

model.coef_

Output

array([1.99839352])

下方的参数表示数据的简单线性拟合的截距 −

Example

model.intercept_

Output

-0.9895459457775022

Applying the model to new data

在训练模型后,我们可以将它应用到新数据。正如监督机器学习的主要任务是基于不属于训练集部分的新数据来评估模型。可按如下方式使用 predict() 方法来完成 −

Example

xfit = np.linspace(-1, 11)
Xfit = xfit[:, np.newaxis]
yfit = model.predict(Xfit)
plt.scatter(x, y)
plt.plot(xfit, yfit);

Output

model new data

Complete working/executable example

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

iris = sns.load_dataset('iris')
X_iris = iris.drop('species', axis = 1)
X_iris.shape
y_iris = iris['species']
y_iris.shape

rng = np.random.RandomState(35)
x = 10*rng.rand(40)
y = 2*x-1+rng.randn(40)
plt.scatter(x,y);
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True)
model
X = x[:, np.newaxis]
X.shape

model.fit(X, y)
model.coef_
model.intercept_

xfit = np.linspace(-1, 11)
Xfit = xfit[:, np.newaxis]
yfit = model.predict(Xfit)
plt.scatter(x, y)
plt.plot(xfit, yfit);

Unsupervised Learning Example

在此,作为一个处理流程示例,我们取一个典型案例来降低 Iris 数据集的维度,以便更方便地对它进行可视化。对于本示例,我们将使用主成分分析 (PCA),一种快速线性降维技术。

像上面给出的示例一样,我们可以加载和绘制 iris 数据集中的随机数据。然后,我们可以按照以下步骤执行操作:

Choose a class of model

from sklearn.decomposition import PCA

Choose model hyperparameters

Example

model = PCA(n_components=2)
model

Output

PCA(copy = True, iterated_power = 'auto', n_components = 2, random_state = None,
   svd_solver = 'auto', tol = 0.0, whiten = False)

Model fitting

Example

model.fit(X_iris)

Output

PCA(copy = True, iterated_power = 'auto', n_components = 2, random_state = None,
   svd_solver = 'auto', tol = 0.0, whiten = False)

Transform the data to two-dimensional

Example

X_2D = model.transform(X_iris)

现在,我们可以按如下方式绘制结果:

Output

iris['PCA1'] = X_2D[:, 0]
iris['PCA2'] = X_2D[:, 1]
sns.lmplot("PCA1", "PCA2", hue = 'species', data = iris, fit_reg = False);

Output

two dimensional

Complete working/executable example

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

iris = sns.load_dataset('iris')
X_iris = iris.drop('species', axis = 1)
X_iris.shape
y_iris = iris['species']
y_iris.shape
rng = np.random.RandomState(35)
x = 10*rng.rand(40)
y = 2*x-1+rng.randn(40)
plt.scatter(x,y);
from sklearn.decomposition import PCA

model = PCA(n_components=2)
model
model.fit(X_iris)
X_2D = model.transform(X_iris)
iris['PCA1'] = X_2D[:, 0]
iris['PCA2'] = X_2D[:, 1]
sns.lmplot("PCA1", "PCA2", hue='species', data=iris, fit_reg=False);