仅在选择的列上使用 sklearn StandardScaler

bil*_*rim 5 python dataset scikit-learn

我有一个 numpy 数组 X,它有 3 列,如下所示:

array([[    3791,     2629,        0],
       [ 1198760,   113989,        0],
       [ 4120665,        0,        1],
       ...
Run Code Online (Sandbox Code Playgroud)

前 2 列是连续值,最后一列是二进制 (0,1)。我只想将 StandardScaler 类应用于前 2 列。我目前正在通过以下方式执行此操作:

scaler = StandardScaler()
X_subset = scaler.fit_transform(X[:,[0,1]])
X_last_column = X[:, 2]
X_std = np.concatenate((X_subset, X_last_column[:, np.newaxis]), axis=1)
Run Code Online (Sandbox Code Playgroud)

X_std 的输出是:

array([[-0.34141308, -0.18316715,  0.        ],
       [-0.22171671, -0.17606473,  0.        ],
       [ 0.07096154, -0.18333483,  1.        ],
       ...,
Run Code Online (Sandbox Code Playgroud)

有没有办法一步完成这一切?我想将此作为管道的一部分,它将缩放前 2 列并将最后一个二进制列保持原样。

bil*_*rim 5

我最终使用一个类来选择这样的列:

class ItemSelector(BaseEstimator, TransformerMixin):

    def __init__(self, columns):
        self.columns = columns

    def fit(self, x, y=None):
        return self

    def transform(self, data_array):
        return data_array[:, self.columns]
Run Code Online (Sandbox Code Playgroud)

然后,我在管道中使用了 FeatureUnion,如下所示,仅将 StandardScaler 适合连续变量:

FeatureUnion(
    transformer_list=[
        ('continous', Pipeline([  # Scale the first 2 numeric columns
            ('selector', ItemSelector(columns=[0, 1])),
            ('scaler', StandardScaler())
        ])),
        ('categorical', Pipeline([  # Leave the last binary column as is
            ('selector', ItemSelector(columns=[2]))
        ]))
    ]
)
Run Code Online (Sandbox Code Playgroud)

这对我来说效果很好。