如何处理分类输入转换器中的数值变量?

How to handle numerical variables in categorical imputer transformer?

我有一个包含分类值的列 grade 的数据框。我的问题导致值的类型是 float 而不是 object.

import pandas as pd
import numpy as np

df = pd.DataFrame(
 {
 "key": ["K0", "K1", "K2", "K3", "K4"],
 "grade": [1.0, 2.0, 2.0, np.nan, 3.0],
 }
)

df = 
   key  grade
0   K0  1.0
1   K1  2.0
2   K2  2.0
3   K3  NaN
4   K4  3.0

我在 grade 列中缺少值。我想通过使用基于 sklearn 的 feature-engine 来用最频繁的值来估算缺失值。 Feature-engine包括广泛使用的缺失数据插补方法,例如均值和中位数插补、频繁类别插补、随机样本插补。

安装并加载库:

! pip install feature-engine

from feature_engine.imputation import CategoricalImputer

应用输入法:

# set up the imputer
imputer = CategoricalImputer(variables=['grade'], imputation_method='frequent')

# fit the imputer
imputer.fit(df)

# transform the data
df = imputer.transform(df)

df.head()

我得到以下 TypeError:

TypeError: Some of the variables are not categorical. Please cast them as object before calling this transformer

我明白这个错误,但我不明白它为什么会出现。根据 docsfeature-engine 可以用这个转换器处理数值变量。

我的问题是:

  1. 如何使用同一个变压器解决这个问题?我误解了文档吗?
  2. 如果这个变压器不工作,您还有什么建议的解决方案?

在使用imputer之前,将成绩栏的dtype改为object

df = pd.DataFrame(
 {
 "key": ["K0", "K1", "K2", "K3", "K4"],
 "grade": [1.0, 2.0, 2.0, np.nan, 3.0],
 }
)

df["grade"] = df.grade.astype("object")

imputer = CategoricalImputer(variables=['grade'], imputation_method='frequent')
imputer.fit(df)
df = imputer.transform(df)

df.head()

    key  grade
0   K0   1.0
1   K1   2.0
2   K2   2.0
3   K3   2.0
4   K4   3.0

如果在估算使用后您希望等级的 dtype 为 string/object,

imputer = CategoricalImputer(variables=['grade'],
                             imputation_method='frequent',
                             return_object=True)

# this returns

    key  grade
0   K0   1
1   K1   2
2   K2   2
3   K3   2
4   K4   3 

CategoricalImputer 仅用于估算分类变量。这就是为什么默认情况下它仅适用于对象或分类类型的变量。

但是,在某些情况下,数值变量希望被视为分类变量。在旧版本的包中,为了这样做,我们需要将变量的格式更改为对象,如 Abhi 所述。

从 1.1 版开始,您可以通过在转换器中设置参数 ignore_format=True 直接使用 CategoricalImputer 估算数值变量。