7

私は sci-kit Learn で線形回帰モデルを構築しており、sci-kit Learn Pipeline の前処理ステップとして入力をスケーリングしています。バイナリ列のスケーリングを回避する方法はありますか? 何が起こっているかというと、これらの列が他のすべての列でスケーリングされているため、値が 0 または 1 ではなく 0 を中心に配置されるため、[-0.6, 0.3] のような値が得られ、入力値が 0 になります。私の線形モデルの予測に影響を与えます。

説明する基本的なコード:

>>> import numpy as np
>>> from sklearn.pipeline import Pipeline
>>> from sklearn.preprocessing import StandardScaler
>>> from sklearn.linear_model import Ridge
>>> X = np.hstack( (np.random.random((1000, 2)),
                np.random.randint(2, size=(1000, 2))) )
>>> X
array([[ 0.30314072,  0.22981496,  1.        ,  1.        ],
       [ 0.08373292,  0.66170678,  1.        ,  0.        ],
       [ 0.76279599,  0.36658793,  1.        ,  0.        ],
       ...,
       [ 0.81517519,  0.40227095,  0.        ,  0.        ],
       [ 0.21244587,  0.34141014,  0.        ,  0.        ],
       [ 0.2328417 ,  0.14119217,  0.        ,  0.        ]])
>>> scaler = StandardScaler()
>>> scaler.fit_transform(X)
array([[-0.67768374, -0.95108883,  1.00803226,  1.03667198],
       [-1.43378124,  0.53576375,  1.00803226, -0.96462528],
       [ 0.90632643, -0.48022732,  1.00803226, -0.96462528],
       ...,
       [ 1.08682952, -0.35738315, -0.99203175, -0.96462528],
       [-0.99022572, -0.56690563, -0.99203175, -0.96462528],
       [-0.91994001, -1.25618613, -0.99203175, -0.96462528]])

最後の行の出力が次のようになることを望みます。

>>> scaler.fit_transform(X, dont_scale_binary_or_something=True)
array([[-0.67768374, -0.95108883,  1.        ,  1.        ],
       [-1.43378124,  0.53576375,  1.        ,  0.        ],
       [ 0.90632643, -0.48022732,  1.        ,  0.        ],
       ...,
       [ 1.08682952, -0.35738315,  0.        ,  0.        ],
       [-0.99022572, -0.56690563,  0.        ,  0.        ],
       [-0.91994001, -1.25618613,  0.        ,  0.        ]])

これを達成する方法はありますか?バイナリではない列を選択し、それらを変換するだけで、変換された値を配列に戻すことができると思いますが、sci-kit Learn Pipeline ワークフローとうまく連携させたいので、次のようにします。

clf = Pipeline([('scaler', StandardScaler()), ('ridge', Ridge())])
clf.set_params(scaler__dont_scale_binary_features=True, ridge__alpha=0.04).fit(X, y)
4

6 に答える 6

6

スケーリング中に最後の 2 つの列を無視するカスタム スケーラーを作成する必要があります。

from sklearn.base import TransformerMixin
import numpy as np

class CustomScaler(TransformerMixin): 
    def __init__(self):
        self.scaler = StandardScaler()

    def fit(self, X, y):
        self.scaler.fit(X[:, :-2], y)
        return self

    def transform(self, X):
        X_head = self.scaler.transform(X[:, :-2])
        return np.concatenate(X_head, X[:, -2:], axis=1)
于 2016-06-07T17:38:51.023 に答える
3

X_scaled のインデックスを指定しない限り、@Vitaliy Grabovets データフレーム バージョンの連結が正しく機能しないことがわかりました。したがって、関連する行は次のようになります。

X_scaled = pd.DataFrame(self.scaler.transform(X[self.columns]), columns=self.columns, index=X.index)
于 2017-02-09T15:25:52.723 に答える