Sklearn:分类Imputer?

时间:2017-03-16 23:03:38

标签: machine-learning tensorflow scikit-learn sklearn-pandas imputation

有没有办法使用sklearn.preprocessing对象来估算分类值?我想最终创建一个预处理对象,我可以将其应用于新数据,并使其转换方式与旧数据相同。

我正在寻找一种方法,以便我可以this方式使用它。

4 个答案:

答案 0 :(得分:1)

是的,有可能。例如,您可以将sklearn.preprocessing.Imputer与参数strategy = 'most_frequent'一起使用。

使用fit_transform方法将其应用于旧数据(训练集),然后transform应用于新数据(测试集)。

答案 1 :(得分:1)

来自sklearn.preprocessing的计算机对数字变量效果很好。 但是对于分类变量,大多数分类是字符串,而不是数字。为了能够使用sklearn的模仿者,您需要将字符串转换为数字,然后进行插值并最终转换回字符串。

一个更好的选择是使用sklearn_pandas package 中的 CategoricalImputer()。

它以模式替换空值,并且使用字符串列。 sklearn-pandas软件包可以与pip install sklearn-pandas一起安装,也可以作为导入sklearn_pandas导入

答案 2 :(得分:0)

复制和修改this回答,我为pandas.Series对象做了一个文字

import numpy
import pandas 

from sklearn.base import TransformerMixin


class SeriesImputer(TransformerMixin):

    def __init__(self):
        """Impute missing values.

        If the Series is of dtype Object, then impute with the most frequent object.
        If the Series is not of dtype Object, then impute with the mean.  

        """
    def fit(self, X, y=None):
        if   X.dtype == numpy.dtype('O'): self.fill = X.value_counts().index[0]
        else                            : self.fill = X.mean()
        return self

    def transform(self, X, y=None):
        return X.fillna(self.fill)

要使用它,你会这样做:

# Make a series
s1 = pandas.Series(['k', 'i', 't', 't', 'e', numpy.NaN])


a  = SeriesImputer()   # Initialize the imputer
a.fit(s1)              # Fit the imputer
s2 = a.transform(s1)   # Get a new series 

答案 3 :(得分:0)

您也可以使用OrdinalEncoder

您可以使用函数fit()在训练集中进行训练,以获得模型,然后使用transform()将模型应用于训练和测试集:

oe = OrdinalEncoder()
# train the model on a training set of type pandas.DataFrame, for example
oe.fit(df_train)
# transform the training set using the model:
ar_train_encoded = oe.transform(df_train)
# transform the test set using the SAME model:
ar_test_encoded = oe.transform(df_test)

结果是一个numpy数组。