如何在scikit-learn中填补分类数据类型的列

我有一个数据集,其中特征既包含数值类型又包含对象类型。此外,一些对象类型的特征存在缺失值。我按照另一篇文章的指示创建了一个修改版的Imputer,用于处理数值和分类数据类型的缺失值,但当我将其应用到我的数据集时,返回了AttributeError。我认为我在定义用于填补的fit方法时犯了一个愚蠢的错误,非常感谢您的见解。以下是我的代码和错误信息:

import osimport pandas as pdimport numpy as npfrom sklearn.preprocessing import Imputer#加载数据path='~/Desktop/ML/Hands_on/housing_train.csv'path=os.path.expanduser(path)data=pd.read_csv(path)#选择包含dtype=object且有缺失数据的列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'

回答:

对于大小为1的对象,squeeze()方法将返回一个标量对象,如文档中所述

这意味着,大多数情况下(这里适用于所有列),列的众数将是一个单一的对象,然后squeeze()将只返回该字符串。

因此,无需在其后获取.values。请更改您的fit()方法,去掉那部分:

def fit(self, X, y=None):    if self.strategy == 'most_frequent':        self.fills = pd.DataFrame(X).mode(axis=0).squeeze()        # 移除了下面的.values        self.statistics_ = self.fills        return self

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注