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 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 
関連する問題