【问题标题】:Scikit learn how to change a categorical value with missing data to a numerical oneScikit 学习如何将缺少数据的分类值更改为数字值
【发布时间】:2020-07-16 18:33:45
【问题描述】:

我正在将 sklearn 用于机器学习项目,其中一列采用分类形式。我想用序数编码器将其转换为数字形式,然后估算丢失的数据。 Sklearn的OrdinalEncoder报错:

ValueError: Input contains NaN

但我真的不想先使用分类输入器,然后将值转换为数字,因为它不太适合数据的性质。有没有办法解决这个问题?

代码如下:

from sklearn.preprocessing import OrdinalEncoder
ordinalenc = OrdinalEncoder()
imd = ordinalenc.fit_transform(info[["imd_band"]])
print(ordinalenc.categories_)

【问题讨论】:

    标签: python scikit-learn imputation


    【解决方案1】:

    内嵌文档

    from sklearn.preprocessing import OrdinalEncoder
    import pandas as pd
    from sklearn.impute import SimpleImputer
    
    df = pd.DataFrame({'x': ['a','b','b',np.NaN]*3})
    ordinalenc = OrdinalEncoder()
    # Catagorial to Ordinal of only not NAN values
    df.loc[df['x'].notnull(), 'new_x']  = ordinalenc.fit_transform(df[df['x'].notnull()])
    # Now impute 
    im = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
    df['new_x'] = im.fit_transform(df['new_x'].values.reshape(-1, 1))
    print (df)
    

    输出

        x   new_x
    0   a   0.0
    1   b   1.0
    2   b   1.0
    3   NaN 1.0
    4   a   0.0
    5   b   1.0
    6   b   1.0
    7   NaN 1.0
    8   a   0.0
    9   b   1.0
    10  b   1.0
    11  NaN 1.0
    

    【讨论】:

    • 不幸的是,我是新手,我不确定我是否理解我的数据框中的 x 等价物是什么。我使用开放大学数据集analyse.kmi.open.ac.uk/open_dataset,所以我还没有创建自己的数据框。我从文档中了解到 .loc 按标签访问一组列。我的印象是标签与列名不同,当我将它们代替 x 时,当然没有一个列名起作用。有没有办法按列而不是标签来选择这些数据?
    • 即这一行:info.loc[info['imd_band'].notnull(), 'new_x'] = ordinalenc.fit_transform(info[info['imd_band'].notnull()]) 产生一个ValueError: Must have equal len keys and value when setting with an ndarray
    猜你喜欢
    • 2016-11-27
    • 2014-04-20
    • 2018-05-28
    • 2017-01-05
    • 2016-04-29
    • 2017-07-21
    • 2016-02-10
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多