sklearn.pipeline で X (機能セット) を変換する変換メソッドを実装する複数の推定器を連鎖できることを理解しています。ただし、ターゲット ラベルも変換したいユース ケースがあります (ラベルを [0, K-1] ではなく [1...K] に変換するなど)。これをパイプラインのコンポーネントとして行いたいと考えています。 . sklearn.pipeline を使用することはまったく可能ですか?
3 に答える
いいえ、パイプラインは常にy
変更されずに通過します。パイプラインの外で変換を行います。
(これは scikit-learn の既知の設計上の欠陥ですが、API を変更または拡張するほど差し迫ったことはありません。)
scikit-learn に組み込まれている、これを行うためのより良い方法があります。を使用してcompose.TransformedTargetRegressor
。
これらのオブジェクトを構築するとき、それらにregressor
とを与えますtransformer
。.fit()
彼らは、回帰する前にターゲットを.predict()
変換し、予測されたターゲットを変換して元の空間に戻します。
それらにオブジェクトを渡すことができることに注意することが重要pipeline
であるため、それらは既存のセットアップと適切にインターフェースする必要があります。たとえば、リッジ回帰をトレーニングして、2 つの特徴が与えられた場合に 1 つのターゲットを予測する次の設定を取り上げます。
# Imports
import numpy as np
from sklearn import compose, linear_model, metrics, pipeline, preprocessing
# Generate some training and test features and targets
X_train = np.random.rand(200).reshape(100,2)
y_train = 1.2*X_train[:, 0]+3.4*X_train[:, 1]+5.6
X_test = np.random.rand(20).reshape(10,2)
y_test = 1.2*X_test[:, 0]+3.4*X_test[:, 1]+5.6
# Define my model and scalers
ridge = linear_model.Ridge(alpha=1e-2)
scaler = preprocessing.StandardScaler()
minmax = preprocessing.MinMaxScaler(feature_range=(-1,1))
# Construct a pipeline using these methods
pipe = pipeline.make_pipeline(scaler, ridge)
# Construct a TransformedTargetRegressor using this pipeline
# ** So far the set-up has been standard **
regr = compose.TransformedTargetRegressor(regressor=pipe, transformer=minmax)
# Fit and train the regr like you would a pipeline
regr.fit(X_train, y_train)
y_pred = regr.predict(X_test)
print("MAE: {}".format(metrics.mean_absolute_error(y_test, y_pred)))
これは、私が望むほどスムーズではありません。たとえば、TransformedTargetRegressor
usingに含まれるリグレッサーにアクセスできます.regressor_
が、そこに格納されている係数は変換されていません。これは、データを生成した方程式に戻りたい場合に、ジャンプする余分なフープがいくつかあることを意味します。