Scikit Learn 估算器(Estimator )API


在本章中,我们将了解估算器 API(应用程序接口)。让我们首先了解什么是 Estimator API。

什么是估算器 API


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

为了拟合数据,所有 estimator 对象都公开了一个 fit 方法,该方法采用如下所示的数据集:

estimator.fit(data)

接下来,当通过相应的属性实例化时,可以设置估计器的所有参数,如下所示。

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

上面的输出将是1。

一旦数据用估计器拟合,参数就从手头的数据中估计出来。现在,所有估计的参数将是以下划线结尾的 estimator 对象的属性,如下所示:

estimator.estimated_param_

Estimator API 的使用


估计器的主要用途如下:

模型的估计和解码

Estimator 对象用于模型的估计和解码。此外,该模型被估计为以下的确定性函数:

  • 在对象构造中提供的参数。

  • 如果估计器的 random_state 参数设置为 none,则为全局随机状态 (numpy.random)。

  • 传递给最近一次调用的任何数据fit、fit_transform fit_predict

  • 在调用序列中传递的任何数据部分拟合

将非矩形数据表示映射为矩形数据

它将非矩形数据表示映射为矩形数据。简而言之,它接受输入,其中每个样本不表示为固定长度的类数组对象,并为每个样本生成一个类数组对象。

核心样本和外围样本的区别

它通过使用以下方法对核心和外围样本之间的区别进行建模:

  • fit

  • fit_predict 如果转导

  • 预测是否归纳

指导原则


在设计 Scikit-Learn API 时,牢记以下指导原则:

一致性

该原则指出,所有对象都应共享从一组有限的方法中提取的公共接口。文档也应该是一致的。

有限的对象层次结构

这个指导原则说:

  • 算法应由 Python 类表示

  • 数据集应该以标准格式表示,如 NumPy 数组、Pandas DataFrames、SciPy 稀疏矩阵。

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

组合

众所周知,机器学习算法可以表示为许多基本算法的序列, Scikit-learn 会在需要时使用这些基本算法。

合理的默认值

根据这一原则,只要 ML 模型需要用户指定的参数,Scikit-learn 库就会定义一个适当的默认值。

检查

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

使用 Estimator API 的步骤


以下是使用 Scikit-Learn estimator API 的步骤:

第 1 步:选择一类模型

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

第 2 步:选择模型超参数

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

第 3 步:排列数据

接下来,我们需要将数据排列成特征矩阵(X)和目标向量(y)。

第 4 步:模型拟合

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

第 5 步:应用模型

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

监督学习示例


在这里,作为这个过程的一个例子,我们采取的是对(x,y)数据进行直线拟合,即简单线性回归(simple linear regression)

首先,我们需要加载数据集,我们使用的是 iris 数据集:

import seaborn as sns
iris = sns.load_dataset('iris')
X_iris = iris.drop('species', axis = 1)
X_iris.shape
(150, 4)
y_iris = iris['species']
y_iris.shape
(150,)

现在,对于这个回归示例,我们将使用以下示例数据:

%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);

Supervised

因此,我们有上述线性回归示例的数据。

现在,有了这些数据,我们就可以应用上述步骤了。

选择模型

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

from sklearn.linear_model import LinearRegression

选择模型超参数

一旦我们选择了一类模型,我们就需要做出一些重要的选择,这些选择通常表示为超参数,或者在模型拟合数据之前必须设置的参数。在这里,对于这个线性回归的例子,我们想通过使用fit_intercept超参数如下:

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

整理数据

我们知道目标变量y的形式是一个长度为n_samples的一维数组,现在我们需要重新塑造特征矩阵X,使其成为大小为[n_samples, n_features]的矩阵,它可以按以下方式进行

X = x[:, np.newaxis]
X.shape
(40, 1)

模型拟合

一旦我们安排好了数据,现在是时候拟合模型了,即把我们的模型应用于数据。这可以在fit()方法的帮助下完成,如下所示

model.fit(X, y)
LinearRegression(copy_X = True, fit_intercept = True, n_jobs = None,normalize = False)

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

对于这个例子,下面的参数显示了数据的简单线性拟合的斜率:

model.coef_
array([1.99839352])

以下参数表示对数据进行简单线性拟合的截距:

model.intercept_
-0.9895459457775022

将模型应用于新数据

训练模型后,我们可以将其应用于新数据,由于监督机器学习的主要任务是基于不属于训练集的新数据评估模型,它可以在predict()方法的帮助下完成,如下:

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

Model New Data

完整的工作/可执行示例

%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);

无监督学习示例


在这里,作为此过程的一个示例,我们采用了降低 Iris 数据集维度的常见案例,以便我们可以更轻松地对其进行可视化。对于本示例,我们将使用主成分分析 (PCA),这是一种快速线性降维技术。

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

选择模型

from sklearn.decomposition import PCA

选择模型超参数

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

模型拟合

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

将数据转换为二维

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);

two dimensional

完整的工作/可执行示例

%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);