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

news2024/11/18 15:48:24

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

1️.FunctionTransformer

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

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

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import FunctionTransformer

def reduce_memory(X: pd.DataFrame, y=None):
    """将数值型列的类型转换为float32类型,以减少内存占用
    """

    num_cols = X.select_dtypes(incluce=np.number).columns
    for col in num_cols:
        X[col] = X.astype("float32")

    return X, y

ReduceMemoryTransformer = 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 PowerTransformer

class 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 self

    def transform(self, X):
        X_copy = np.copy(X) + 1

        return 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 TransformedTargetRegressor

reg_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_pipeline

Pipeline(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_config

set_config(display="diagram")

>>> giant_pipeline

图片

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

5.QuadraticDiscriminantAnalysis

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

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

图片

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

%%time

from 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 VotingClassifier

X, 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 LogisticRegression

X, 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是一种基于近邻的算法,旨在快速处理大型数据集。

%%time

import umap  # pip install umap
from sklearn.neighbors import LocalOutlierFactor

X, 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 QuantileTransformer

qt = 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 TSNE

df = 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.coloradmin.cn/o/1204847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

考前须知-2024年上半年系统集成项目管理工程师

可以看看23年下半年软考集成考试的难度 一、考试时间安排&#xff1a; 集成考试一年会考2次&#xff0c;上半年一次、下半年一次。考试时间4h&#xff0c;分批进行 系统集成项目管理工程师教材共655页&#xff0c;分为23章。其中,前3章为信息化与系统集成基础知识的内容,第4章…

4.5 构建onnx结构模型-Reshape

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以pow 结点进行分析 方式 方法一&am…

C语言之初阶指针

一、指针&#xff1a; 其实按照我的理解&#xff0c;当我们写c语言程序的时候&#xff0c;创建的变量&#xff0c;数组等都要在内存上开辟空间。而每一个内存都有一个唯一的编号&#xff0c;这个编号也被称为地址编号&#xff0c;就相当于&#xff0c;编号地址指针。 二、指针…

STM32F4 GPIO端口二极管作用——二极管钳位作用

如上图所示&#xff0c;有两个保护二极管&#xff0c;用于保护内部电路&#xff0c;防止I\O引脚外部过高或者过低的电压输入时造成内部电路损坏。 具体来讲&#xff1a;当引脚输入电压高于VDD时&#xff0c;上面的二极管导通&#xff0c;输入点电压被钳位到约VDD0.7V&#xff…

python打包部署脚本

linux可使用expect来实现自动交互&#xff0c;windows想要写出同样的功能脚本&#xff0c;只能使用python或者安装ActiveTcl 1、安装python Microsoft Store搜索python直接安装&#xff0c;默认会直接添加到环境变量https://www.python.org/官网下载&#xff0c;点击安装时会提…

比尔·盖茨谈他对软件应用和人工智能代理未来的见解

比尔盖茨在他的 Gatesnotes 网站中发表了一篇文章&#xff0c;分享了他对软件应用和人工智能代理未来的见解。他认为人工智能代理将大行其道&#xff0c;在接下来的五年里&#xff0c;这将完全改变。你不需要为不同的任务使用不同的应用程序。你只需用日常语言告诉你的设备你想…

基于Python优化图片亮度与噪点

支持添加噪点类型包括&#xff1a;添加高斯噪点、添加椒盐噪点、添加波动噪点、添加泊松噪点、添加周期性噪点、添加斑点噪点、添加相位噪点&#xff0c;还提供清除噪点的功能。 我们先看一下实测效果&#xff1a;&#xff08;test.jpg为原图&#xff0c;new.jpg为添加后的图片…

基于JavaWeb+SSM+校园零售商城微信小程序系统的设计和实现

基于JavaWebSSM校园零售商城微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应…

HRNet关键点检测

HRNet是一种用于关键点检测的网络架构&#xff0c;它具有一些优点和缺点。 优点&#xff1a; 可以保持高分辨率&#xff1a;HRNet将高分辨率到低分辨率的子网并联连接&#xff0c;而不是像大多数现有解决方案那样串联连接。因此&#xff0c;HRNet能够保持高分辨率&#xff0c…

动态修改hosts

前言 因工作需要频繁变更hosts&#xff0c; 故须自己实现一个动态管理器&#xff0c; 市面上其实已经有了类似的软件&#xff0c;比如switchhosts!但因为不好集成其他功能&#xff08;如远程连接KVM&#xff09;&#xff0c;所以还是决定自己开发一套。 原理 使用之前强烈建…

tcpdump抓包的字节数量与ethtool统计数据不同的原因

情况介绍 在进行RDMA抓包流量分析时&#xff0c;我使用ethtool工具统计了RDMA网卡的流量发送数据数量&#xff0c;然后使用tcpdump进行抓包。 经过分析发现&#xff0c;tcpdump得到的数据数量总是大于ethtool得到的数据数量&#xff0c;而且每个数据包会多出4个字节。 分析 …

Juniper PPPOE双线路冗余RPM配置

------------------ 浮动静态路由 set routing-options static route 0.0.0.0/0 next-hop pp0.0 qualified-next-hop pp0.1 preference 10 ----------------- RPM测试的内容,包括从哪个接口发起测试,测试ping等等 #指定探针类型用ICMP请求 #探测的目标地址 #探测间隔 #探测阈…

Java第十八章Swing程序设计

一、Swing概述 Swing 是 Java 平台的用户界面&#xff08;UI&#xff09;工具包&#xff0c;它是一种现代化的、跨平台的 UI 工具包&#xff0c;可以使用各种操作系统上的 Java 虚拟机&#xff08;JVM&#xff09;来实现&#xff0c;包括 Windows、Linux 和 MacOS 等。Swing 提…

CopyOnWriteArrayList内存占用过多

目录 一、CopyOnWriteArrayList二、CopyOnWriteArrayList的适用场景三、CopyOnWriteArrayList内存占用过多的解决方法四、CopyOnWriteArrayList.add()源码分析 大家好&#xff0c;我是哪吒。 一、CopyOnWriteArrayList CopyOnWriteArrayList是Java中的一个线程安全的ArrayLis…

docker小技能

文章目录 I 预备知识Docker组成命名空间 (进程隔离)II 常用命令2.1 案例:流水线docker 部署2.2 删除没有使用的镜像2.3 shell 不打印错误输出2.4 阿里云流水线/jenkins忽略shell步骤中的报错https://www.runoob.com/docker/docker-architecture.html I 预备知识 Docker组成…

ElementUI表格el-table自适应高度(表头表尾固定不动)

ElementUI表格el-table自适应高度&#xff08;表头表尾固定不动&#xff09;&#xff0c;内容只在中间滚动&#xff0c;效果如图&#xff1a; 实现代码 <div class"mt-10" :style"{height:tableHeight}"><div class"operation-bar">…

15年之后再回低价的双十一,几分像从前?

文 | 螳螂观察 作者 | 易不二 今年双十一&#xff0c;全网铺天盖地的“低价”字眼&#xff0c;让人有种时空错乱的感觉。 犹记得&#xff0c;2009年双十一也是以一刀直砍到5折的低价&#xff0c;推开了一扇新世界的大门。在那个车马邮件还有网速都很慢的年月&#xff0c;人们…

深入理解强化学习——马尔可夫决策过程:随机过程和马尔可夫性质

分类目录&#xff1a;《深入理解强化学习》总目录 下图介绍了强化学习里面智能体与环境之间的交互&#xff0c;智能体得到环境的状态后&#xff0c;它会采取动作&#xff0c;并把这个采取的动作返还给环境。环境得到智能体的动作后&#xff0c;它会进入下一个状态&#xff0c;把…

【Transformer从零开始代码实现 pytoch版】(三)Decoder编码器组件:多头自注意力+多头注意力+全连接层+规范化层

解码器组件 解码器部分&#xff1a; 由N个解码器层堆叠而成每个解码器层由三个子层连接结构组成第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接第二个子层连接结构包括一个多头注意力子层和规范化层以及一个残差连接第三个子层连接结构包括一个前馈全…

牛客网上收藏题目总结及重写(C语言)(3)

每日一言 如果预计中的不幸没有发生的话&#xff0c;我们就会收获意外的喜悦。 --人生的智慧 题目BC84 错因&#xff1a;忘记要使用小数除法 代码 #include <stdio.h> int main() {int i 0;int n 0;scanf("%d",&n);double sum 0;for(i1;i<n;i){su…