Scikit-learn Estimator API 怎么用?

文章导读
Previous Quiz Next 在本章中,我们将学习 Estimator API(应用程序编程接口)。让我们从理解什么是 Estimator API 开始。
📋 目录
  1. 什么是 Estimator API
  2. Estimator API 的用途
  3. 指导原则
  4. 使用 Estimator API 的步骤
  5. 监督学习示例
  6. 无监督学习示例
A A

Scikit Learn - Estimator API



Previous
Quiz
Next

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

什么是 Estimator API

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

对于拟合数据,所有 estimator 对象都暴露了一个 fit 方法,该方法接受一个数据集,如下所示 −

estimator.fit(data)

接下来,所有 estimator 的参数可以在实例化时通过对应的属性设置,如下所示。

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

上面的输出将是 1。

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

estimator.estimated_param_

Estimator API 的用途

estimator 的主要用途如下 −

模型的估计和解码

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

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

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

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

  • 传递给一系列调用 partial_fit 的任何数据。

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

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

核心样本与离群样本的区分

它通过以下方法建模核心样本与离群样本之间的区分 −

  • fit

  • fit_predict if transductive

  • predict if inductive

指导原则

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

一致性

这一原则规定,所有对象应共享一个公共接口,该接口来自有限的方法集。文档也应保持一致。

有限的对象层次结构

这一指导原则规定 −

  • 算法应由 Python class 表示

  • 数据集应以标准格式表示,如 NumPy arrays、Pandas DataFrames、SciPy sparse matrix。

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

组合

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

合理的默认值

根据这一原则,每当机器学习模型需要用户指定的参数时,Scikit-learn 库都会定义一个合适的默认值。

检查

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

使用 Estimator API 的步骤

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

步骤 1: 选择模型类

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

步骤 2: 选择模型超参数

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

步骤 3: 整理数据

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

步骤 4: 模型拟合

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

步骤 5: 应用模型

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

监督学习示例

在这里,作为这个过程的一个示例,我们将使用常见的案例,即对 (x,y) 数据拟合一条直线,即 简单线性回归

首先,我们需要加载数据集,我们使用 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

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

现在,使用这些数据,我们可以应用前面提到的步骤。

选择模型类

在这里,为了计算简单线性回归模型,我们需要按以下方式导入 linear regression class −

from sklearn.linear_model import LinearRegression

选择模型超参数

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

示例

model = LinearRegression(fit_intercept = True)
model

输出

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

整理数据

现在,我们知道目标变量 y 已经是正确形式,即长度为 n_samples 的 1-D 数组。但是,我们需要重塑特征矩阵 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);