機械学習分類タスクのラベルを前処理しているときに、文字列値を取るラベルをホットエンコードする必要があります。 _sklearn.preprocessing
_からのOneHotEncoder
または_to_categorical
_からの_kera.np_utils
_には、int
入力が必要な場合があります。つまり、1つのホットエンコーダーの前にLabelEncoder
を付ける必要があります。私はそれをカスタムクラスで手作業で行いました:
_class LabelOneHotEncoder():
def __init__(self):
self.ohe = OneHotEncoder()
self.le = LabelEncoder()
def fit_transform(self, x):
features = self.le.fit_transform( x)
return self.ohe.fit_transform( features.reshape(-1,1))
def transform( self, x):
return self.ohe.transform( self.la.transform( x.reshape(-1,1)))
def inverse_tranform( self, x):
return self.le.inverse_transform( self.ohe.inverse_tranform( x))
def inverse_labels( self, x):
return self.le.inverse_transform( x)
_
_sklearn.pipeline
_を使用してsklearn API内でそれを行う方法が必要であると確信していますが、以下を使用する場合:
_LabelOneHotEncoder = Pipeline( [ ("le",LabelEncoder), ("ohe", OneHotEncoder)])
_
OneHotEncoder
からエラーValueError: bad input shape ()
が表示されます。私の推測では、些細な2番目の軸を追加することにより、LabelEncoder
の出力を再形成する必要があります。この機能を追加する方法はわかりません。
彼らが一緒にうまくプレイしないのは奇妙です...私は驚いています。クラスを拡張して、提案されたように再形成されたデータを返します。
class ModifiedLabelEncoder(LabelEncoder):
def fit_transform(self, y, *args, **kwargs):
return super().fit_transform(y).reshape(-1, 1)
def transform(self, y, *args, **kwargs):
return super().transform(y).reshape(-1, 1)
その後、パイプラインを使用して動作するはずです。
pipe = Pipeline([("le", ModifiedLabelEncoder()), ("ohe", OneHotEncoder())])
pipe.fit_transform(['dog', 'cat', 'dog'])
https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/preprocessing/label.py#L39
Scikit-learn 0.20以降、OneHotEncoder
は文字列を受け入れるため、その前にLabelEncoder
を使用する必要はありません。そして、あなたはそれをパイプラインで使うことができます。