0

我想要推算特征的平均值,但仅计算基于其他列中具有相同类别/标称值的例子的平均值,而我是想知道这是否可以使用scikit-learn的Imputer类?这样可以更容易地以这种方式添加到管道中。scikit-learn在另一个特征的标称值组内的特征组的特征平均值

例如:

使用从kaggle泰坦尼克号数据集:source

我怎么会去归咎于每pclass平均fare。其背后的思想是,不同班级的人在门票之间的成本差异很大。

更新:一些人讨论后,我应该用这句话被“归咎于平均类中”。

我看了下面的Vivek的注释,当我得到时间去做我想要的东西时,它将构建一个通用的管道函数:)我对如何做到这一点有个很好的想法,并且当它是完了。

+1

您可以根据'pclass'拆分数据,为它们计算'fare',然后再堆叠它们以创建完整的数据。 –

+0

谢谢@VivekKumar!我会考虑将其作为我的管道的一部分 – TheJokersThief

+1

您可以查看[此示例](http://scikit-learn.org/stable/auto_examples/hetero_feature_union.html#sphx-glr-auto-examples-hetero- feature-union-py)来获得实现你自己的类的提示,这可以在管道中使用 –

回答

0

所以下面是我的问题的一个非常简单的方法,只是为了处理事物的手段。更强大的实现可能涉及利用scikit学习中的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