标签编码然后插补缺失然后逆编码

问题描述

我有一个关于警察杀人的数据集,你可以在 Kaggle 上找到。几列中缺少一些数据:

UID                0.000000
Name               0.000000
Age                0.018653
Gender             0.000640
Race               0.317429
Date               0.000000
City               0.000320
State              0.000000
Manner_of_death    0.000000
Armed              0.454487
Mental_illness     0.000000
Flee               0.000000
dtype: float64

我创建了原始 df 的副本来对其进行编码,然后估算缺失值。我的计划是:

  1. 标签编码所有分类列:
Index(['Gender','Race','City','State','Manner_of_death','Armed','Mental_illness','Flee'],dtype='object')
le = LabelEncoder()
lpf = {}
for col in lepf.columns:    
    lpf[col] = le.fit_transform(lepf[col])
lpfdf = pd.DataFrame(lpf)

现在我的数据框已经编码了所有类别。

  1. 然后,我在原始数据帧 (pf) 中找到那些 nan 值,以替换 lpfdf 中那些编码的 nan:
for col in lpfdf:
    print(col,"\n",len(np.where(pf[col].to_frame().isna())[0]))

性别 8
比赛 3965
城市 4 状态 0 死亡方式 0 武装5677 精神疾病 0
逃跑 0

例如,Gender 得到三个编码标签:0 代表男性,1 代表女性,2 代表 nan。但是,特征 City 有 >3000 个值,并且无法使用 value_counts() 定位它。出于这个原因,我使用了:

np.where(pf["City"].to_frame().isna())

结果:

(array([ 4110,9093,10355,10549],dtype=int64),array([0,0],dtype=int64))

查看与索引对应的这些行中的任何一行,我看到 City 的 nan 标签是 3327:

lpfdf.iloc[10549]

Gender                1
Race                  6
City               3327
State                10
Manner_of_death       1
Armed                20
Mental_illness        0
Flee                  0
Name: 10549,dtype: int64

然后我继续用这些标签替换 np.nan:

"""
Gender: 2,Race: 6,City: 3327,Armed: 59

"""
lpfdf["Gender"] = lpfdf["Gender"].replace(2,np.nan)
lpfdf["Race"] = lpfdf["Race"].replace(6,np.nan)
lpfdf["City"] = lpfdf["City"].replace(3327,np.nan)
lpfdf["Armed"] = lpfdf["Armed"].replace(59,np.nan)
  1. 创建迭代器的实例,然后拟合和变换 lpfdf:
itimp = IterativeImputer()
iilpf = itimp.fit_transform(lpfdf)

然后为这些新的估算值制作一个数据框:

itimplpf = pd.DataFrame(np.round(iilpf),columns = lepf.columns)

最后,当我去逆变换查看它推算的相应标签时,我收到以下错误:

for col in lpfdf:    
    le.inverse_transform(itimplpf[col].astype(int))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-191-fbdde4bb4781> in <module>
      1 for col in lpfdf:
----> 2     le.inverse_transform(itimplpf[col].astype(int))

~\anaconda3\lib\site-packages\sklearn\preprocessing\_label.py in inverse_transform(self,y)
    158         diff = np.setdiff1d(y,np.arange(len(self.classes_)))
    159         if len(diff):
--> 160             raise ValueError(
    161                     "y contains previously unseen labels: %s" % str(diff))
    162         y = np.asarray(y)

ValueError: y contains previously unseen labels: [2 3 4 5]

我的步骤有什么问题? 抱歉我冗长的解释,但我觉得我需要解释所有步骤,以便您能够正确理解问题。谢谢大家。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)