我想填补某个特征的均值,但只基于另一列中具有相同类别/名义值的其他示例来计算均值。我想知道这是否可以使用scikit-learn的Imputer类来实现?这样做会更容易将其添加到管道中。
例如:
使用来自kaggle的泰坦尼克数据集:来源
我该如何填补每个pclass
的fare
均值?背后的想法是不同类别的人在票价上会有很大的差异。
更新:在与一些人讨论后,我应该使用的短语是“在类别内填补均值”。
我已经查看了下面的@某人的评论,并将在有时间时构建一个通用的管道函数来实现我想要的。我已经有了如何做的好主意,并会在完成后作为答案发布。
回答:
因此,下面是对我的问题的一个相当简单的处理方法,仅用于处理均值。更健壮的实现可能需要使用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