19 个隐藏的 Sklearn 功能,你应该以艰难的方式学习
bigegpt 2024-09-29 09:22 3 浏览
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——感知器。尽管它有一个花哨的名字,但它是一个简单的线性二元分类器。该算法的定义特征是它适用于大规模学习,默认情况下:
- 它不需要学习率。
- 不要实施正则化。
- 它仅根据错误更新其模型。
它等效于 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 提供的不仅仅是表面上的东西!
谢谢阅读!
相关推荐
- 有些人能留在你的心里,但不能留在你生活里。
-
有时候,你必须要明白,有些人能留在你的心里,但不能留在你生活里。Sometimes,youhavetorealize,Somepeoplecanstayinyourheart,...
- Python学不会来打我(34)python函数爬取百度图片_附源码
-
随着人工智能和大数据的发展,图像数据的获取变得越来越重要。作为Python初学者,掌握如何从网页中抓取图片并保存到本地是一项非常实用的技能。本文将手把手教你使用Python函数编写一个简单的百度图片...
- 软网推荐:图像变变变 一“软”见分晓
-
当我们仅需要改变一些图片的分辨率、裁减尺寸、添加水印、标注文本、更改图片颜色,或将一种图片转换为另一种格式时,总比较讨厌使用一些大型的图像处理软件,尤其是当尚未安装此类软件时,更是如此。实际上,只需一...
- 首款WP8.1图片搜索应用,搜照片得资料
-
首款WP8.1图片搜索应用,搜照片得资料出处:IT之家原创(天际)2014-11-1114:32:15评论WP之家报道,《反向图片搜索》(ReverseImageSearch)是Window...
- 盗墓笔记电视剧精美海报 盗墓笔记电视剧全集高清种子下载
-
出身“老九门”世家的吴邪,因身为考古学家的父母在某次保护国家文物行动时被国外盗墓团伙杀害,吴家为保护吴邪安全将他送去德国读书,因而吴邪对“考古”事业有着与生俱来的兴趣。在一次护宝过程中他偶然获得一张...
- 微软调整Win11 24H2装机策略:6月起36款预装应用改为完整版
-
IT之家7月16日消息,微软公司今天(7月16日)发布公告,表示自今年6月更新开始,已默认更新Windows1124H2和WindowsServer2025系统中预装...
- 谷歌手把手教你成为谣言终结者 | 域外
-
刺猬公社出品,必属原创,严禁转载。合作事宜,请联系微信号:yunlugongby贾宸琰编译、整理11月23日,由谷歌新闻实验室(GoogleNewsLab)联合Bellingcat、DigD...
- NAS 部署网盘资源搜索神器:全网资源一键搜,免费看剧听歌超爽!
-
还在为找不到想看的电影、电视剧、音乐而烦恼?还在各个网盘之间来回切换,浪费大量时间?今天就教你如何在NAS上部署aipan-netdisk-search,一款强大的网盘资源搜索神器,让你全网资源...
- 使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建
-
前言回顾在上一篇文章《搭建持久化的INFINIConsole与Easysearch容器环境》中,我们详细介绍了如何使用基础的dockerrun命令,手动启动和配置INFINICon...
- 为庆祝杜特尔特到访,这个国家宣布全国放假?
-
(观察者网讯)近日,一篇流传甚广的脸书推文称,为庆祝杜特尔特去年访问印度,印度宣布全国放假,并举办了街头集会以示欢迎。菲媒对此做出澄清,这则消息其实是“假新闻”。据《菲律宾世界日报》2日报道,该贴子...
- 一课译词:毛骨悚然(毛骨悚然的意思是?)
-
PhotobyMoosePhotosfromPexels“毛骨悚然”,汉语成语,意思是毛发竖起,脊梁骨发冷;形容恐惧惊骇的样子(withone'shairstandingonend...
- Bing Overtakes Google in China's PC Search Market, Fueled by AI and Microsoft Ecosystem
-
ScreenshotofBingChinahomepageTMTPOST--Inastunningturnintheglobalsearchenginerace,Mic...
- 找图不求人!6个以图搜图的识图网站推荐
-
【本文由小黑盒作者@crystalz于03月08日发布,转载请标明出处!】前言以图搜图,专业说法叫“反向图片搜索引擎”,是专门用来搜索相似图片、原始图片或图片来源的方法。常用来寻找现有图片的原始发布出...
- 浏览器功能和“油管”有什么关联?为什么要下载
-
现在有没有一款插件可以实现全部的功能,同时占用又小呢,主题主要是网站的一个外观,而且插件则主要是实现wordpress网站的一些功能,它不仅仅可以定制网站的外观,还可以实现很多插件的功能,搭载chro...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)