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\) 个分位数 \(q \in (0, 1)\) 提供线性预测 \(\hat{y}(w, X) = Xw\)。然后通过以下最小化问题找到权重或系数 \(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' dataframe 时,估计器将设置一个包含特征名称的 feature_names_in_ 属性。这是 SLEP007 的一部分。请注意,仅当 dataframe 中的列名称均为字符串时,才启用特征名称支持。feature_names_in_ 用于检查传入非 fit(例如 predict)的 dataframe 的列名称是否与 fit 中的特征一致。

import pandas as pd

from sklearn.preprocessing import StandardScaler

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 的变换器以及输入和输出之间存在一对一对应关系的变换器(例如 StandardScaler),get_feature_names_out 支持可用。未来版本将向所有其他变换器添加 get_feature_names_out 支持。此外,compose.ColumnTransformer.get_feature_names_out 可用于组合其变换器的特征名称。

import pandas as pd

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

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 可用于近似在 OneClassSVM 中实现的核化单类 SVM 的解,其拟合时间复杂度与样本数呈线性关系。请注意,核化单类 SVM 的复杂度充其量与样本数的平方呈二次关系。SGDOneClassSVM 因此非常适合具有大量训练样本(> 10,000)的数据集,对于这些数据集,SGD 变体可以快几个数量级。请查看此示例以了解其使用方式,并参阅用户指南了解更多详细信息。

../../_images/sphx_glr_plot_anomaly_comparison_001.png

基于直方图的梯度提升模型现已稳定#

HistGradientBoostingRegressorHistGradientBoostingClassifier 不再是实验性的,可以简单地导入和使用,如下所示:

from sklearn.ensemble import HistGradientBoostingClassifier

新的文档改进#

此版本包括许多文档改进。在合并的 2100 多个拉取请求中,约有 800 个是对我们文档的改进。

脚本总运行时间: (0 minutes 0.014 seconds)

相关示例

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.7 发布亮点

scikit-learn 1.7 发布亮点

由 Sphinx-Gallery 生成的图库