编码数据以进行插补,然后解码

Posted

技术标签:

【中文标题】编码数据以进行插补,然后解码【英文标题】:Encoding data for imputation and then decoding 【发布时间】:2020-04-09 17:56:18 【问题描述】:

我在 python 中,我有类似以下结构的数据,混合了分类和数字

subject_id hour_measure         urinecolor   blood pressure                  
3          1.00                 red         
           1.15                             high
4          2.00              yellow          low

我想使用热卡插补进行插补,但我发现我应该将其编码为数字然后进行插补

  from sklearn.preprocessing import OneHotEncoder
    enc = OneHotEncoder(handle_unknown='ignore')
   df= pd.read_csv('path')
    enc.fit(df)
    enc.transform(df)

当我尝试进行编码时,它要求我先填写缺失值,那么我在进行编码时如何处理缺失值?当我对分类数据进行编码时,插补将生成缺失值的值,我如何在插补后将其反转为原始数据? 有人请帮我解决这个问题吗?

【问题讨论】:

df是什么类型;是dict 吗?如果我理解您的问题,OneHotEncoder 类不需要数据源中的“缺失”元素,我认为这是空值。 df 是来自 csv 文件的数据框 更新它,好吧,正如你所说,我应该将 null 放到每个空单元格中? 【参考方案1】:

基本上你需要使用 scikit-learn 管道:

import numpy as np

from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder

X = np.array(
    [['cat1', 'cat1'],
     ['cat2', np.nan],
     [np.nan, 'cat2']],
    dtype=object
)

encoder = make_pipeline(
    SimpleImputer(strategy="constant", fill_value="missing"),
    OneHotEncoder(sparse=False)
)
print(encoder.fit_transform(X))
print(encoder[-1].categories_)
[[1. 0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 0. 1.]
 [0. 0. 1. 0. 1. 0.]]
[array(['cat1', 'cat2', 'missing'], dtype=object), array(['cat1', 'cat2', 'missing'], dtype=object)]

这里的缺失值由一些np.nan 值表示。它们首先被字符串'missing' 替换。然后,每个类别将成为一列。因此,“缺失”的信息将在编码后用一列表示。

您可能不想从您的数据中删除此信息。如果你愿意,你可以删除相应的列。

【讨论】:

感谢您的回复。在我的情况下,我处理 CSV 文件,我只想对分类数据进行编码,以便能够对所有数据库进行插补。您的解决方案有效,但它将所有数据转换为 0 和 1,这将难以估算。此外,我想知道在输入后解码这些分类列 要处理 CSV,您将使用pandas.read_csv。您可以使用 scikit-learn 中的 ColumnTransformer 选择特定列(请参阅此示例:scikit-learn.org/stable/auto_examples/compose/…)并在这些特定列上使用编码器管道。 encoder.inverse_transform(X_encoded) 会将原始空间中的数据转回 我进行编码以进行进一步估算的想法?我希望我能找到使用 KNN 或热卡插补进行插补而不对其进行编码的方法... 在 scikit-learn 0.22 中,您有一个 KNNImputer 和一个 IterativeImputer(使用模型根据特征子集预测缺失数据的计算机) 你能给我更多的解释如何实现它

以上是关于编码数据以进行插补,然后解码的主要内容,如果未能解决你的问题,请参考以下文章

用于解码/编码修改后的 base64 URL 的代码

编码解码工具 之 Base16编码/解码

十一.Netty入门到超神系列-Netty使用Protobuf编码解码

如何解码经过编码的 torrent 数据

后端返回URL含有中文进行编码、解码处理

使用FFmpeg对视频进行编解码的一般流程