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])
您也可以允许将列掩码作为列索引列表传递。
拥有以下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])
您也可以允许将列掩码作为列索引列表传递。