scikit-learn 估算另一个特征中标称值组内特征的平均值

Posted

技术标签:

【中文标题】scikit-learn 估算另一个特征中标称值组内特征的平均值【英文标题】:scikit-learn impute mean of feature within groups of nominal value in another feature 【发布时间】:2017-08-01 03:10:12 【问题描述】:

我想估算一个特征的平均值,但仅根据另一列中具有相同类别/名义值的其他示例计算平均值,我想知道这是否可以使用 scikit-learn 的 Imputer 类?这样只会更容易添加到管道中。

例如:

使用来自 kaggle 的 Titanic 数据集:source

我将如何根据pclass 估算平均值fare。其背后的想法是不同阶层的人在门票之间会有很大的差异。

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

我查看了下面Vivek 的评论,并在我有时间做我想做的事情时构建一个通用管道函数:) 我很清楚如何去做,并将在何时发布作为答案完成了。

【问题讨论】:

您可以将每个pclass的数据进行拆分,将fare代入,然后再次堆叠,形成完整的数据。 谢谢@VivekKumar!我会考虑将其作为我管道的一部分 您可以查看this example 以获得实现自己的类的提示,可以在管道中使用 另见datascience.stackexchange.com/q/71856/55122 【参考方案1】:

所以下面是一个非常简单的方法来解决我的问题,它只是为了处理事情的方式。更健壮的实现可能会涉及利用 scikit learn 中的 Imputer 类,这意味着它还可以处理众数、中值等,并且更擅长处理稀疏/密集矩阵。

这是基于 Vivek Kumar 对原始问题的评论,该评论建议将数据拆分为堆栈并以这种方式进行估算,然后重新组装它们。

import numpy as np
from sklearn.base import BaseEstimator, TransformerMixin

class 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 ):
                # If we're using the dependent variable
                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]
                    # Calculate mean from examples without missing values
                    mean = np.mean(column[without_missing[:, self.replace_col_index] != self.missing_values])

                    # Broadcast mean to all missing values
                    with_missing[:, self.replace_col_index] = mean

                    stacks.append(np.concatenate((with_missing, without_missing)))
            else:
                # If we're using nominal values within a binarised feature (i.e. the classes
                # are unique values within a nominal column - e.g. sex)
                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]
                    # Calculate mean from examples without missing values
                    mean = np.mean(column[without_missing[:, self.replace_col_index] != self.missing_values])

                    # Broadcast mean to all missing values
                    with_missing[:, self.replace_col_index] = mean
                    stacks.append(np.concatenate((with_missing, without_missing)))

            if len(stacks) > 1 :
                # Reassemble our stacks of values
                X = np.concatenate(stacks)

        return X

【讨论】:

您可能应该在fit时间学习相关统计数据,这样测试数据就不会使用自己的分布进行估算。

以上是关于scikit-learn 估算另一个特征中标称值组内特征的平均值的主要内容,如果未能解决你的问题,请参考以下文章

在 scikit-learn 中使用啥估算器?

使用特定列在 scikit-learn 中估算分类缺失值

如何在 Scikit-Learn 中获取 GridSearchCV() 的 OneVsRestClassifier(LinearSVC()) 的估算器键参考?

使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列

通过从 pandas 和 scikit-learn 中的非缺失值估计方程来估算缺失值

weka 中看不见的标称值