scikit-learn 0.23中的發布要點?

我們很高興地宣布, 發布了 scikit-learn 0.23!許多bug被修復及改進,以及一些新的關鍵特性。我們將在下面詳細介紹這個版本的幾個主要特性。有關所有更改的詳盡清單,請參閱發布說明。

若要安裝最新版本(使用pip),請執行以下操作:

pip install --upgrade scikit-learn

或者使用conda

conda install scikit-learn

1.1.1 廣義線性模型和梯度提升的泊松損失

等待已久的具有非正常損失函數的廣義線性模型現在可用了.特別是,實現了三個新的回歸器:PoissonRegressorGammaRegressorTweedieRegressor。泊松回歸(Poisson regressor )可以用來模擬正整數計數或相對頻率。在用戶指南中閱讀更多內容。此外,HistGradientBoostingRegressor也支持一個新的‘泊松’損失( ‘poisson’ loss)。

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import PoissonRegressor
from sklearn.experimental import enable_hist_gradient_boosting  # noqa
from sklearn.ensemble import HistGradientBoostingRegressor

n_samples, n_features = 100020
rng = np.random.RandomState(0)
X = rng.randn(n_samples, n_features)
# positive integer target correlated with X[:, 5] with many zeros:
y = rng.poisson(lam=np.exp(X[:, 5]) / 2)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=rng)
glm = PoissonRegressor()
gbdt = HistGradientBoostingRegressor(loss='poisson', learning_rate=.01)
glm.fit(X_train, y_train)
gbdt.fit(X_train, y_train)
print(glm.score(X_test, y_test))
print(gbdt.score(X_test, y_test))

# 輸出
0.35776189065725783
0.42425183539869415

1.1.2 估計器的豐富視覺呈現

現在,通過啟用display='diagram'選項,可以在筆記本中可視化估計器。這特別有助于總結管道(pipelines)和其他復合估計器的結構,并具有交互性以提供詳細信息。單擊下面的示例圖像以展開管道元素。有關如何使用此功能,請參見可視化組合估計器

from sklearn import set_config
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.compose import make_column_transformer
from sklearn.linear_model import LogisticRegression
set_config(display='diagram')

num_proc = make_pipeline(SimpleImputer(strategy='median'), StandardScaler())

cat_proc = make_pipeline(
    SimpleImputer(strategy='constant', fill_value='missing'),
    OneHotEncoder(handle_unknown='ignore'))

preprocessor = make_column_transformer((num_proc, ('feat1''feat3')),
                                       (cat_proc, ('feat0''feat2')))

clf = make_pipeline(preprocessor, LogisticRegression())
clf

1.1.3 對KMeans的可擴展性和穩定性的改進

KMeans估計器是完全重新寫的,現在它更快,更穩定。此外,Elkan算法現在與稀疏矩陣兼容。估計器使用的是基于OpenMP的并行性,而不是依賴于jowb,因此 n_jobs 參數不再起作用。有關如何控制線程數量的詳細信息,請參閱我們的并行性說明。

import scipy
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import completeness_score

rng = np.random.RandomState(0)
X, y = make_blobs(random_state=rng)
X = scipy.sparse.csr_matrix(X)
X_train, X_test, _, y_test = train_test_split(X, y, random_state=rng)
kmeans = KMeans(algorithm='elkan').fit(X_train)
print(completeness_score(kmeans.predict(X_test), y_test))

# 輸出
0.7571304089239168

1.1.4 基于直方圖的梯度提升估計器的改進

HistGradientBoostingClassifierHistGradientBoostingRegressor。作了不同的改進。在上述泊松損失的基礎上,這些估計器現在支持樣本權重。此外,還添加了一個自動早期停止標準:當樣本數超過10k時,默認情況下啟用早期停止。最后,用戶現在可以定義單調約束來根據特定特征的變化來約束預測。在下面的例子中,我們構造了一個通常與第一個特征正相關的目標,其中含有一些噪聲。應用單目標約束條件,預測可以捕捉第一個特征的全局效應,而不是對噪聲進行擬合。

1.1.5 Lasso和ElasticNet支持樣本權重

兩個線性回歸器LassoElasticNet現在支持樣本權重。

from sklearn.model_selection import train_test_split
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso
import numpy as np

n_samples, n_features = 100020
rng = np.random.RandomState(0)
X, y = make_regression(n_samples, n_features, random_state=rng)
sample_weight = rng.rand(n_samples)
X_train, X_test, y_train, y_test, sw_train, sw_test = train_test_split(
    X, y, sample_weight, random_state=rng)
reg = Lasso()
reg.fit(X_train, y_train, sample_weight=sw_train)
print(reg.score(X_test, y_test, sw_test))

# 輸出
0.999791942438998

腳本的總運行時間:(0分1.299秒)