scikit-learn 1.1 的發行重點#

我們很高興宣布 scikit-learn 1.1 的發行!新增了許多錯誤修正和改進,以及一些新的主要功能。我們在下面詳細介紹了此版本的一些主要功能。如需所有變更的詳盡列表,請參閱發行說明

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

pip install --upgrade scikit-learn

或使用 conda

conda install -c conda-forge scikit-learn

HistGradientBoostingRegressor中的分位數損失#

HistGradientBoostingRegressor可以使用 loss="quantile" 和新的參數 quantile 來模擬分位數。

from sklearn.ensemble import HistGradientBoostingRegressor
import numpy as np
import matplotlib.pyplot as plt

# Simple regression function for X * cos(X)
rng = np.random.RandomState(42)
X_1d = np.linspace(0, 10, num=2000)
X = X_1d.reshape(-1, 1)
y = X_1d * np.cos(X_1d) + rng.normal(scale=X_1d / 3)

quantiles = [0.95, 0.5, 0.05]
parameters = dict(loss="quantile", max_bins=32, max_iter=50)
hist_quantiles = {
    f"quantile={quantile:.2f}": HistGradientBoostingRegressor(
        **parameters, quantile=quantile
    ).fit(X, y)
    for quantile in quantiles
}

fig, ax = plt.subplots()
ax.plot(X_1d, y, "o", alpha=0.5, markersize=1)
for quantile, hist in hist_quantiles.items():
    ax.plot(X_1d, hist.predict(X), label=quantile)
_ = ax.legend(loc="lower left")
plot release highlights 1 1 0

如需使用案例範例,請參閱直方圖梯度提升樹中的特徵

get_feature_names_out 在所有轉換器中可用#

get_feature_names_out現在在所有轉換器中都可用。這使得 Pipeline 能夠為更複雜的管道建構輸出特徵名稱

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.feature_selection import SelectKBest
from sklearn.datasets import fetch_openml
from sklearn.linear_model import LogisticRegression

X, y = fetch_openml(
    "titanic", version=1, as_frame=True, return_X_y=True, parser="pandas"
)
numeric_features = ["age", "fare"]
numeric_transformer = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
categorical_features = ["embarked", "pclass"]

preprocessor = ColumnTransformer(
    [
        ("num", numeric_transformer, numeric_features),
        (
            "cat",
            OneHotEncoder(handle_unknown="ignore", sparse_output=False),
            categorical_features,
        ),
    ],
    verbose_feature_names_out=False,
)
log_reg = make_pipeline(preprocessor, SelectKBest(k=7), LogisticRegression())
log_reg.fit(X, y)
Pipeline(steps=[('columntransformer',
                 ColumnTransformer(transformers=[('num',
                                                  Pipeline(steps=[('simpleimputer',
                                                                   SimpleImputer(strategy='median')),
                                                                  ('standardscaler',
                                                                   StandardScaler())]),
                                                  ['age', 'fare']),
                                                 ('cat',
                                                  OneHotEncoder(handle_unknown='ignore',
                                                                sparse_output=False),
                                                  ['embarked', 'pclass'])],
                                   verbose_feature_names_out=False)),
                ('selectkbest', SelectKBest(k=7)),
                ('logisticregression', LogisticRegression())])
在 Jupyter 環境中,請重新執行此儲存格以顯示 HTML 表示法,或信任筆記本。
在 GitHub 上,HTML 表示法無法呈現,請嘗試使用 nbviewer.org 載入此頁面。


在這裡,我們對管道進行切片,以包含所有步驟,但最後一個步驟除外。此管道切片的輸出特徵名稱是放入邏輯迴歸的特徵。這些名稱直接對應於邏輯迴歸中的係數

import pandas as pd

log_reg_input_features = log_reg[:-1].get_feature_names_out()
pd.Series(log_reg[-1].coef_.ravel(), index=log_reg_input_features).plot.bar()
plt.tight_layout()
plot release highlights 1 1 0

OneHotEncoder中分組不常見的類別#

OneHotEncoder支援將不常見的類別聚合到每個特徵的單一輸出中。啟用不常見類別收集的參數為 min_frequencymax_categories。如需更多詳細資訊,請參閱使用者指南

from sklearn.preprocessing import OneHotEncoder
import numpy as np

X = np.array(
    [["dog"] * 5 + ["cat"] * 20 + ["rabbit"] * 10 + ["snake"] * 3], dtype=object
).T
enc = OneHotEncoder(min_frequency=6, sparse_output=False).fit(X)
enc.infrequent_categories_
[array(['dog', 'snake'], dtype=object)]

由於 dog 和 snake 是不常見的類別,因此它們在轉換時會分組在一起

encoded = enc.transform(np.array([["dog"], ["snake"], ["cat"], ["rabbit"]]))
pd.DataFrame(encoded, columns=enc.get_feature_names_out())
x0_cat x0_rabbit x0_infrequent_sklearn
0 0.0 0.0 1.0
1 0.0 0.0 1.0
2 1.0 0.0 0.0
3 0.0 1.0 0.0


效能改進#

已重構密集 float64 資料集成對距離的減少,以更好地利用非阻塞執行緒並行性。例如,neighbors.NearestNeighbors.kneighborsneighbors.NearestNeighbors.radius_neighbors 分別可以比以前快達 ×20 和 ×5 倍。總之,下列函數和估計器現在受益於效能的提升

若要了解有關此工作的技術細節的更多資訊,您可以閱讀這套部落格文章

此外,已使用 Cython 重構損失函數的計算,從而改進下列估計器的效能

MiniBatchNMF:NMF 的線上版本#

新類別 MiniBatchNMF 實作了非負矩陣分解 (NMF) 的更快但較不精確的版本。MiniBatchNMF 將資料分成小批次,並透過循環處理小批次以線上方式最佳化 NMF 模型,使其更適合大型資料集。特別是,它實作了 partial_fit,當資料一開始無法隨時取得時,或當資料無法放入記憶體時,可以用於線上學習。

import numpy as np
from sklearn.decomposition import MiniBatchNMF

rng = np.random.RandomState(0)
n_samples, n_features, n_components = 10, 10, 5
true_W = rng.uniform(size=(n_samples, n_components))
true_H = rng.uniform(size=(n_components, n_features))
X = true_W @ true_H

nmf = MiniBatchNMF(n_components=n_components, random_state=0)

for _ in range(10):
    nmf.partial_fit(X)

W = nmf.transform(X)
H = nmf.components_
X_reconstructed = W @ H

print(
    f"relative reconstruction error: ",
    f"{np.sum((X - X_reconstructed) ** 2) / np.sum(X**2):.5f}",
)
relative reconstruction error:  0.00364

BisectingKMeans:分割和叢集#

新類別 BisectingKMeansKMeans 的變體,使用分裂式階層式叢集。不是一次建立所有質心,而是根據先前的叢集逐步選取質心:重複地將一個叢集分割成兩個新的叢集,直到達到目標叢集數目為止,從而為叢集提供階層式結構。

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans, BisectingKMeans
import matplotlib.pyplot as plt

X, _ = make_blobs(n_samples=1000, centers=2, random_state=0)

km = KMeans(n_clusters=5, random_state=0, n_init="auto").fit(X)
bisect_km = BisectingKMeans(n_clusters=5, random_state=0).fit(X)

fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].scatter(X[:, 0], X[:, 1], s=10, c=km.labels_)
ax[0].scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], s=20, c="r")
ax[0].set_title("KMeans")

ax[1].scatter(X[:, 0], X[:, 1], s=10, c=bisect_km.labels_)
ax[1].scatter(
    bisect_km.cluster_centers_[:, 0], bisect_km.cluster_centers_[:, 1], s=20, c="r"
)
_ = ax[1].set_title("BisectingKMeans")
KMeans, BisectingKMeans

指令碼的總執行時間: (0 分鐘 0.967 秒)

相關範例

scikit-learn 1.0 的版本重點

scikit-learn 1.0 的版本重點

scikit-learn 1.3 的版本重點

scikit-learn 1.3 的版本重點

scikit-learn 0.23 的版本重點

scikit-learn 0.23 的版本重點

scikit-learn 1.2 的版本重點

scikit-learn 1.2 的版本重點

由 Sphinx-Gallery 生成的圖庫