Scikit Learn - 约定
Scikit-learn 的对象共享统一的基本 API,该 API 由以下三个互补的接口组成 −
Estimator 接口 − 用于构建和拟合模型。
Predictor 接口 − 用于进行预测。
Transformer 接口 − 用于转换数据。
这些 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])
构建估计器后,上述代码将通过以下方式将默认核rbf更改为线性核SVC.set_params().
现在,以下代码将内核改回 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() 函数会输出一个二维数组,其中包含每个实例的多个标签。

