私の質問にはかなり簡単なアプローチがありますが、これは物事の手段を扱うことを意味していました。より堅牢な実装には、おそらく、モード、中央値などを行うことができることを意味する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
'pclass'ごとにデータを分割し、それらの' fare'を代入して、それらを再度スタックして完全なデータを作成することができます。 –
ありがとう@VivekKumar!私はパイプラインの一部としてこれを行うことを検討します – TheJokersThief
[この例](http://scikit-learn.org/stable/auto_examples/hetero_feature_union.html#sphx-glr-auto-examples-hetero- feature-union-py)を使用して、パイプラインで使用できる独自のクラスを実装するためのヒントを得ることができます –