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()函式輸出一個二維陣列,每個例項都有多個標籤。

廣告