【问题标题】:How to impute columns with categorial datatype in scikit-learn如何在 scikit-learn 中使用分类数据类型估算列
【发布时间】:2018-02-15 08:35:09
【问题描述】:

我有一个数据集,其中包括特征中的数字和对象。此外,某些具有对象数据类型的功能缺少值。我创建了 Imputer 的修改版本(按照另一篇文章的说明)来处理数字和分类数据类型的缺失值,但是当我应用到我的数据集时,它返回 AttributeError。我相信我在为估算的拟合方法的定义中犯了一个愚蠢的错误,我感谢您的洞察力。这是我的代码和错误:

import os
import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer

#load the data
path='~/Desktop/ML/Hands_on/housing_train.csv'
path=os.path.expanduser(path)
data=pd.read_csv(path)

#select the columns_names including dtype=object && missing data
object_data=data.select_dtypes(include=['object'])
object_data_null=[]
for col in object_data.columns:
    if object_data[col].isnull().any():
        object_data_null.append(col)

class GeneralImputer(Imputer):
    def __init__(self, **kwargs):
        Imputer.__init__(self, **kwargs)

    def fit(self, X, y=None):
        if self.strategy == 'most_frequent':
            self.fills = pd.DataFrame(X).mode(axis=0).squeeze()
            self.statistics_ = self.fills.values
            return self
        else:
            return Imputer.fit(self, X, y=y)

    def transform(self, X):
        if hasattr(self, 'fills'):
            return pd.DataFrame(X).fillna(self.fills).values.astype(str)
        else:
            return Imputer.transform(self, X)

imputer=GeneralImputer(strategy='most_frequent', axis=1)

for i in object_data_null:
    imputer.fit(data[i])
    data[i]=imputer.transform(data[i])


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-29-989e78355872> in <module>()
     38 object_data_null
     39 for i in object_data_null:
---> 40     imputer.fit(data[i])
     41     data[i]=imputer.transform(data[i])
     42 

<ipython-input-29-989e78355872> in fit(self, X, y)
     23         if self.strategy == 'most_frequent':
     24             self.fills = pd.DataFrame(X).mode(axis=0).squeeze()
---> 25             self.statistics_ = self.fills.values
     26             return self
     27         else:

AttributeError: 'str' object has no attribute 'values'

【问题讨论】:

    标签: python machine-learning scikit-learn preprocessor imputation


    【解决方案1】:

    对于大小为 1 的对象,squeeze() 方法将返回一个缩放器对象为mentioned in the documentation

    这意味着,在大多数情况下(这里的所有列都会发生这种情况),列的模式将是单个对象,然后挤压() 将只返回字符串。

    因此无需在其后获取.values。更改您的 fit() 方法以删除它:

    def fit(self, X, y=None):
        if self.strategy == 'most_frequent':
            self.fills = pd.DataFrame(X).mode(axis=0).squeeze()
    
            # Removed .values from the below line
            self.statistics_ = self.fills
            return self
    

    【讨论】:

    • 非常感谢@Vivek Kumar
    猜你喜欢
    • 2014-10-04
    • 2020-03-27
    • 2018-09-23
    • 2020-01-29
    • 2014-10-03
    • 2015-03-07
    • 2017-03-09
    • 2015-08-23
    • 2018-01-27
    相关资源
    最近更新 更多