问题描述
我有一个关于警察杀人的数据集,你可以在 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 的副本来对其进行编码,然后估算缺失值。我的计划是:
- 标签编码所有分类列:
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)
现在我的数据框已经编码了所有类别。
- 然后,我在原始数据帧 (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)
- 创建迭代器的实例,然后拟合和变换 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 (将#修改为@)