scikit-learn 在另一特征的不同类别值组内填补特征的均值

我想填补某个特征的均值,但只基于另一列中具有相同类别/名义值的其他示例来计算均值。我想知道这是否可以使用scikit-learn的Imputer类来实现?这样做会更容易将其添加到管道中。

例如:

使用来自kaggle的泰坦尼克数据集:来源

我该如何填补每个pclassfare均值?背后的想法是不同类别的人在票价上会有很大的差异。

更新:在与一些人讨论后,我应该使用的短语是“在类别内填补均值”。

我已经查看了下面的@某人的评论,并将在有时间时构建一个通用的管道函数来实现我想要的。我已经有了如何做的好主意,并会在完成后作为答案发布。


回答:

因此,下面是对我的问题的一个相当简单的处理方法,仅用于处理均值。更健壮的实现可能需要使用scikit-learn的Imputer类,这样它也可以处理众数、中位数等,并且在处理稀疏/密集矩阵时会更有效。

这是基于@某人对原始问题的评论,建议将数据分成堆栈,然后以这种方式填补并重新组装它们。

import numpy as npfrom sklearn.base import BaseEstimator, TransformerMixinclass WithinClassMeanImputer(BaseEstimator, TransformerMixin):    def __init__(self, replace_col_index, class_col_index = None, missing_values=np.nan):        self.missing_values = missing_values        self.replace_col_index = replace_col_index        self.y = None        self.class_col_index = class_col_index    def fit(self, X, y = None):        self.y = y        return self    def transform(self, X):        y = self.y        classes = np.unique(y)        stacks = []        if len(X) > 1 and len(self.y) = len(X):            if( self.class_col_index == None ):                # 如果我们使用的是依赖变量                for aclass in classes:                    with_missing = X[(y == aclass) &                                         (X[:, self.replace_col_index] == self.missing_values)]                    without_missing = X[(y == aclass) &                                             (X[:, self.replace_col_index] != self.missing_values)]                    column = without_missing[:, self.replace_col_index]                    # 从没有缺失值的示例中计算均值                    mean = np.mean(column[without_missing[:, self.replace_col_index] != self.missing_values])                    # 将均值广播到所有缺失值                    with_missing[:, self.replace_col_index] = mean                    stacks.append(np.concatenate((with_missing, without_missing)))            else:                # 如果我们使用的是二值化特征内的名义值(即类别                # 是名义列内的唯一值 - 例如性别)                for aclass in classes:                    with_missing = X[(X[:, self.class_col_index] == aclass) &                                         (X[:, self.replace_col_index] == self.missing_values)]                    without_missing = X[(X[:, self.class_col_index] == aclass) &                                             (X[:, self.replace_col_index] != self.missing_values)]                    column = without_missing[:, self.replace_col_index]                    # 从没有缺失值的示例中计算均值                    mean = np.mean(column[without_missing[:, self.replace_col_index] != self.missing_values])                    # 将均值广播到所有缺失值                    with_missing[:, self.replace_col_index] = mean                    stacks.append(np.concatenate((with_missing, without_missing)))            if len(stacks) > 1 :                # 重新组装我们的值堆栈                X = np.concatenate(stacks)        return X

Related Posts

L1-L2正则化的不同系数

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

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

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

f1_score metric in lightgbm

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

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

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

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

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

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

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

发表回复

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