编码数据以进行插补,然后解码
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
(使用模型根据特征子集预测缺失数据的计算机)
你能给我更多的解释如何实现它以上是关于编码数据以进行插补,然后解码的主要内容,如果未能解决你的问题,请参考以下文章