Scikit Learn - 约定



Scikit-learn 的对象共享一个统一的基本 API,它由以下三个互补的接口组成:

  • 估计器接口 - 用于构建和拟合模型。

  • 预测器接口 - 用于进行预测。

  • 转换器接口 - 用于转换数据。

这些 API 采用了简单的约定,设计选择以避免框架代码的激增为指导。

约定的目的

约定的目的是确保 API 遵循以下广泛原则:

一致性 - 所有对象,无论是基本对象还是复合对象,都必须共享一个一致的接口,该接口进一步由一组有限的方法组成。

检查 - 构造函数参数和学习算法确定的参数值应存储并公开为公共属性。

避免类激增 - 数据集应表示为 NumPy 数组或 Scipy 稀疏矩阵,而超参数名称和值应表示为标准 Python 字符串,以避免框架代码的激增。

组合 - 无论算法是否可以表示为对数据的转换序列或组合,或者自然地被视为参数化为其他算法的元算法,都应从现有的构建块中实现和组合。

合理的默认值 - 在 scikit-learn 中,无论何时操作需要用户定义的参数,都会定义一个适当的默认值。此默认值应使操作以合理的方式执行,例如,为手头的任务提供基线解决方案。

各种约定

下面解释了 Sklearn 中可用的约定:

类型转换

它指出输入应转换为float64。在以下示例中,sklearn.random_projection 模块用于降低数据的维度,将对此进行说明:

示例

import numpy as np
from sklearn import random_projection
rannge = np.random.RandomState(0)
X = range.rand(10,2000)
X = np.array(X, dtype = 'float32')
X.dtype
Transformer_data = random_projection.GaussianRandomProjection()
X_new = transformer.fit_transform(X)
X_new.dtype

输出

dtype('float32')
dtype('float64')

在上面的示例中,我们可以看到 X 是float32,它被fit_transform(X)转换为float64

重新拟合和更新参数

估计器的超参数可以在通过set_params()方法构造后进行更新和重新拟合。让我们看下面的例子来理解它:

示例

import numpy as np
from sklearn.datasets import load_iris
from sklearn.svm import SVC
X, y = load_iris(return_X_y = True)
clf = SVC()
clf.set_params(kernel = 'linear').fit(X, y)
clf.predict(X[:5])

输出

array([0, 0, 0, 0, 0])

一旦估计器被构造,上面的代码将通过SVC.set_params()将默认内核rbf更改为线性。

现在,以下代码将把内核改回 rbf 以重新拟合估计器并进行第二次预测。

示例

clf.set_params(kernel = 'rbf', gamma = 'scale').fit(X, y)
clf.predict(X[:5])

输出

array([0, 0, 0, 0, 0])

完整代码

以下是完整的可执行程序:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.svm import SVC
X, y = load_iris(return_X_y = True)
clf = SVC()
clf.set_params(kernel = 'linear').fit(X, y)
clf.predict(X[:5])
clf.set_params(kernel = 'rbf', gamma = 'scale').fit(X, y)
clf.predict(X[:5])

多类和多标签拟合

在多类拟合的情况下,学习和预测任务都取决于拟合的目标数据的格式。使用的模块是sklearn.multiclass。查看下面的示例,其中多类分类器拟合在一维数组上。

示例

from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier
from sklearn.preprocessing import LabelBinarizer
X = [[1, 2], [3, 4], [4, 5], [5, 2], [1, 1]]
y = [0, 0, 1, 1, 2]
classif = OneVsRestClassifier(estimator = SVC(gamma = 'scale',random_state = 0))
classif.fit(X, y).predict(X)

输出

array([0, 0, 1, 1, 2])

在上面的示例中,分类器拟合在多类标签的一维数组上,因此predict()方法提供了相应的多类预测。但另一方面,也可以拟合在二维的二元标签指示器数组上,如下所示:

示例

from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier
from sklearn.preprocessing import LabelBinarizer
X = [[1, 2], [3, 4], [4, 5], [5, 2], [1, 1]]
y = LabelBinarizer().fit_transform(y)
classif.fit(X, y).predict(X)

输出

array(
   [
      [0, 0, 0],
      [0, 0, 0],
      [0, 1, 0],
      [0, 1, 0],
      [0, 0, 0]
   ]
)

类似地,在多标签拟合的情况下,一个实例可以被分配多个标签,如下所示:

示例

from sklearn.preprocessing import MultiLabelBinarizer
y = [[0, 1], [0, 2], [1, 3], [0, 2, 3], [2, 4]]
y = MultiLabelBinarizer().fit_transform(y)
classif.fit(X, y).predict(X)

输出

array(
   [
      [1, 0, 1, 0, 0],
      [1, 0, 1, 0, 0],
      [1, 0, 1, 1, 0],
      [1, 0, 1, 1, 0],
      [1, 0, 1, 0, 0]
   ]
)

在上面的示例中,sklearn.MultiLabelBinarizer 用于将多标签的二维数组二值化以进行拟合。这就是为什么predict()函数输出一个二维数组,每个实例都有多个标签。

广告