scikit-learn機器學習簡介?

本指南的目的是說明 scikit-learn所提供的一些主要功能。它假定你已經掌握了機器學習基礎的知識(模型擬合,預測,交叉驗證等)。請參閱我們的安裝說明進行scikit-learn安裝。

Scikit-learn是一個開源的機器學習庫,它支持有監督和無監督的學習。它還提供了用于模型擬合,數據預處理,模型選擇和評估以及許多其他實用程序的各種工具。

擬合和預測:估算器基礎

Scikit-learn提供了數十種內置的機器學習算法和模型,稱為估算器。每個估算器可以使用其擬合方法擬合到一些數據。

這是一個簡單的示例,其中我們使用一些非常基本的數據來訓練 RandomForestClassifier

>>> from sklearn.ensemble import RandomForestClassifier
>>> clf = RandomForestClassifier(random_state=0)
>>> X = [[ 1,  2,  3],  #2個樣本,3個特征
...      [111213]]
>>> y = [01]  #每一個樣本的類別
>>> clf.fit(X, y)
RandomForestClassifier(random_state=0)

所述擬合方法通常接受2個輸入:

  • 樣本矩陣(或設計矩陣)X。X的大小通常為(n_samples, n_features),這意味著樣本表示為行,特征表示為列。
  • 目標值y是用于回歸任務的真實數字,或者是用于分類的整數(或任何其他離散值)。對于無監督學習,y無需指定。y通常是1d數組,其中i對應于目標X的 第i個樣本(行)。

雖然某些估算器可以使用其他格式(例如稀疏矩陣),但是通常,兩者Xy預計都是numpy數組或等效的類似 數組的數據類型。

估算器擬合后,可用于預測新數據的目標值。你無需重新訓練估算器:

>>> clf.predict(X)  # 預測訓練數據的標簽
array([01])
>>> clf.predict([[456], [141516]])  # 預測新數據的標簽
array([01])

轉換器和預處理器

機器學習工作流程通常由不同的部分組成。典型的流水線包括一個轉換或插入數據的預處理步驟,以及一個預測目標值的最終預測器。

在中scikit-learn,預處理器和轉換器遵循與estimator對象相同的API(實際上它們都繼承自同一 BaseEstimator類)。轉換對象沒有預測方法,但是需要有一個輸出新轉換的樣本矩陣X的轉換方法:

>>> from sklearn.preprocessing import StandardScaler
>>> X = [[015],
...      [1-10]]
>>> StandardScaler().fit(X).transform(X)
array([[-1.,  1.],
       [ 1.-1.]])

有時,如果你想要應用不同的轉換器去處理不同的特征:ColumnTransformer專為這些用例而設計。

管道:連接預處理器和估算器

可以將轉換器和估算器(預測器)組合在一起成為一個統一的對象:一個 Pipeline。這條管道提供相同的API作為常規估算器:它可以用fitpredict來訓練和預測。正如我們將在后面看到的,使用管道還可以防止數據泄漏,即在訓練數據中泄露一些測試數據。

在以下示例中,我們加載Iris數據集,將其分為訓練集和測試集,然后根據測試數據計算管道的準確性得分:

>>> from sklearn.preprocessing import StandardScaler
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.pipeline import make_pipeline
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.metrics import accuracy_score
...
>>> # 創建一個pipeline對象
>>> pipe = make_pipeline(
...     StandardScaler(),
...     LogisticRegression(random_state=0)
... )
...
>>> # 加載鳶尾花數據集并將其切分成訓練集和測試集
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
...
>>> # 訓練整個pipeline
>>> pipe.fit(X_train, y_train)
Pipeline(steps=[('standardscaler', StandardScaler()),
                ('logisticregression', LogisticRegression(random_state=0))])
>>> # 我們現在可以像使用其他任何估算器一樣使用它
>>> accuracy_score(pipe.predict(X_test), y_test)
0.97...

模型評估

用一些數據來訓練模型并不意味著在一些未知的數據上也能預測得很好,這需要直接評估。

將模型擬合到一些數據并不意味著它將在看不見的數據上很好地預測。這需要直接評估。我們剛剛看到了train_test_split函數可以將數據集分為訓練集和測試集,但是scikit-learn提供了許多其他模型評估工具,尤其是用于交叉驗證的工具

我們在這里簡要展示了如何使用cross_validate幫助程序執行5折交叉驗證過程。需要注意的是,還可以使用不同的數據拆分策略以及使用自定義評分功能來手動實現遍歷。有關更多詳細信息,請參閱我們的用戶指南

>>> from sklearn.datasets import make_regression
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.model_selection import cross_validate
...
>>> X, y = make_regression(n_samples=1000, random_state=0)
>>> lr = LinearRegression()
...
>>> result = cross_validate(lr, X, y)  # 默認為5折交叉驗證
>>> result['test_score']  # 此處R2得分很高的原因為數據集很簡單
array([1.1.1.1.1.])

自動參數搜索

所有估算器都有可以調整的參數(在文獻中通常稱為超參數)。估算器的泛化能力通常關鍵取決于幾個參數。例如,在隨機深林回歸器 RandomForestRegressor中,n_estimators參數 確定林中樹木數量,max_depth參數確定每棵樹的最大深度。通常,這些參數的確切值是多少我們都不太清楚,因為它們取決于手頭的數據。

Scikit-learn提供了自動查找最佳參數組合的工具(通過交叉驗證)。在以下示例中,我們使用 RandomizedSearchCV對象隨機搜索隨機森林的參數空間。搜索結束后,RandomizedSearchCV的表現就像是已經訓練好最佳參數集的RandomForestRegressor。在用戶指南中可以閱讀更多內容:

>>> from sklearn.datasets import fetch_california_housing
>>> from sklearn.ensemble import RandomForestRegressor
>>> from sklearn.model_selection import RandomizedSearchCV
>>> from sklearn.model_selection import train_test_split
>>> from scipy.stats import randint
...
>>> X, y = fetch_california_housing(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
...
>>> # 定義要搜索的參數空間
>>> param_distributions = {'n_estimators': randint(15),
...                        'max_depth': randint(510)}
...
>>> # 現在創建一個searchCV 對象然后用數據訓練它
>>> search = RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0),
...                             n_iter=5,
...                             param_distributions=param_distributions,
...                             random_state=0)
>>> search.fit(X_train, y_train)
RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0), n_iter=5,
                   param_distributions={'max_depth': ...,
                                        'n_estimators': ...},
                   random_state=0)
>>> search.best_params_
{'max_depth'9'n_estimators'4}

>>> # 搜索對象現在就像普通的隨機森林估計器一樣
>>> # max_depth=9 和 n_estimators=4
>>> search.score(X_test, y_test)
0.73...

注意
?在實踐中,你幾乎總是想要用搜索管道,而不是單個估計器。一個主要原因是,如果在不使用pipeline的情況下對整個數據集應用預處理步驟,然后執行任何類型的交叉驗證,那么你將打破訓練和測試數據之間獨立性的基本假設。實際上,由于你使用了整個數據集對數據進行了預處理,因此有關測試集的一些信息可用于訓練集。這將導致高估估算器的泛化能力(你可以在此Kaggle帖子中閱讀更多內容)。
?使用管道進行交叉驗證和搜索將在很大程度上避免遇到這個常見的陷阱。

下一步

我們簡要介紹了估算器的擬合和預測,預處理步驟,管道,交叉驗證工具以及自動超參數搜索。本指南應概述該庫的一些主要功能,但對于scikit-learn來說還有更多內容!

有關我們提供的所有工具的詳細信息,請參閱我們的用戶指南。你還可以在API參考中找到公共API的詳盡列表 。

還可以查看我們的無數示例,這些示例說明了scikit-learn在許多不同內容中的用法。

這些教程還包含其他學習資源。