Scikit Learn - 估計器API



本章我們將學習估計器API (應用程式程式設計介面)。讓我們首先了解什麼是估計器API。

什麼是估計器API

它是Scikit-learn實現的主要API之一。它為廣泛的機器學習應用提供了一個一致的介面,這就是為什麼Scikit-Learn中的所有機器學習演算法都是透過估計器API實現的。從資料中學習(擬合數據)的物件是一個估計器。它可以與任何演算法一起使用,例如分類、迴歸、聚類,甚至可以與提取原始資料有用特徵的轉換器一起使用。

為了擬合數據,所有估計器物件都公開了一個fit方法,該方法接受如下所示的資料集:

estimator.fit(data)

接下來,在透過相應的屬性例項化估計器時,可以設定估計器的所有引數,如下所示:

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

以上輸出結果為1。

一旦資料與估計器擬合,就會根據手頭的資料估計引數。現在,所有估計的引數都將是估計器物件的屬性,並在末尾新增下劃線,如下所示:

estimator.estimated_param_

估計器API的用途

估計器的主要用途如下:

模型的估計和解碼

估計器物件用於模型的估計和解碼。此外,模型被估計為以下內容的確定性函式:

  • 在物件構造中提供的引數。

  • 全域性隨機狀態(numpy.random),如果估計器的random_state引數設定為None。

  • 傳遞給最近一次呼叫fit、fit_transform或fit_predict的任何資料。

  • 在一系列呼叫partial_fit中傳遞的任何資料。

將非矩形資料表示對映到矩形資料

它將非矩形資料表示對映到矩形資料。簡單來說,它接收輸入,其中每個樣本不表示為固定長度的類似陣列的物件,併為每個樣本生成一個類似陣列的特徵物件。

核心樣本和異常樣本之間的區別

它使用以下方法對核心樣本和異常樣本之間的區別進行建模:

  • fit

  • 如果為轉導式,則為fit_predict

  • 如果為歸納式,則為predict

指導原則

在設計Scikit-Learn API時,考慮了以下指導原則:

一致性

此原則指出,所有物件都應共享一個來自有限方法集的通用介面。文件也應保持一致。

有限的物件層次結構

此指導原則指出:

  • 演算法應由Python類表示

  • 資料集應以標準格式表示,例如NumPy陣列、Pandas DataFrame、SciPy稀疏矩陣。

  • 引數名稱應使用標準Python字串。

組合

眾所周知,機器學習演算法可以表示為許多基本演算法的序列。Scikit-learn在需要時會使用這些基本演算法。

合理的預設值

根據此原則,Scikit-learn庫在機器學習模型需要使用者指定引數時定義適當的預設值。

檢查

根據此指導原則,每個指定的引數值都作為公共屬性公開。

使用估計器API的步驟

以下是使用Scikit-Learn估計器API的步驟:

步驟1:選擇模型類別

在第一步中,我們需要選擇一個模型類別。這可以透過從Scikit-learn匯入相應的估計器類來完成。

步驟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

因此,我們有上述用於線性迴歸示例的資料。

現在,使用此資料,我們可以應用上述步驟。

選擇模型類別

在這裡,為了計算簡單的線性迴歸模型,我們需要匯入線性迴歸類,如下所示:

from sklearn.linear_model import LinearRegression

選擇模型超引數

一旦我們選擇了一個模型類別,我們就需要做出一些重要的選擇,這些選擇通常表示為超引數,或者必須在模型擬合到資料之前設定的引數。在這裡,對於這個線性迴歸示例,我們想使用fit_intercept超引數來擬合截距,如下所示:

示例

model = LinearRegression(fit_intercept = True)
model

輸出

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

排列資料

現在,正如我們所知,我們的目標變數y處於正確的形式,即長度為n_samples的一維陣列。但是,我們需要重塑特徵矩陣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);
廣告