百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

19 个隐藏的 Sklearn 功能,你应该以艰难的方式学习

toyiye 2024-07-08 23:07 15 浏览 0 评论

1??。协方差.椭圆包络

分布有异常值是很常见的。许多算法处理异常值,EllipticalEnvelope是 Sklearn 直接内置的示例。该算法的优点是它在检测正态分布(高斯)特征中的异常值方面表现出色:

为了测试估计器,我们创建了一个平均值为 5 和标准差为 2 的正态分布。在它被训练之后,我们将一些随机数传递给它的predict方法。该方法为 20、10、13 中的异常值返回 -1 test。

2??。特征选择.RFECV

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

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

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

我已经写了一篇关于这个算法的整篇文章,涵盖了它如何与真实数据集一起工作的细节:

3??。ensemble.ExtraTrees

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

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

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

从官方用户指南中阅读更多关于极随机树的信息。

4??。impute.IterativeImputer和KNNImputer

如果您正在寻找比 更强大和更先进的插补技术SimpleImputer,Sklearn 再次为您服务。该impute子包包括两个基于模型的插补算法 -KNNImputer和IterativeImputer.

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

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

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

发现 BayesianRidge 和 ExtraTree 使用 IterativeImputer 表现更好。

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

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 格式。从用户指南中了解它们。

7??。线性模型.感知器

这个列表中最酷的名字是#7——感知器。尽管它有一个花哨的名字,但它是一个简单的线性二元分类器。该算法的定义特征是它适用于大规模学习,默认情况下:

  1. 它不需要学习率。
  2. 不要实施正则化。
  3. 它仅根据错误更新其模型。

它等效于 SGDClassifier,loss='perceptron', eta0=1, learning_rate="constant", penalty=None但速度稍快:

8??。feature_selection.SelectFromModel

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

如您所见,该算法设法删除了所有 40 个冗余特征。

9??。metrics.ConfusionMatrixDisplay

混淆矩阵是分类问题的圣杯。大多数指标都来源于它,例如精度、召回率、F1、ROC AUC 等。Sklearn 允许您计算和绘制默认的混淆矩阵:

作者图片

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

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

作者图片

在将混淆矩阵cm传递给ConfusionMatrixDisplay.

您可以从本文中了解有关分类和混淆矩阵的所有信息:

。广义线性模型

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

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

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

例如,要查看目标是否遵循泊松分布,请使用 Seaborn 绘制其 PDF,并通过使用相同轴kdeplot从 Numpy 对其进行采样来绘制完美泊松分布。np.random.poisson

1??1??。ensemble.IsolationForest

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

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

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

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

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

1??2??。预处理.PowerTransformer

许多线性模型需要对数字特征进行一些转换以使其呈正态分布。StandardScaler并且MinMaxScaler对于大多数发行版都工作得很好。但是,当数据中存在高度偏态时,分布的核心指标,例如平均值、中值、最小值和最大值会受到影响。因此,简单的归一化和标准化不适用于偏态分布。

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

作者图片

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

作者图片

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

1??3??。预处理.RobustScaler

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

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

1??4??。compose.make_column_transformer

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

对于更复杂的场景,ColumnTransformer使用 ,它具有相同的问题 - 每个预处理步骤都应该命名,使您的代码长且不可读。值得庆幸的是,Sklearn 提供了类似的功能make_pipeline:

如您所见, usingmake_column_transformer更短,并且它自己负责命名每个转换器步骤。

1??5??。compose.make_column_selector

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

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

无需传递列名列表,只需传递make_column_selector带有相关参数的实例,就可以了!

1??6??。preprocessing.OrdinalEncoder

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

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

1??7??。metrics.get_scorer

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

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

1??8??。model_selection.HalvingGrid和HalvingRandomSearchCV

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

与它们详尽的表亲 GridSearch 和 RandomizedSearch 不同,新类使用一种称为连续减半的技术。不是在所有数据上训练所有候选集,而是只给参数一个数据子集。通过在较小的数据子集上训练它们来过滤掉表现最差的候选者。每次迭代后,训练样本会增加一些因子,而可能的候选者数量会减少,从而导致评估时间更快。

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

1??9??。sklearn.utils

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

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

概括

尽管 CatBoost、XGBoost、LightGBM 等库正在慢慢从 Sklearn 中抢走领先的 ML 库的头把交椅,但它仍然是现代 ML 工程师技能堆栈中非常宝贵的一部分。

一致的 API、卓越的代码设计以及创建强大的 ML 工作流的能力仍然使 Sklearn 在功能和灵活性方面无与伦比。尽管我们可以在基础知识方面完成很多工作,但本文表明 Sklearn 提供的不仅仅是表面上的东西!

谢谢阅读!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码