scikit-learn 1.0 的發行重點#

我們非常高興宣布 scikit-learn 1.0 的發布!該函式庫已穩定一段時間,發布 1.0 版本是承認這一點並向使用者發出信號。除了通常的兩個版本棄用週期外,此版本不包含任何重大變更。對於未來,我們會盡力保持此模式。

此版本包含一些新的主要功能以及許多改進和錯誤修正。我們在下面詳細介紹此版本的一些主要功能。如需所有變更的完整列表,請參閱發行說明

若要安裝最新版本 (使用 pip)

pip install --upgrade scikit-learn

或使用 conda

conda install -c conda-forge scikit-learn

關鍵字和位置引數#

scikit-learn API 公開許多具有許多輸入參數的函式和方法。例如,在此版本之前,可以將HistGradientBoostingRegressor實例化為

HistGradientBoostingRegressor("squared_error", 0.1, 100, 31, None,
    20, 0.0, 255, None, None, False, "auto", "loss", 0.1, 10, 1e-7,
    0, None)

了解上述程式碼需要讀者查看 API 文件,並檢查每個參數的位置及其意義。為了提高基於 scikit-learn 編寫的程式碼的可讀性,現在使用者必須提供大多數參數的名稱,作為關鍵字引數,而不是位置引數。例如,上述程式碼將會是

HistGradientBoostingRegressor(
    loss="squared_error",
    learning_rate=0.1,
    max_iter=100,
    max_leaf_nodes=31,
    max_depth=None,
    min_samples_leaf=20,
    l2_regularization=0.0,
    max_bins=255,
    categorical_features=None,
    monotonic_cst=None,
    warm_start=False,
    early_stopping="auto",
    scoring="loss",
    validation_fraction=0.1,
    n_iter_no_change=10,
    tol=1e-7,
    verbose=0,
    random_state=None,
)

這更具可讀性。位置引數自 0.23 版本起已棄用,現在會引發 TypeError。在某些情況下仍允許有限數量的位置引數,例如在PCA中,仍允許 PCA(10),但不允許 PCA(10, False)

雲形變換器#

在資料集的特徵集中新增非線性項的一種方法是使用新的 SplineTransformer為連續/數值特徵產生雲形基底函式。雲形是分段多項式,由其多項式次數和結的位置參數化。SplineTransformer 實作 B 雲形基底。

../../_images/sphx_glr_plot_polynomial_interpolation_001.png

以下程式碼顯示雲形的作用,如需更多資訊,請參閱使用者指南

import numpy as np
from sklearn.preprocessing import SplineTransformer

X = np.arange(5).reshape(5, 1)
spline = SplineTransformer(degree=2, n_knots=3)
spline.fit_transform(X)
array([[0.5  , 0.5  , 0.   , 0.   ],
       [0.125, 0.75 , 0.125, 0.   ],
       [0.   , 0.5  , 0.5  , 0.   ],
       [0.   , 0.125, 0.75 , 0.125],
       [0.   , 0.   , 0.5  , 0.5  ]])

分位數迴歸器#

分位數迴歸估計以 \(X\) 為條件的 \(y\) 中位數或其他分位數,而普通最小平方法 (OLS) 估計條件均值。

作為線性模型,新的 QuantileRegressor 提供 \(q\) 分位數的線性預測 \(\hat{y}(w, X) = Xw\)\(q \in (0, 1)\)。然後透過以下最小化問題找到權重或係數 \(w\)

\[\min_{w} {\frac{1}{n_{\text{samples}}} \sum_i PB_q(y_i - X_i w) + \alpha ||w||_1}.\]

這由釘球損失(也稱為線性損失)組成,另請參閱 mean_pinball_loss

\[\begin{split}PB_q(t) = q \max(t, 0) + (1 - q) \max(-t, 0) = \begin{cases} q t, & t > 0, \\ 0, & t = 0, \\ (1-q) t, & t < 0 \end{cases}\end{split}\]

以及由參數 alpha 控制的 L1 懲罰,類似於 linear_model.Lasso

請查看以下範例,以了解其運作方式,並參閱使用者指南以取得更多詳細資訊。

../../_images/sphx_glr_plot_quantile_regression_002.png

特徵名稱支援#

當估計器在 fit 期間傳遞 pandas 的資料框架時,估計器會設定一個包含特徵名稱的 feature_names_in_ 屬性。請注意,只有當資料框架中的欄名稱都是字串時,才會啟用特徵名稱支援。feature_names_in_ 用於檢查在非 fit 中傳遞的資料框架(例如 predict)的欄名稱是否與 fit 中的特徵一致

from sklearn.preprocessing import StandardScaler
import pandas as pd

X = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=["a", "b", "c"])
scalar = StandardScaler().fit(X)
scalar.feature_names_in_
array(['a', 'b', 'c'], dtype=object)

get_feature_names_out 的支援適用於已具有 get_feature_names 的變換器,以及輸入與輸出之間存在一對一對應關係的變換器,例如 StandardScaler。在未來的版本中,將會新增對所有其他變換器的 get_feature_names_out 支援。此外,compose.ColumnTransformer.get_feature_names_out 可用於組合其變換器的特徵名稱

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
import pandas as pd

X = pd.DataFrame({"pet": ["dog", "cat", "fish"], "age": [3, 7, 1]})
preprocessor = ColumnTransformer(
    [
        ("numerical", StandardScaler(), ["age"]),
        ("categorical", OneHotEncoder(), ["pet"]),
    ],
    verbose_feature_names_out=False,
).fit(X)

preprocessor.get_feature_names_out()
array(['age', 'pet_cat', 'pet_dog', 'pet_fish'], dtype=object)

當此 preprocessor 與管道一起使用時,分類器使用的特徵名稱是透過切片並呼叫 get_feature_names_out 取得的

from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

y = [1, 0, 1]
pipe = make_pipeline(preprocessor, LogisticRegression())
pipe.fit(X, y)
pipe[:-1].get_feature_names_out()
array(['age', 'pet_cat', 'pet_dog', 'pet_fish'], dtype=object)

更具彈性的繪圖 API#

metrics.ConfusionMatrixDisplaymetrics.PrecisionRecallDisplaymetrics.DetCurveDisplayinspection.PartialDependenceDisplay 現在公開了兩個類別方法:from_estimatorfrom_predictions,讓使用者可以根據預測或估計器建立圖表。這表示對應的 plot_* 函式已被棄用。請查看範例一範例二,以瞭解如何使用新的繪圖功能。

線上單類別 SVM#

新的類別 SGDOneClassSVM 使用隨機梯度下降實作單類別 SVM 的線上線性版本。結合核心近似技術,SGDOneClassSVM 可用於近似核心化單類別 SVM 的解,該核心化單類別 SVM 在 OneClassSVM 中實作,其擬合時間複雜度與樣本數成線性關係。請注意,核心化單類別 SVM 的複雜度在樣本數中至少是二次方的。因此,SGDOneClassSVM 非常適合具有大量訓練樣本(> 10,000)的資料集,對於這些資料集,SGD 變體可以快幾個數量級。請查看此範例,以瞭解其使用方式,以及使用者指南 以取得更多詳細資訊。

../../_images/sphx_glr_plot_anomaly_comparison_001.png

基於直方圖的梯度提升模型現在穩定#

HistGradientBoostingRegressorHistGradientBoostingClassifier 不再是實驗性的,可以簡單地匯入並使用,如下所示

from sklearn.ensemble import HistGradientBoostingClassifier

新的文件改進#

此版本包含許多文件改進。在 2100 多個合併的提取請求中,約有 800 個是我們文件的改進。

腳本總執行時間: (0 分鐘 0.016 秒)

相關範例

scikit-learn 1.1 的版本重點

scikit-learn 1.1 的版本重點

scikit-learn 1.2 的版本重點

scikit-learn 1.2 的版本重點

scikit-learn 0.24 的版本重點

scikit-learn 0.24 的版本重點

scikit-learn 1.6 的版本重點

scikit-learn 1.6 的版本重點

由 Sphinx-Gallery 產生的圖庫