Python - 适合部分数据转换的标准缩放器

Python - Standard scaler fit on transform on partial data

拥有以下DF:

   A   B    c
0  1   1   21
1  2  12  122
2  3   3   23
3  4  14  124
4  5   5   25

我的“训练集”已使用 StandardScaler 进行了转换。转换后的特征具有以下值:

array([[-1.41421356, -1.17669681, -0.85696442],
       [-0.70710678,  0.98058068,  1.20383097],
       [ 0.        , -0.78446454, -0.81615659],
       [ 0.70710678,  1.37281295,  1.24463879],
       [ 1.41421356, -0.39223227, -0.77534876]])

Scaler 保存为 PKL 文件,用于推理时转换特征。但是,在某些情况下,我只需要某些功能,例如只需要 A 列。由于缩放器是在不同的形状上训练的,因此无法仅变换 A,因此会出现错误。

ValueError: X has 1 features, but StandardScaler is expecting 3 features as input.

因此,我正在转换数据并随后选择特征,如下所示:

from sklearn.preprocessing import StandardScaler
import pandas as pd

df = pd.DataFrame({'A':[1,2,3,4,5],'B':[1,12,3,14,5],'c':[21,122,23,124,25]})
scaler = StandardScaler()
scaler.fit_transform(df.values)

# scaler.transform(df[['A']].values) #this line will fail with ValueError: X has 1 features, but StandardScaler is expecting 3 features as input.

scaler.transform(df.values).T[0]

有没有更优雅的方法?

更新
在某些情况下,我什至没有整个 DF,只有原始列,所以我不能使用缩放器。

查看缩放器 API and the code 似乎无法使用 sklearn class 对列子样本进行应用。您可以编写自己的 class 在转换时采用可选的列掩码并在缩放之前应用它。例如

class PartialStandardScaler(StandardScaler):

    def transform(self, X, column_mask=None):
        if column_mask is None:
             return super().transform(X)
        return (X[:,column_mask] - self.mean_[column_mask])/self.scale_[column_mask]

在你的情况下你可以

scaler.transform(df.values, column_mask=[True,False,False])

您也可以允许将列掩码作为列索引列表传递。