我有一个关于警察杀人的数据集,你可以在 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 Manner_of_death 0 武装 5677 Mental_illness 0
逃离 0
例如,Gender 有三个编码标签:0 代表男性,1 代表女性,2 代表 nan。但是,要素 City 具有 >3000 个值,并且无法使用 value_counts() 找到它。出于这个原因,我使用了:
np.where(pf["City"].to_frame().isna())
这产生了:
(数组([ 4110, 9093, 10355, 10549], dtype=int64), 数组([0, 0, 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)
- 创建迭代 imputer 的实例,然后拟合和转换 lpfdf:
itimp = IterativeImputer() iilpf = itimp.fit_transform(lpfdf)
然后为这些新的估算值创建一个数据框:
itimplpf = pd.DataFrame(np.round(iilpf), columns = lepf.columns)
最后,当我去 inveres 变换查看它估算的相应标签时,我收到以下错误:
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]
我的步骤有什么问题?很抱歉我的冗长解释,但我觉得我需要解释所有步骤,以便您能够正确理解问题。谢谢你们。