Scikit Learn 简明教程

Scikit Learn - Conventions

Scikit-learn 的对象共享一个统一的基本 API,它包含以下三个互补的接口 −

  1. Estimator interface − 它用于构建和拟合模型。

  2. Predictor interface − 它用于进行预测。

  3. Transformer interface − 它用于转换数据。

这些 API 采用简单的约定,并且设计选择旨在避免框架代码泛滥。

Purpose of Conventions

这些约定的目的是确保 API 坚持以下广泛原则 −

Consistency − 所有对象(无论是基础对象还是复合对象)都必须共享一致的接口,该接口由一组有限的方法组成。

Inspection − 由学习算法确定的构造函数参数和参数值应存储并公开为公有属性。

Non-proliferation of classes − 数据集应表示为 NumPy 数组或 Scipy 稀疏矩阵,而超参数名称和值应表示为标准 Python 字符串,以避免框架代码的扩散。

Composition − 无论算法是否可表示为序列或数据变换组合,或者自然地视为参数化为其他算法的元算法,都应由现有构建模块实现并组合。

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

Various Conventions

以下是 Sklearn 中可用的约定 −

Type casting

它指出输入应转换为 float64 。在以下示例中, sklearn.random_projection 模块用于减少数据的维数,将进行解释 −

Example

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

Output

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

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

Refitting & Updating Parameters

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

Example

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

Output

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

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

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

Example

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

Output

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

Complete code

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

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

Multiclass & Multilabel fitting

对于多类拟合,学习和预测任务都取决于拟合目标数据的格式。使用的模块是 sklearn.multiclass 。检查以下示例,其中多类分类器拟合在 1d 数组上。

Example

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)

Output

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

在上面的示例中,分类器拟合在一维的多类标签数组上,因此 predict() 方法提供了相应的多类预测。但是,另一方面,还可以像下面这样拟合在二进制标签指示符的二维数组上 −

Example

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)

Output

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

同样,在多标签拟合的情况下,可以像下面这样为一个实例分配多个标签 −

Example

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)

Output

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() 函数输出一个 2d 数组作为每个实例的多个标签的原因。