sklearn Imputer() 返回的特征不适合拟合函数

Posted

技术标签:

【中文标题】sklearn Imputer() 返回的特征不适合拟合函数【英文标题】:sklearn Imputer() returned features does not fit in fit function 【发布时间】:2015-08-15 13:32:57 【问题描述】:

我有一个缺失值 NaN 的特征矩阵,所以我需要先初始化那些缺失值。但是,最后一行抱怨并抛出以下错误行: Expected sequence or array-like, got Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)。 我查了一下,似乎原因是 train_fea_imputed 不是 np.array 格式,而是 sklearn.preprocessing.imputation.Imputer 格式。我应该如何解决这个问题? 顺便说一句,如果我使用 train_fea_imputed = imp.fit_transform(train_fea),代码可以正常工作,但 train_fea_imputed 返回一个比 train_fea 小一维的数组

    import pandas as pd
    import numpy as np
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.preprocessing import Imputer

    imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
    train_fea_imputed = imp.fit(train_fea)

    # train_fea_imputed = imp.fit_transform(train_fea)
    rf = RandomForestClassifier(n_estimators=5000,n_jobs=1, min_samples_leaf = 3)
    rf.fit(train_fea_imputed, train_label)

更新:我改成

imp = Imputer(missing_values='NaN', strategy='mean', axis=1)

现在尺寸问题没有发生。我认为插补函数存在一些固有问题。我完成项目后会回来。

【问题讨论】:

你能用虚拟值制作train_featrain_label 的样本,以便我可以在我的计算机上运行它吗?例如像这样***.com/a/30319249/238639 @bakkal 我认为您可以使用 numpy 生成随机矩阵并用 NaN 对其进行掩码尝试。 【参考方案1】:

使用scikit-learn,初始化模型、训练模型和获取预测是独立的步骤。在您的情况下,您有:

train_fea = np.array([[1,1,0],[0,0,1],[1,np.nan,0]])
train_fea
array([[  1.,   1.,   0.],
       [  0.,   0.,   1.],
       [  1.,  nan,   0.]])

#initialise the model
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)

#train the model
imp.fit(train_fea)

#get the predictions
train_fea_imputed = imp.transform(train_fea)
train_fea_imputed
array([[ 1. ,  1. ,  0. ],
       [ 0. ,  0. ,  1. ],
       [ 1. ,  0.5,  0. ]])

【讨论】:

您的解决方案确实返回了 train_fea_imputed,其维度低于我原来的 train_fea。我认为直接应用 fit_transform 是等价的。我的问题是我需要稍后在随机森林中应用 feature_score。如果我的维度较少,我无法将分数与特征名称相关联。 我在答案中添加了一个示例矩阵,我似乎没有维度问题? 我更改了 Imputer 参数 axis = 1 现在问题已解决。我认为我的 train_fea 有一些实用的列【参考方案2】:

我认为在这种情况下,axis = 1 是不正确的,因为您想对特征向量/列(axis = 0)而不是行(axis = 1)的值取平均值。

【讨论】:

以上是关于sklearn Imputer() 返回的特征不适合拟合函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 sklearn Imputer 需要适配?

Python - SkLearn Imputer 用法

为分类变量 sklearn 创建我的自定义 Imputer

使用sklearn中preprocessing.Imputer实现对缺失值的处理

为分类变量sklearn创建我的自定义Imputer

不能从pandas_ml的'sklearn.preprocessing'中导入名称'Imputer'。