web-dev-qa-db-ja.com

scikit-learn:パイプラインを使用してLabelEncoderおよびOneHotEncoderを構成する方法は?

機械学習分類タスクのラベルを前処理しているときに、文字列値を取るラベルをホットエンコードする必要があります。 _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の出力を再形成する必要があります。この機能を追加する方法はわかりません。

7

彼らが一緒にうまくプレイしないのは奇妙です...私は驚いています。クラスを拡張して、提案されたように再形成されたデータを返します。

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

15
David Stevens

Scikit-learn 0.20以降、OneHotEncoderは文字列を受け入れるため、その前にLabelEncoderを使用する必要はありません。そして、あなたはそれをパイプラインで使うことができます。

13
bryant1410