scikit-learn库新特性介绍

在最新的scikit-learn版本中,引入了一系列重要的bug修复和性能改进,同时增加了一些关键的新特性。以下是本次发布的一些主要功能的详细介绍。若要查看所有变更的详尽列表,请参考发布说明。

要安装最新版本的scikit-learn,可以使用pip或conda进行安装。使用pip的命令如下:

pip install --upgradescikit-learn

或者使用conda的命令:

conda install -c conda-forge scikit-learn

元数据路由

正在引入一种新的方法来在代码库中路由元数据,例如sample_weight,这将影响pipeline.Pipeline和model_selection.GridSearchCV等元估计器如何路由元数据。虽然这个特性的基础设施已经包含在本次发布中,但相关工作仍在进行中,并非所有的元估计器都支持这个新特性。可以在元数据路由用户指南中了解更多关于这个特性的信息。需要注意的是,这个特性仍在开发中,大多数元估计器尚未实现。第三方开发者可以开始将此功能整合到他们的元估计器中。更多细节,请参见元数据路由开发者指南。

HDBSCAN:层次密度聚类算法

原本托管在scikit-learn-contrib仓库中的cluster.HDBSCAN已经被纳入scikit-learn。它缺少一些原始实现的功能,这些功能将在未来的版本中添加。通过同时对多个epsilon值执行修改版的cluster.DBSCAN,cluster.HDBSCAN能够找到不同密度的聚类,使其比cluster.DBSCAN对参数选择更加鲁棒。更多细节,请参见用户指南。

import numpy as np from sklearn.cluster import HDBSCAN from sklearn.datasets import load_digits from sklearn.metrics import v_measure_score X, true_labels = load_digits(return_X_y=True) print(f"数字的数量:{len(np.unique(true_labels))}") hdbscan = HDBSCAN(min_cluster_size=15).fit(X) non_noisy_labels = hdbscan.labels_[hdbscan.labels_ != -1] print(f"找到的聚类数量:{len(np.unique(non_noisy_labels))}") print(v_measure_score(true_labels[hdbscan.labels_ != -1], non_noisy_labels))

输出结果:

数字的数量:10 找到的聚类数量:11 0.9694898472080092

TargetEncoder:新的类别编码策略

preprocessing.TargetEncoder非常适合高基数的分类特征,它基于属于该类别的观测值的平均目标值的收缩估计来编码类别。更多细节,请参见用户指南。

import numpy as np from sklearn.preprocessing import TargetEncoder X = np.array([["cat"]*30 + ["dog"]*20 + ["snake"]*38], dtype=object) y = [90.3]*30 + [20.4]*20 + [21.2]*38 enc = TargetEncoder(random_state=0) X_trans = enc.fit_transform(X, y) enc.encodings_[np.array([90.3, 20.4, 21.2])]

决策树支持缺失值

tree.DecisionTreeClassifier和tree.DecisionTreeRegressor现在支持缺失值。对于非缺失数据上的每个潜在阈值,分割器将评估将所有缺失值发送到左节点或右节点的分割。更多细节,请参阅用户指南或查看直方图梯度提升树中此功能的使用案例示例。

import numpy as np from sklearn.tree import DecisionTreeClassifier X = np.array([0, 1, 6, np.nan]).reshape(-1, 1) y = [0, 0, 1, 1] tree = DecisionTreeClassifier(random_state=0).fit(X, y) tree.predict(X)

输出结果:

array([0, 0, 1, 1])

新的显示ValidationCurveDisplay

model_selection.ValidationCurveDisplay现在可用于绘制model_selection.validation_curve的结果。

from sklearn.datasets import make_classification from sklearn.linear_model import LogisticRegression from sklearn.model_selection import ValidationCurveDisplay X, y = make_classification(1000, 10, random_state=0) _ = ValidationCurveDisplay.from_estimator(LogisticRegression(), X, y, param_name="C", param_range=np.geomspace(1e-5, 1e3, num=9), score_type="both", score_name="Accuracy")

梯度提升的Gamma损失

ensemble.HistGradientBoostingRegressor类现在通过loss="gamma"支持Gamma偏差损失函数。这个损失函数对于建模严格正的目标变量且具有右偏分布非常有用。

import numpy as np from sklearn.model_selection import cross_val_score from sklearn.datasets import make_low_rank_matrix from sklearn.ensemble import HistGradientBoostingRegressor n_samples, n_features = 500, 10 rng = np.random.RandomState(0) X = make_low_rank_matrix(n_samples, n_features, random_state=rng) coef = rng.uniform(low=-10, high=20, size=n_features) y = rng.gamma(shape=2, scale=np.exp(X @ coef) / 2) gbdt = HistGradientBoostingRegressor(loss="gamma") cross_val_score(gbdt, X, y).mean()

输出结果:

np.float64(0.46858513287221654)

类似于preprocessing.OneHotEncoder,preprocessing.OrdinalEncoder类现在支持将不频繁的类别聚合到每个特征的单个输出中。启用收集不频繁类别的参数是min_frequency和max_categories。更多细节,请参见用户指南。

from sklearn.preprocessing import OrdinalEncoder import numpy as np X = np.array([["dog"]*5 + ["cat"]*20 + ["rabbit"]*10 + ["snake"]*3], dtype=object).T enc = OrdinalEncoder(min_frequency=6).fit(X) enc.infrequent_categories_[np.array(['dog', 'snake'], dtype=object)]
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485