19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能

1️⃣。协方差.椭圆包络分布有异常值是很常见的。许多算法处理异常值,EllipticalEnvelope是 Sklearn 直接内置的示例。该算法的优点是它在检

老铁们,大家好,相信还有很多朋友对于19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能和的相关问题不太懂,没关系,今天就由我来为大家分享分享19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

2。特征选择.RFECV

选择对预测最有用的特征是对抗过度拟合和降低模型复杂性的必要步骤。 Sklearn 提供的最强大的算法之一是递归特征消除(RFE)。它通过使用交叉验证自动找到最重要的特征并丢弃其余的。

该估计器的优点之一是它是一个wrapper——,可与任何返回特征重要性或系数分数的Sklearn 算法一起使用。以下是合成数据集的示例:

假数据集有15 个特征,其中10 个是信息性的,其余的是冗余的。我们使用5 倍RFECVRidge 作为估计量来拟合回归。训练完成后,可以使用transform方法丢弃冗余特征。调用.shape 向我们展示了估算器成功删除了所有5 个不必要的特征。

我写了一篇关于该算法的整篇文章,详细介绍了它如何处理真实数据集:

3。ensemble.ExtraTrees

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

“额外”这个词并不意味着更多的树,而是更多的随机性。该算法使用另一棵与决策树非常相似的树。唯一的区别是,不是在构建每棵树时计算分割阈值,而是为每个特征随机抽取这些阈值,并选择最佳阈值作为分割规则。这允许以稍微增加偏差为代价来减少方差:

正如您所看到的,ExtraTreesRegressor 在合成数据集上的表现优于随机森林。

4。impute.IterativeImputer和KNNImputer

如果您正在寻找比SimpleImputer 更强大、更先进的插值技术,Sklearn 可以再次满足您的需求。该插补子包包括两种基于模型的插值算法- KNNImputer 和IterativeImputer。

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

更稳健的算法是IterativeImputer。它通过将每个具有缺失值的特征建模为其他特征的函数来查找缺失值。这个过程是逐步完成的。在每一步中,选择一个具有缺失值的特征作为目标(y),其余的被选择作为特征数组(X)。然后,使用回归器来预测y 中的缺失值,并对每个特征继续此过程,直到max_iter 时间(IterativeImputer 的参数)。

结果,针对单个缺失值生成多个预测。这样做的优点是可以将每个缺失值视为随机变量,并关联它们带来的固有不确定性:

发现使用IterativeImputer 时BayesianRidge 和ExtraTree 的性能更好。

您可以在我的另一篇文章中了解有关这两种插补技术的更多信息:

5。线性模型.HuberRegressor

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

另一种算法是HuberRegressor。它不是完全删除它们,而是减少拟合过程中异常值的权重。它具有epsilon 超参数,用于控制应归类为异常值的样本数量。参数越小,对异常值的鲁棒性越强。它的API 与任何其他线性回归器相同。下面您可以看到它与具有大量异常值的数据集上的贝叶斯岭回归器的比较:

图片来自Sklearn 用户指南。许可证—BSD-3

可以看出,epsilon 1.35 1.5, 1.75 的HuberRegressor 成功捕获了一条不受异常值影响的最佳拟合线

您可以从用户指南中了解有关该算法的更多信息。

6。tree.plot_tree

plot_treeSklearn 允许您使用此函数绘制单个决策树的结构。对于刚刚开始学习基于树和集成模型的初学者来说,此功能可能会派上用场:

图片来自Sklearn 用户指南。许可证—BSD-3

还有其他绘制树的方法,例如Graphviz 格式。从用户指南中了解它们。

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能

7。线性模型.感知器

此列表中最酷的名字是#7—— Perceptron。尽管它的名字很奇特,但它是一个简单的线性二元分类器。该算法的定义特征是它适合大规模学习,并且默认情况下:

它不需要学习率。不要实施正则化。它仅根据错误更新其模型。它相当于SGDClassifier,loss=’perceptron’,eta0=1,learning_rate=’constant’,penalty=None,但速度稍快一些:

8。feature_selection.SelectFromModel

Sklearn 中另一个基于模型的特征选择估计器是SelectFromModel。它不像RFECV 那样强大,但对于海量数据集来说是一个不错的选择,因为它的计算成本较低。它也是一个包装估计器,适用于具有.feature_importances_ 或.coef_ 属性的任何模型:

正如您所看到的,该算法成功删除了所有40 个冗余特征。

9。metrics.ConfusionMatrixDisplay

老实说,我不会说我喜欢默认的混淆矩阵。它的格式是固定的,——行是真实标签,列是预测。此外,第一行和第一列是负类,第二行和第二列是正类。有些人可能更喜欢不同格式的矩阵,可能是转置或翻转。

例如,我喜欢将正类作为第一行和第一列,以与维基百科中给出的格式保持一致。这有助于我更好地分离4 个矩阵项——TP、FP、TN、FN。幸运的是,您可以使用另一个函数来绘制自定义矩阵- ConfusionMatrixDisplay:

将混淆矩阵cm 传递给ConfusionMatrixDisplay 后。

。广义线性模型

如果有其他类型的分布可用的替代方案,则将目标( y ) 转换为正态分布是没有意义的。

例如,Sklearn 为具有Poisson、Tweedy 或gamma 分布的目标变量提供了3 个广义线性模型。 TweedieRegressor 和GammaRegressor 可以为具有各自分布的目标生成稳健的结果,而不是期望正态分布的PoissonRegressor。

除此之外,它们的API 与任何其他Sklearn 模型相同。要确定目标的分布是否与上述三个分布相匹配,您可以在同一轴上以完美分布绘制它们的PDF(概率密度函数)。

例如,要查看目标是否遵循泊松分布,请使用Seaborn 绘制其PDF,并使用具有相同轴的kdeplot 从Numpy 中采样来绘制完美的泊松分布。 np随机泊松

11。ensemble.IsolationForest

由于基于树的模型和集成模型通常会产生更稳健的结果,因此它们在异常值检测方面也被证明是有效的。 Sklearn 中的IsolationForest 使用极其随机的树森林(tree.ExtraTreeRegressor) 来检测异常值。每棵树尝试通过选择单个特征并在所选特征的最大值和最小值之间随机选择分割值来隔离每个样本。

这种类型的随机分区在每棵树的根节点和终止节点之间产生明显更短的路径。

因此,当随机树森林共同为特定样本产生较短的路径长度时,它们很可能是异常现象——Sklearn 用户指南。

该算法正确捕获了异常值(90) 并将其标记为-1。

在用户指南中阅读有关该算法的更多信息。

12。预处理.PowerTransformer

许多线性模型需要对数值特征进行一些转换才能使其呈正态分布。 StandardScaler 和MinMaxScaler 适用于大多数发行版。然而,当数据存在高度偏度时,分布的核心指标(例如均值、中值、最小值和最大值)就会受到影响。因此,简单的归一化和标准化不适合偏态分布。

相反,PowerTransformer 的Sklearn 实现使用对数变换将任何倾斜特征转换为尽可能接近正态分布。考虑Diamonds 数据集中的这两个特征:

两者都严重扭曲。让我们使用对数变换来解决这个问题:

倾斜消失了!您可以在此处阅读有关不同类型特征转换的更多信息:

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能

13。预处理.RobustScaler

Sklearn 中的另一个数字转换器是RobustScaler。您可能可以从它的名称中猜出它的作用—— 它以对异常值稳健的方式转换特征。如果特征中存在异常值,则很难使它们呈正态分布,因为它们会严重扭曲均值和标准差。

RobustScaler 不使用均值/标准差,而是使用中位数和IQR(四分位距)来缩放数据,因为这两个指标都不会因异常值而产生偏差。您还可以在用户指南中了解它。

14。compose.make_column_transformer

在Sklearn 中,有一个使用make_pipeline 函数创建Pipeline 实例的简写。此函数接受转换器和估计器并完成其工作,而不是命名每个步骤并使代码不必要地冗长:

对于更复杂的场景,使用ColumnTransformer,它也有同样的问题——每个预处理步骤都应该命名,这使得你的代码又长又不可读。值得庆幸的是,Sklearn 提供了类似的函数make_pipeline:

正如您所看到的,usingmake_column_transformer 更短,并且负责命名每个转换器步骤本身。

15。compose.make_column_selector

如果您注意到,我们使用select_dtypes 函数和DataFrames 的columnspandas 属性来隔离数字列和分类列。虽然这确实有效,但使用Sklearn 有一个更灵活、更优雅的解决方案。

make_column_selector 函数创建一个可以直接传递给ColumnTransformer 实例的列选择器。它的工作原理与select_dtypes 一样好。它具有参数dtype_include,该参数根据数据类型选择列。如果需要自定义列过滤器,可以将正则表达式传递给dtype_exclude,pattern,同时将其他参数设置为None。它的工作原理如下:

无需传递列名列表,只需传递make_column_selector 的实例以及相关参数即可开始!

16。preprocessing.OrdinalEncoder

初学者的一个常见错误是使用LabelEncoder 序数分类特征进行编码。如果您注意到,LabelEncoder 一次只允许转换一列,而不是同时转换OneHotEncoder。你可能会认为Sklearn 犯了一个错误!

事实上,LabelEncoder 只能用于对响应变量( y ) 进行编码,如其文档中所指定。要对特征数组(X) 进行编码,您应该使用OrdinalEncoder,它按预期工作。它将序数分类列转换为具有类(0, n_categories – 1) 的特征。它对一行代码中的所有指定列执行此操作,从而允许将其包含在管道中。

17。metrics.get_scorer

Sklearn 内置了50 多个指标,它们的文本名称可以在sklearn.metrics.SCORERS.keys 中找到。在单个项目中,您可能必须使用多个指标,如果单独使用它们,则需要导入它们。

将大量指标直接导入sklearn.metrics 可能会污染您的命名空间并变得不必要的长。作为解决方案,您可以使用metrics.get_scorer函数通过文本名称访问任何指标,而无需导入它:

18。model_selection.HalvingGrid和HalvingRandomSearchCV

在Sklearn 0.24 版本中,我们引入了两个实验性超参数优化器:HalvingGridSearchCV 和HalvingRandomSearchCV 类。

与它们详尽的表兄弟GridSearch 和RandomizedSearch 不同,新类使用一种称为顺序减半的技术。参数只给出数据的子集,而不是在所有数据上训练所有候选者。通过在较小的数据子集上对表现最差的候选者进行训练来过滤掉表现最差的候选者。每次迭代后,训练样本都会增加一个因子,并且可能的候选样本数量会减少,从而缩短评估时间。

快多少?在我进行的实验中,HalvingGridSearch 比常规GridSearch 快11 倍,而HalvingRandomSearch 甚至比HalvingGridSearch 快10 倍。您可以在这里阅读我对连续减半和实验的详细概述:

19。sklearn.utils

最后但并非最不重要的一点是,Sklearn 在子包sklearn.utils 下有大量实用程序和辅助函数。 Sklearn 本身使用该模块中的函数来构建我们都使用的所有转换器和估计器。

有很多有用的,例如class_weight.compute_class_weight、estimator_html_repr、shuffle、check_X_y 等。您可以在自己的工作流程中使用它们,使您的代码更像Sklearn,或者在创建适合的自定义转换器和估计器时它们可能会派上用场进入Sklearn API。

用户评论

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
青衫故人

这篇博文太赞了!我一直觉得scikit-learn的使用还停留在基础操作上,没意识到它还有这么多隐藏功能。终于有了提升水平的机会! 我要认真研究一下这些方法,下次做项目的时候就能更得心应手了。

    有13位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
浅巷°

这个标题看着就让我头疼… 不太喜欢这“艰难”的口吻,好像学起来很难似的。不过我倒想看看这些隐藏功能是什么,说不定能开拓我的思路哦!

    有17位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
古巷青灯

说的不错!Sklearn的确很牛逼,但很多初学者被表面层面的功能蒙蔽了,其实还有那么多强大的工具没被挖掘出来。这篇文章很有帮助,希望作者后续再分享更多实战经验。

    有15位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
你身上有刺,别扎我

我就说嘛,我感觉自己对 Sklearn 的了解停滞了一段时间!原来是缺少了一些进阶技巧啊。我现在迫切想学习这些 “隐藏功能”,提升自己的机器学习能力。

    有5位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
我的黑色迷你裙

看完标题,我的第一反应就是“大佬的技能都在这里了,我还是太菜鸟了…”😂 不过我还是要尝试一下,或许能够学到一些新知识,突破自己目前的瓶颈吧。

    有13位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
清羽墨安

感觉这个博文中提到的功能有些过于 niche 了,对大部分用户来说没多大实际意义吧?我还是喜欢那些通用的方法,好用又易于理解。

    有15位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
余笙南吟

我已经在 Sklearn 上花了太多时间了,这篇文章让我更加迷茫了 … "隐藏功能" 可能只是为了迎合一部分人对更复杂技术的追求吗?还是说这些技能真的可以解决实际问题?

    有13位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
夏以乔木

不得不承认作者分享的观点很有道理。学习机器学习不仅要掌握基础知识,更要不断深入挖掘工具的功能,才能真正成为一名优秀的数据科学家! 以后我要多关注这类进阶技巧,提升自己的能力水平。

    有20位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
恰十年

这个标题让我很兴奋!我一直想突破自己对 Sklearn 的了解,找到一些更强大的方法。我已经迫不及待想去尝试这些隐藏功能了,看看能否在我的项目中有所应用!

    有14位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
陌上花

我担心这篇文章会让人过于追求“隐藏的功能”,而忽略了机器学习真正的本质:将数据转化为有意义的知识。

    有9位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
不忘初心

希望文章能提供一些具体的示例和案例,这样更容易理解这些 “隐藏功能” 的用途和应用场景。光看理论描述就可能产生偏差。

    有20位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
北朽暖栀

我更喜欢那些实用的解决方案,而不是过于理论化的讲解。 这些“隐藏功能” 是否能够真正解决问题,还是只是为了提升技术难度?

    有16位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
愁杀

对于想要深入 Study Sklearn 的读者来说,这篇文章绝对值得一读! 作者总结的 “隐藏功能” 并不少见,但很多新手可能不知道它们的存在,这篇博文就能起到很好的指引作用,让人在实践中不断探索更强大的可能性。

    有5位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
把孤独喂饱

我还是觉得学习机器学习最重要的是理解算法原理和逻辑思维,而不是仅仅掌握一些“技巧”。 但这篇文章确实展现了一些 Sklearn 的深度和广度,让我对这个工具有了更全面认识。

    有19位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
我家的爱豆是怪比i

这个标题很眼球惹人好奇! 我一直以为自己对 Sklearn 已经比较熟悉了,但现在看来还有很多地方需要学习。 我迫不及待想去尝试这些“隐藏功能”,看看能不能提升模型的性能!

    有15位网友表示赞同!

19 个你应该通过艰苦的方式学习的隐藏Sklearn 功能
几妆痕

确实,有些技巧不提可能很难被人想到,这篇文章很好的梳理了这些细节,对于想要在 Sklearn 中更深入研究的人来说非常有帮助。不过文章中可以再添加一些具体的代码示例,更方便理解和应用。

    有17位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/114480.html

(0)
小su's avatar小su
上一篇 2024年9月1日 上午2:25
下一篇 2024年9月1日 上午2:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注