get_dummies (Pandas) 和 OneHotEncoder (Scikit-learn) 之间的优缺点是什么?

2024-02-08

我正在学习不同的方法将分类变量转换为机器学习分类器的数字。我遇到了pd.get_dummies方法和sklearn.preprocessing.OneHotEncoder()我想看看它们在性能和使用方面有何不同。

我找到了一个关于如何使用的教程OneHotEncoder() on https://xgdgsc.wordpress.com/2015/03/20/note-on-using-onehotencoder-in-scikit-learn-to-work-on-categorical-features/ https://xgdgsc.wordpress.com/2015/03/20/note-on-using-onehotencoder-in-scikit-learn-to-work-on-categorical-features/自从sklearn文档对此功能没有太大帮助。我有一种感觉,我做得不对......但是

可以解释一下使用的优点和缺点吗pd.dummies over sklearn.preprocessing.OneHotEncoder()反之亦然?我知道OneHotEncoder()给你一个稀疏矩阵,但除此之外我不确定它是如何使用的以及它比pandas方法。我使用它的效率低下吗?

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
sns.set()

%matplotlib inline

#Iris Plot
iris = load_iris()
n_samples, m_features = iris.data.shape

#Load Data
X, y = iris.data, iris.target
D_target_dummy = dict(zip(np.arange(iris.target_names.shape[0]), iris.target_names))

DF_data = pd.DataFrame(X,columns=iris.feature_names)
DF_data["target"] = pd.Series(y).map(D_target_dummy)
#sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \
#0                  5.1               3.5                1.4               0.2   
#1                  4.9               3.0                1.4               0.2   
#2                  4.7               3.2                1.3               0.2   
#3                  4.6               3.1                1.5               0.2   
#4                  5.0               3.6                1.4               0.2   
#5                  5.4               3.9                1.7               0.4   

DF_dummies = pd.get_dummies(DF_data["target"])
#setosa  versicolor  virginica
#0         1           0          0
#1         1           0          0
#2         1           0          0
#3         1           0          0
#4         1           0          0
#5         1           0          0

from sklearn.preprocessing import OneHotEncoder, LabelEncoder
def f1(DF_data):
    Enc_ohe, Enc_label = OneHotEncoder(), LabelEncoder()
    DF_data["Dummies"] = Enc_label.fit_transform(DF_data["target"])
    DF_dummies2 = pd.DataFrame(Enc_ohe.fit_transform(DF_data[["Dummies"]]).todense(), columns = Enc_label.classes_)
    return(DF_dummies2)

%timeit pd.get_dummies(DF_data["target"])
#1000 loops, best of 3: 777 µs per loop

%timeit f1(DF_data)
#100 loops, best of 3: 2.91 ms per loop

对于机器学习,你几乎肯定想使用sklearn.OneHotEncoder.对于简单分析等其他任务,您也许可以使用pd.get_dummies,这样比较方便一点。

注意sklearn.OneHotEncoder已更新到最新版本,以便接受字符串对于分类变量以及整数。

其关键在于sklearn编码器创建一个函数persists并且可以然后应用于使用相同分类变量的新数据集,并获得一致的结果.

from sklearn.preprocessing import OneHotEncoder

# Create the encoder.
encoder = OneHotEncoder(handle_unknown="ignore")
encoder.fit(X_train)    # Assume for simplicity all features are categorical.

# Apply the encoder.
X_train = encoder.transform(X_train)
X_test = encoder.transform(X_test)

请注意我们如何应用通过以下方式创建的相同编码器X_train到新的数据集X_test.

考虑如果发生什么情况X_test包含不同的级别X_train为其变量之一。例如,假设X_train["color"]仅包含"red" and "green",但除了这些之外,X_test["color"]有时包含"blue".

如果我们使用pd.get_dummies, X_test最终会得到一个额外的"color_blue"列哪个X_train没有,并且不一致可能会在以后破坏我们的代码,特别是当我们正在喂食时X_test to an sklearn我们训练的模型X_train.

如果我们想在生产中处理这样的数据,我们一次接收一个示例,pd.get_dummies不会有什么用。

With sklearn.OneHotEncoder另一方面,一旦我们创建了编码器,我们就可以重用它以每次产生相同的输出,其中列仅用于"red" and "green"。我们可以明确地控制它遇到新关卡时会发生什么"blue":如果我们认为这是不可能的,那么我们可以告诉它抛出一个错误handle_unknown="error";否则我们可以告诉它继续并简单地将红色和绿色列设置为 0,handle_unknown="ignore".

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

get_dummies (Pandas) 和 OneHotEncoder (Scikit-learn) 之间的优缺点是什么? 的相关文章

随机推荐

  • 在 CakePHP 中使用 Containable 行为后获取原始关联

    背景 CakePHP 2 6 3 一个相当稳定的应用程序 新行为 MyCustomBehavior 创建用于输出一些额外信息 我有一个模特MyModel作为Containable 定义于AppModel 进而MyCustom 定义于MyMo
  • 如何使用 pydantic 模式从 sqlalchemy 关系中获取单独的列

    我有4张桌子 Hardware SoftwareName SoftwareVersion and Software The Software表有一个one to many有关系SoftwareName表和SoftwareVersion桌子
  • 如何将配置变量添加到我的 CMake 脚本中?

    我想添加一个用户在 cmake gui 中单击 配置 后必须设置的变量 有没有办法做到这一点 使用 set 命令指定 CACHE 参数 例如 set NAME INCLUDE default value CACHE FILEPATH des
  • ColdFusion 非作用域与变量作用域:性能与可读性?

    在我的 ColdFusion 代码中 我养成了始终将变量作用域视为默认作用域的习惯 即 当另一个作用域不适合时 我的理解是 这提高了效率 因为 ColdFusion 处理器不必花费周期来确定变量所包含的范围 然而 我一直对这让我的代码如此冗
  • 随机生成数字、字母、符号密码

    我想生成一个随机密码 它应该由符号 字母和数字组成 例如 tqpV4aJ 我 WZuYvBv7 S OPToyu0u a 包含6 10个字符 b 恰好包含集合 中的 1 个符号 c 恰好包含 1 位数字 即 0 9 中的任何数字 但不包括数
  • 如何判断 Socket 何时已断开连接

    在客户端 我需要知道我的套接字连接何时 是否已断开 但是 Socket Connected 属性始终返回 true 即使在服务器端已断开连接并且我尝试通过它发送数据之后也是如此 谁能帮我弄清楚这里发生了什么事 我需要知道套接字何时被断开 S
  • webpackHtmlPlugin:控制注入文件的顺序

    I use HtmlWebpackPlugin用于自动生成index thml与 webpack 编译的输出 出于性能原因 我将条目分成vendors and project 像那样 entry vendors vendors js Tim
  • 跟踪目录中的所有文件以 git LFS 但忽略该目录中存在的单个文件夹

    假设我有一个目录 my dir 和其中的一些文件 我其中有一个子目录 my dir subdir 文件结构 我的目 录 我的目录子目录 如何通过 git LFS 跟踪 my dir 但不通过 git LFS 跟踪 my dir my dir
  • 将深度复制构造函数添加到 std::unique_ptr

    我想储存一些std unique ptr
  • 在 OpenCV 上获取屏幕尺寸

    如何获取 OpenCV 上的计算机屏幕分辨率 我需要使用整个屏幕宽度并排显示两个图像 OpenCV 需要我想要创建的确切窗口大小 您可以在有或没有 opencv 的情况下使用此解决方案跨平台解决方案 if WIN32 include
  • 为什么 Vue.js 允许推送到 prop 数组?

    当我们尝试直接更改 prop 值时 Vue js 会显示警告 如下所示 Vue component Games template div ol li game li ol div
  • 在C#中,有没有办法始终能够获取当前焦点窗口的选定文本内容?

    在我的 c Net 应用程序中 我一直在尝试能够检索当前聚焦窗口中当前选定的文本 注意可以是windows中打开的任何窗口 比如word 或者safari 我能够检索当前聚焦控件的句柄 使用对 user32 dll 和 kernel32 d
  • C++ 中阿拉伯字符串的反转

    如何使用 C 反转阿拉伯字符串 例如 的反义词是 阿拉伯字母的形状根据单词中的位置而不同 词首 词中或词尾 连接阿拉伯字母还有其他规则吗 正如 Petesh 所说 根据我能找到的参考资料 例如维基百科 http en wikipedia o
  • d3 色阶 - 与多种颜色呈线性?

    我正在尝试创建一些类似于量化标度的东西 但其行为类似于线性色标 当我尝试将多种颜色放入线性比例时 它似乎只在前两种颜色之间进行缩放 我想要多种颜色 例如量化比例 但在这些颜色之间淡入淡出 我不确定这是否可能 red and green wo
  • NoSuchMethodError:Jersey 客户端中的 MultivaluedMap.addAll

    我正在尝试使用 Jersey Client 模拟对我的 Web 服务的 HTTP 请求 我尝试实施简单的例子 http jersey java net documentation latest user guide html d0e2365
  • 如何在 Swift 中将键分配给 SKActions

    我希望有人能够帮助我解决这个问题 我似乎找不到一种方法来为removeActionWithKey 方法的Sprite Kit 的SKAction 分配键 我还尝试将操作分配给字典中的键 但程序无法识别键分配 因此返回零值 这是我尝试做的 v
  • C++中的动态对象[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我从c 转到c 我不明白什么是动态对象 所以想象一下你有 A 类并创建像 A a new A 这样的对象是正常的 但是对象 a 是什么 它和
  • 客户端服务器程序的多线程

    我正在尝试使用我一直在开发的客户端 服务器程序来实现多线程 我需要允许多个客户端同时连接到服务器 我目前有 4 个类 一个客户端 一个服务器 一个协议和一个处理线程的工作人员 以下代码是我为这些类编写的代码 套接字服务器类 public c
  • Jmeter 而控制器似乎没有将变量评估为数字

    我正在编写一个 jmeter 脚本 该脚本会不断加载数据 直到表达到指定的大小 我有一个 while 循环 其中有一个 HTTP 采样器来加载数据 然后是另一个带有 XPath 后处理器的 HTTP 采样器来检查表大小 它们调用两个不同的
  • get_dummies (Pandas) 和 OneHotEncoder (Scikit-learn) 之间的优缺点是什么?

    我正在学习不同的方法将分类变量转换为机器学习分类器的数字 我遇到了pd get dummies方法和sklearn preprocessing OneHotEncoder 我想看看它们在性能和使用方面有何不同 我找到了一个关于如何使用的教程