炸裂!Sklearn 的 10 个宝藏级使用方法!

大家好,本次给大家介绍10个Sklearn方法,比较小众但非常好用。

1️.FunctionTransformer

虽然Sklearn中有很多内置的预处理操作可以放进pipeline管道,但很多时候并不能满足我们的需求。

如果是比较简单并且通过一个函数可以实现需求的情况,我们可以将函数通过FunctionTransformer进行包装生成可与Sklearn兼容的转换器,然后装进pipeline。

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import FunctionTransformerdef reduce_memory(X: pd.DataFrame, y=None):"""将数值型列的类型转换为float32类型,以减少内存占用"""num_cols = X.select_dtypes(incluce=np.number).columnsfor col in num_cols:X[col] = X.astype("float32")return X, yReduceMemoryTransformer = FunctionTransformer(reduce_memory)# 装进一个pipeline
>>> make_pipeline(SimpleImputer(), ReduceMemoryTransformer)Pipeline(steps=[('simpleimputer', SimpleImputer()),('functiontransformer', ReduceMemoryTransformer()])

技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

本文由粉丝群小伙伴总结与分享,如果你也想学习交流,资料获取,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:dkl88194,备注:来自CSDN + 加群
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

2.自定义transformers

但有更复杂需求的时候,可能一个简单函数也是无法完成功能实现的,这时就需要自己实实在在地创建一个转换器了。

比如,数据清洗中比较常见的操作缩放特征变量并使其呈正态分布。通常我们会使用对数变换器如PowerTransformernp.log,但默认的方法会有一点问题,即如果某个特征包含零值,那么底层的对数函数无法处理会提出报错。

因此,一般的应对方法是将特征向量加上1,然后再执行转换,以避免报错。如果想要还原原始向量,直接调用指数函数然后再减去1,就可以了。非常的丝滑。

当然,这个操作并未内置于Sklearn中,并且也不是一个简单函数能搞定的。下面看看如何自定义一个转换器解决这个问题。

from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import PowerTransformerclass CustomLogTransformer(BaseEstimator, TransformerMixin):def __init__(self):self._estimator = PowerTransformer()  # 初始化一个转换器def fit(self, X, y=None):X_copy = np.copy(X) + 1  # 防止零值出现报错,进行加一操作self._estimator.fit(X_copy)return selfdef transform(self, X):X_copy = np.copy(X) + 1return self._estimator.transform(X_copy)  # 执行转换def inverse_transform(self, X):X_reversed = self._estimator.inverse_transform(np.copy(X))return X_reversed - 1  # 指数函数后减一

上面创建了一个类,继承了BaseEstimator并使其TransformerMixin能够插入pipeline管道的类。

3.TransformedTargetRegressor

有些时候,不仅仅是特征X需要处理,目标变量y也需要预处理操作。一个典型的场景就是我们上面提到的缩放数据使其呈现正态分布。通常我们会在pipeline以外做额外的处理,但 Sklearn 有一个方法可以同时在管道中处理。

TransformedTargetRegressor是一个专门针对regressor回归器进行转换的类,通过它可以同时将特征X和目标变量y在管道pipeline中做处理。比如下面的lgb回归的例子,它使用CustomLogTransformer对目标y进行对数缩放,然后拟合回归模型。

from sklearn.compose import TransformedTargetRegressorreg_lgbm = lgbm.LGBMRegressor()final_estimator = TransformedTargetRegressor(regressor=reg_lgbm, transformer=CustomLogTransformer()
)final_estimator.fit(X_train, y_train)
TransformedTargetRegressor(regressor=LGBMRegressor(),transformer=CustomLogTransformer())

如果转换器是一个函数如np.log,可以将其传递给func参数。

4.管道流程图

如果管道由多个步骤或子管道组成,代码上可能会比较混乱。Sklearn提供了估计器的HTML表示形式,让整理处理流程更直观清晰:

>>> giant_pipelinePipeline(steps=[('columntransformer',ColumnTransformer(transformers=[('cat_pipe',Pipeline(steps=[('impute',SimpleImputer(strategy='most_frequent')),('oh',OneHotEncoder())]),<sklearn.compose._column_transformer.make_column_selector object at 0x000001B6D8BD9310>),('num_pipe',Pipeline(steps=[('impute',SimpleImputer(strategy='median')),('transform',QuantileTransformer())]),<sklearn.compose._column_transformer.make_column_selector object at 0x000001B6D8BD9160>)])),('lgbmregressor',LGBMRegressor(device_type='gpu', learning_rate=0.01,n_estimators=10000))])
from sklearn import set_configset_config(display="diagram")>>> giant_pipeline

图片

dispaly参数设置为diagram,就可以获得管道的HTML的交互式形式。

5.QuadraticDiscriminantAnalysis

QDA为QuadraticDiscriminantAnalysis的简称,是二次判别分析的意思。在Kaggle竞赛中,即使没有超参数调整,二次判别分析分类器也可以获得AUC0.965这样高的分数,超过了大多数树模型,包括XGBoost和LightGBM。

那为什么之前很少听说过该算法呢?因为它的使用有严格的限制条件,它要求训练特征严格的正态分布,这样QDA就可以轻松计算并拟合分布周围的椭球形状了。

图片

QDA 的另一个优点是它的速度非常快,在百万行数据集上训练它只需要几秒钟。以下是QDA在Sklearn中的执行速度。

%%timefrom sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis# Generate 1M samples and 100 features
X, y = make_classification(n_samples=1000000, n_features=100)
qda = QuadraticDiscriminantAnalysis().fit(X, y)Wall time: 13.4 s

6.Voting Classifier/Regressor

在模型训练中,我们经常会遇到几个模型效果相似的情况,想要进一步提升效果,这时可以使用投票方法,是一种简单的模型集成方法。

投票方法效果提升原因在于概率论,简单来说就是少数服从多数。具体的就是,投票分类器会将多个分类器的多数票作为最终预测,而如果类别是概率或预测是连续的,则对预测进行平均。

Sklearn提供了两个方法VotingClassifierVotingRegressor,我们只需要传递一个分类器或回归器的列表,将它们组合起来就可以了。下面是VotingClassifier的示例。

from sklearn.ensemble import VotingClassifierX, y = make_classification(n_samples=1000)ensemble = VotingClassifier(estimators=[("xgb", xgb.XGBClassifier(eval_metric="auc")),("lgbm", lgbm.LGBMClassifier()),("cb", cb.CatBoostClassifier(verbose=False)),],voting="soft",# n_jobs=-1,
)_ = ensemble.fit(X, y)

以上设置voting参数为soft,代表预测是概率。此外,还可以为不同的模型分配weights权重系数进行更精准的预测。

7.Stacking Classifier/Regressor

另一种比投票更强大的集成方法是stacking

stacking背后的思想是,子模型应该尽可能多样化,因为不同的模型从不同的角度学习训练集的信息,可以覆盖整个信息空间。

换句话说,各种模型(如树、线性模型、表面拟合器、近邻模型、贝叶斯模型和高斯模型)最大化了训练潜力,它们的组合输出减少了偏差并防止了过拟合。

Kaggle竞赛中,stacking是一个提分的神器,很多获胜方案中都有提及。示例代码如下。

from sklearn.ensemble import StackingClassifier, StackingRegressor
from sklearn.linear_model import LogisticRegressionX, y = make_classification(n_samples=1000)ensemble = StackingClassifier(estimators=[("xgb", xgb.XGBClassifier(eval_metric="auc")),("lgbm", lgbm.LGBMClassifier()),("cb", cb.CatBoostClassifier(verbose=False)),],final_estimator=LogisticRegression(),cv=5,passthrough=False# n_jobs=-1,
)_ = ensemble.fit(X, y)

8.LocalOutlierFactor

异常值会使模型的目标函数产生偏差,可能导致过于乐观或过于悲观的结果。

对于小数据集来说,查找异常值不成问题。如果特征超过50-100个时,就需要一种快速准确的算法来检测高维异常值了。

对于具有数百个特征和数百万行的数据集,原始算法可能也需要运行几个小时。这时可以将降维算法与异常值检测方法结合起来,一个比较好的组合是UMAPLocalOutlierFactorLocalOutlierFactor是一种基于近邻的算法,旨在快速处理大型数据集。

%%timeimport umap  # pip install umap
from sklearn.neighbors import LocalOutlierFactorX, y = make_classification(n_samples=5000, n_classes=2, n_features=10)
X_reduced = umap.UMAP(n_components=2).fit_transform(X, y)lof = LocalOutlierFactor()
labels = lof.fit_predict(X_reduced, y)Wall time: 17.8 s>>> np.where(labels == -1)
(array([ 119,  155,  303,  331,  333,  407,  418,  549,  599,  664,  795,3092, 3262, 3271, 3280, 3289, 3311, 3477, 3899, 3929, 3975, 4301,4358, 4442, 4522, 4561, 4621, 4631, 4989], dtype=int64),)

9️.QuantileTransformer

某些时候得到的模型结果分布非常不规则,可能通过对数转换器或缩放器都无法强制转换为正态分布,比如双峰、三峰、或者n峰的分布。

这种情况下可以使用QuantileTransformer,它使用分位数的统计指标实现中心化和缩放分布。

import pandas as pd
from sklearn.preprocessing import QuantileTransformerqt = QuantileTransformer().fit(crazy_distributions)crazy_feature_names = ["f18", "f31", "f61"]
crazy_distributions = pd.DataFrame(qt.transform(crazy_distributions), columns=crazy_feature_names)fig, axes = plt.subplots(1, 3, figsize=(20, 6))for ax, f_name in zip(axes.flatten(), crazy_feature_names):sns.kdeplot(crazy_distributions[f_name], ax=ax, color="#E50914")

图片

PCA + tSNE/UMAP

这个一个降维的组合使用方法。因为PCA主成分分析对于高维度处理速度是比较快的,因此通常作为第一阶段的处理方法,比如使用PCA缩减到30-50的维度,然后再用其他算法如tSNEUMAP作为第二阶段的处理方法。

下面是 PCAtSNE 的组合:

from sklearn.decomposition import PCA
from sklearn.manifold import TSNEdf = dt.fread("data/large.csv").to_pandas()>>> df.shape
(1000000, 287)X, y = df.drop("target", axis=1), df[["target"]].values.flatten()%%time
manifold_pipe = make_pipeline(QuantileTransformer(), PCA(n_components=30), TSNE())reduced_X = manifold_pipe.fit_transform(X, y)------------------------------------------Wall time: 4h 27min 46s

以上在100万行和约300个特征的数据集上,先通过PCA投影到前30个维度,然后再投影到二维,整个过程需要4.5小时,并且结果也不是很好。

>>> plt.scatter(reduced_X[:, 0], reduced_X[:, 1], c=y, s=0.05);

图片

因此建议使用UMAP,它比tSNE快得多,并且可以更好地保留了数据的局部结构。

%%time
manifold_pipe = make_pipeline(QuantileTransformer(), PCA(n_components=30))X_pca = manifold_pipe.fit_transform(X, y)
embedding = umap.UMAP(n_components=2).fit(X_pca, y)Wall time: 14min 27s>>> plt.scatter(embedding.embedding_[:, 0], embedding.embedding_[:, 1], c=y, s=0.05);

图片

UMAP设法找到目标类别之间的明显区别,并且速度比tSNE快了20倍。

以上是全部内容,点个赞交个朋友。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/171126.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CCLink转Modbus TCP网关_CCLINK参数配置

CCLink转Modbus TCP网关&#xff08;XD-ETHCL20&#xff09;&#xff0c;具有CCLINK主从站功能。主要用途是将各种MODBUS-TCP设备接入到CCLINK总线中。它可以作为从站连接到CCLINK总线上&#xff0c;也可以作为主站或从站连接到MODBUS-MTP总线上。 1、 配置网关的CCLINK参数&am…

WebSphere Liberty 8.5.5.9 (一)

WebSphere Liberty 8.5.5.9 (一) 安装 1. 从官网下载 WebSphere Liberty 8.5.5.9 2. 解压 解压到 D:\wlp-webProfile7-java8-8.5.5.93. 启动 D:\wlp-webProfile7-java8-8.5.5.9\wlp\bin>server start 正在启动服务器 defaultServer。 服务器 defaultServer 已启动。4. …

【Linux】虚拟机连不上外网 (ping www.baidu.com不通)

进入linux系统&#xff0c;打开终端&#xff0c;ping www.baidu.com 发现ping不通 首先我连接的是nat模式 查看是否连接上自己本机的网 切换root用户 使用 ifconfig 命令查看是eth0 还是 ens33 vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTOstatic ONBOOTyes …

大厂设计师必备的8款Sketch插件

每个设计师都渴望有一个高效的插件来提高他们的设计能力。设计插件有助于自动化工作流程&#xff0c;快速组织设计文件或简化内容创建。Sketch可以说是设计师知名的设计工具&#xff0c;特别是其资源社区拥有丰富的Sketch插件&#xff0c;大大提高了设计师的工作效率。本文让设…

notes_质谱蛋白组学数据分析基础知识

目录 1. 蛋白组学方法学1.1 液相-质谱法1) 基本原理2) bottom-up策略的基本流程 1.2 PEA/Olink 2. 质谱数据分析2.1 原始数据格式2.2 分析过程1&#xff09;鉴定搜索引擎&#xff08;质谱组学&#xff09;重难点/潜在的研究方向 2&#xff09;定量3&#xff09;预处理 2.3 下游…

Apache RocketMQ - 概述

2022年&#xff0c;RocketMQ 5.0的正式版发布&#xff0c;相比于4.0版本而言&#xff0c;架构走向云原生化&#xff0c;并且覆盖了更多的业务场景。 如何从互联网时代演进到云时代&#xff1f; 1. 消息队列演进史 操作系统、数据库、中间件是基础软件的三驾马车&#xff0c;…

win环境Jenkins高级配置各种插件和启动jar包

今天分享Jenkins高级配置各种插件&#xff0c;在看此篇之前必须先了解上一篇博客内容&#xff0c;因为此篇是在上篇的基础上完善的&#xff1a; 一、git仓库的多分支选择 想要多分支选择部署&#xff0c;需要全局安装Git parameter 插件 1、点击入口 来到 2、点击进入 安装一…

5. HTML常用标签

5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>(重要) HTML提供了…

Git详解及常用命令

前言 Git 是一个分布式版本控制系统&#xff0c;用于跟踪和管理项目的代码变化。它由Linus Torvalds在2005年创建&#xff0c;现在是开源社区中最流行的版本控制工具之一。 国内码云地址&#xff1a;工作台 - Gitee.com 版本控制系统 (VCS)&#xff1a;Git 用于跟踪文件和目录…

【Git】第四篇:基本操作(理解工作区、暂存区、版本库)

Git 工作区、暂存区和版本库 工作区&#xff1a;就是我们创建的本地仓库所在的目录暂存区&#xff1a; stage或index&#xff0c;一般放在.git(可隐藏文件)目录下的index文件&#xff08;.git/index&#xff09;中&#xff0c;所以我们把暂存区有时候也叫做索引&#xff08;in…

DNS域名解析

目录 1.概述 1.1产生原因 1.2作用 1.3连接方式 1.4因特网的域名结构 1.4.1拓扑 1.4.2分类 1.4.3域名服务器类型划分 2. DNS域名解析过程 2.1分类 2.2解析图 2.2.2过程分析 3.搭建DNS域名解析服务器 3.1.概述 3.2安装软件 3.3bind服务中三个关键文件 3.4主配置…

用excel计算一个矩阵的转置矩阵

假设我们的原矩阵是一个3*3的矩阵&#xff1a; 125346789 现在求它的转置矩阵&#xff1a; 鼠标点到一个空白的地方&#xff0c;用来存放结果&#xff1a; 插入-》函数&#xff1a; 选择TRANSPOSE&#xff0c;这个就是求转置矩阵的函数&#xff1a; 点击“继续”&#xff1a…