您现在的位置是:网站首页> 编程资料编程资料

19个Python Sklearn中超实用的隐藏功能分享_python_

2023-05-26 325人已围观

简介 19个Python Sklearn中超实用的隐藏功能分享_python_

今天跟大家介绍 19 个 Sklearn 中超级实用的隐藏的功能,这些功能虽然不常见,但非常实用,它们可以直接优雅地替代手动执行的常见操作。接下来我们就一个一个介绍这些功能,希望对大家有所帮助!

写在前面

通过查看 Sklearn 的 API,发现最常用的模型和函数只是众多库中的一小部分。尽管某些功能的使用范围非常小并且一般用于一些边缘情况,但我发现很多评估器、转换器和实用程序功能可以很好地处理手动执行的常见操作。

https://scikit-learn.org/stable/modules/classes.html#api-reference

因此,接下来我将列出最重要的一些功能并做个简要的解释,这样可以我们扩展一些 Sklearn 工具集,以便在学习工作中可以更好地更快地处理事务。

1 .covariance.EllipticEnvelope

通常,在我们的所处理的数据分布中有异常值是很常见的,并且许多算法都可以处理离群值,而 EllipticalEnvelope 就是 Sklearn 中直接内置的一个例子。该算法的优势在于,它在检测正态分布(高斯)特征中的异常点时表现得非常好:

import numpy as np from sklearn.covariance import EllipticEnvelope # 创建一个样本正态分布 X = np.random.normal(loc=5, scale=2, size=50).reshape(-1, 1) # 拟合估计量 ee = EllipticEnvelope(random_state=0) _ = ee.fit(X) # 测试 test = np.array([6, 8, 20, 4, 5, 6, 10, 13]).reshape(-1, 1) # Predict返回1作为内嵌值,返回-1作为异常值 >>> ee.predict(test) array([ 1,  1, -1,  1,  1,  1, -1, -1]) 

为了检验评估结果,我们创建了一个均值为5,标准差为2的正态分布。训练完成后,将一些随机数传递给它的预测方法。该方法返回-1表示测试中的异常值,即20、10、13。

2 .feature_selection.RFECV

我们在做数据挖掘,做特征工程时,选择对预测最有帮助的特征是防止过拟合和降低模型复杂性的必要步骤。Sklearn提供的最健壮的算法之一是递归特征消除(RFE)。它通过使用交叉验证自动找到最重要的特性,并丢弃其余的。

这个评估器的一个优点是它是一个包装器——它可以用于返回特征重要性或系数分数的任何 Sklearn 算法。下面是一个关于合成数据集的例子:

from sklearn.datasets import make_regression from sklearn.feature_selection import RFECV from sklearn.linear_model import Ridge # 构建一个合成数据集 X, y = make_regression(n_samples=10000, n_features=15, n_informative=10) # 初始化和拟合选择器 rfecv = RFECV(estimator=Ridge(), cv=5) _ = rfecv.fit(X, y) # 转换特性阵列 >>> rfecv.transform(X).shape (10000, 10) 

数据集有 15 个特征,其中 10 个特征是信息丰富的,其余都是冗余的。我们用岭回归拟合 5-fold RFECV 作为评估器。训练后,可以使用变换方法丢弃冗余特征。最后调用 .shape 查看评估器删除了所有 5 个冗余的特性。

3 .ensemble.ExtraTrees

我们都知道,尽管随机森林非常强大,但过度拟合的风险非常高。因此,Sklearn提供了称为 ExtraTrees(分类器和回归器) 的 RF 替代方案。

"Extra" 这个词并不是指更多的树,而是指更多的随机性。该算法使用了另一种类似于决策树的树。唯一的区别是,不同于在构建每棵树时计算分割阈值,这些阈值是为每个特征随机绘制的,并选择最佳阈值作为分割规则。这允许以偏差略微增加的代价来降低方差:

from sklearn.ensemble import ExtraTreesRegressor, RandomForestRegressor from sklearn.model_selection import cross_val_score from sklearn.tree import DecisionTreeRegressor X, y = make_regression(n_samples=10000, n_features=20) # 决策树 clf = DecisionTreeRegressor(max_depth=None, min_samples_split=2, random_state=0) scores = cross_val_score(clf, X, y, cv=5) >>> scores.mean() 0.6376080094392635 # 随机森林 clf = RandomForestRegressor(     n_estimators=10, max_depth=None, min_samples_split=2, random_state=0 ) scores = cross_val_score(clf, X, y, cv=5) >>> scores.mean() 0.8446103607404536 # ExtraTrees clf = ExtraTreesRegressor(     n_estimators=10, max_depth=None, min_samples_split=2, random_state=0 ) scores = cross_val_score(clf, X, y, cv=5) >>> scores.mean() 0.8737373931608834 

如结果所示,ExtraTreesRegressor 在合成数据集上的表现优于随机森林。

4 .impute.IterativeImputer 和 .impute.KNNImputer

如果你正在寻找比 SimpleImputer 更健壮、更先进的 imputation 技术,Sklearn再次为你提供了支持。impute 子包包括两个基于模型的 impute 算法 KNNImputer 和 IterativeImputer

顾名思义,KNNImputer 使用 k-Nearest-Neighbors 算法来寻找缺失值的最佳替代:

from sklearn.impute import KNNImputer # 代码取自Sklearn用户指南 X = [[1, 2, np.nan],       [3, 4, 3],       [np.nan, 6, 5],       [8, 8, 7]] imputer = KNNImputer(n_neighbors=2) imputer.fit_transform(X) 

输出:

array([[1. , 2. , 4. ],
       [3. , 4. , 3. ],
       [5.5, 6. , 5. ],
       [8. , 8. , 7. ]])

另一个更健壮的算法是 IterativeImputer它通过将每个特征的缺失值建模为其他特征的函数来寻找缺失值。 这个过程是按循序渐进的循环方式完成的。在每一步中,选择一个具有缺失值的特征作为目标(y),其余的作为特征数组(X)。然后,使用回归函数预测 y 中的缺失值,并对每个特征继续这个过程,直到 max_iter 次数 (IterativeImputer的一个参数)。

因此,会为一个缺失的值生成多个预测。这样做的好处是,可以将每个缺失的值视为随机变量,并将其与固有的不确定性联系起来:

from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer from sklearn.linear_model import BayesianRidge imp_mean = IterativeImputer(estimator=BayesianRidge()) imp_mean.fit([[7, 2, 3],                [4, np.nan, 6],                [10, 5, 9]])                X = [[np.nan, 2, 3],       [4, np.nan, 6],       [10, np.nan, 9]] imp_mean.transform(X) 

输出:

array([[ 6.95847623,  2.        ,  3.        ],
       [ 4.        ,  2.6000004 ,  6.        ],
       [10.        ,  4.99999933,  9.        ]])

结果表明,使用 IterativeImputer 缺失值填补算法的 BayesianRidge 和 ExtraTree 算法性能效果变现更加优秀。

5 .linear_model.HuberRegressor

虽然正常情况下,数据分布中存在异常值是非常常见的, 但异常值的存在会严重破坏任何模型的预测。许多异常值检测算法会丢弃异常值并将其标记为缺失。虽然这有助于模型的学习,但它完全消除了异常值对分布的影响。

另一种算法是 HuberRegressor 回归算法。它不是完全去除它们,而是在拟合数据期间给予异常值更小的权重。它有超参数 epsilon 来控制样本的数量,这些样本应该被归类为异常值。参数越小,对异常值的鲁棒性越强。它的API与任何其他线性回归函数相同。下面,你可以看到它与贝叶斯岭回归器在一个有大量异常值的数据集上的比较:

可以看到,设置参数 epsilon 为 1.35 1.5, 1.75 的 huberregressionor 算法设法捕获不受异常值影响的最佳拟合线。

6 .tree.plot_tree

Sklearn 中可以使用 plot_tree 函数绘制单个决策树的结构。这个特性可能对刚开始学习基于树的模型和集成模型的初学者很方便,通过该方法,对决策树的决策过程可视化,对其决策过程和原理更加一目了然。

from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier, plot_tree iris = load_iris() X, y = iris.data, iris.target clf = DecisionTreeClassifier() clf = clf.fit(X, y) plt.figure(figsize=(15, 10), dpi=200) plot_tree(clf, feature_names=iris.feature_names,                 class_names=iris.target_names); 

还有其他绘制树的方法,比如 Graphviz。

7 .linear_model.Perceptron

尽管感知机是一个奇特的名字,但它是一个简单的线性二进制分类器。算法的定义特征是适合大规模学习,默认为:

  • 它不需要学习速率。
  • 不要实现正则化。
  • 它只在分类错误的情况下更新模型。

它等价于 SGDClassifierloss='perceptron', eta0=1, learning_rate="constant", penalty=None ,但略快:

from sklearn.datasets import make_classification from sklearn.linear_model import Perceptron # 创建一个更大的数据集 X, y = make_classification(n_samples=100000, n_features=20, n_classes=2) # Init/Fit/Score clf = Perceptron() _ = clf.fit(X, y) clf.score(X, y) 

输出:

0.91928

8 .feature_selection.SelectFromModel

Sklearn 中另一个基于模型的特征选择模型是 SelectFromModel。它不像RFECV那样健壮,但由于它具有较低的计算成本,可以作为大规模数据集的一个很好的选择。它也是一个包装器模型,适用于任何具有 .feature_importance_ 或 .coef_ 属性的模型:

from sklearn.feature_selection import SelectFromModel # 创建一个包含40个无信息特征的数据集 X, y = make_regression(n_samples=int(1e4), n_features=50, n_informative=10) # 初始化选择器并转换特性数组 selector = SelectFromModel(estimator=ExtraTreesRegressor()).fit(X, y) selector.transform(X).shape 

输出:

(10000, 8)

如结果所示,算法成功地删除了所有40个冗余特征。

9 .metrics.ConfusionMatrixDisplay

总所周知,混淆矩阵是用于评估分类问题的常用方法。我们通常使用的大多数指标都来自于它,如精度、召回率、F1、ROC AUC等等。Sklearn中可以计算和绘制一个默认的混淆矩阵:

from sklearn.metrics import plot_confusion_matrix from sklearn.model_selection import train_test_split # 创建一个二元分类问题 X, y = make_classification(n_samples=200, n_features=5, n_classes=2) X_train, X_test, y_train, y_test = train_test_split(     X, y, test_size=0.5, random_state=1121218 ) clf = ExtraTreeClassifier().fit(X_train, y_train) fig, ax = plt.subplots(figsize=(5, 4), dpi=100) plot_confusion_matrix(clf, X_test, y_test, ax=ax); 

提示: 本文由整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!

-六神源码网