在训练数据上使用 MinMaxScaler 生成用于测试数据的标准、最小值和最大值
Use MinMaxScaler on training data to generate std, min and max to be used on testing data
我如何使用 scikit-learn MinMaxScaler
来标准化 pandas 数据框训练数据集中的每一列,但使用完全相同的标准差,min/max 公式在我的测试数据集上?
由于模型不知道我的测试数据,所以我不想对整个数据集进行标准化,它不会成为未来未知数据的准确模型。相反,我想使用训练集对 0 和 1 之间的数据进行标准化,并对测试数据的公式使用相同的标准、最小值和最大值。
(显然我可以编写自己的最小-最大缩放器,但想知道 scikit-learn 是否已经可以做到这一点,或者是否有我可以首先使用的库)
您应该能够 fit
它在您的训练数据上,然后 transform
您的测试数据:
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train) # or: fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
您的方法现在看来是很好的做法。如果您要在整个 X 矩阵(训练和测试相结合)上调用 fit
,则会导致信息泄漏,因为您的训练数据事先会具有 "seen" 测试数据的规模。使用基于 class 的 MinMaxScaler()
实现是 sklearn 如何具体解决这个问题,允许对象 "remember" 它所适合的数据的属性。
但是,请注意 MinMaxScaler()
不会 扩展到 ~N(0, 1)。事实上,它被明确标榜为这种缩放的替代方案。换句话说,它根本不能保证单位方差或 0 均值。事实上,它并不关心传统意义上定义的标准偏差。
来自文档字符串:
The transformation is given by:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max_ - min_) + min_
其中 min_
和 max_
等于 MinMaxScaler()
的 __init__
中的解压缩 feature_range
(默认 (0, 1)
)。手动这是:
def scale(a):
# implicit feature_range=(0,1)
return (a - X_train.min(axis=0)) / (X_train.max(axis=0) - X_train.min(axis=0))
假设你有:
将 numpy 导入为 np
从 sklearn.model_selection 导入 train_test_split
np.random.seed(444)
X = np.random.normal(loc=5, scale=2, size=(200, 3))
y = np.random.normal(loc=-5, scale=3, size=X.shape[0])
X_train, X_test, y_train, y_test = train_test_split(
X, y, random_state=444)
如果你打电话给
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
知道 scaler.scale_
是 而不是 您进行拟合的数据的标准偏差。
scaler.scale_
# array([ 0.0843, 0.0852, 0.0876])
X_train.std(axis=0)
# array([ 2.042 , 2.0767, 2.1285])
相反,它是:
(1 - 0) / (X_train.max(axis=0) - X_train.min(axis=0))
# array([ 0.0843, 0.0852, 0.0876])
我如何使用 scikit-learn MinMaxScaler
来标准化 pandas 数据框训练数据集中的每一列,但使用完全相同的标准差,min/max 公式在我的测试数据集上?
由于模型不知道我的测试数据,所以我不想对整个数据集进行标准化,它不会成为未来未知数据的准确模型。相反,我想使用训练集对 0 和 1 之间的数据进行标准化,并对测试数据的公式使用相同的标准、最小值和最大值。
(显然我可以编写自己的最小-最大缩放器,但想知道 scikit-learn 是否已经可以做到这一点,或者是否有我可以首先使用的库)
您应该能够 fit
它在您的训练数据上,然后 transform
您的测试数据:
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train) # or: fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
您的方法现在看来是很好的做法。如果您要在整个 X 矩阵(训练和测试相结合)上调用 fit
,则会导致信息泄漏,因为您的训练数据事先会具有 "seen" 测试数据的规模。使用基于 class 的 MinMaxScaler()
实现是 sklearn 如何具体解决这个问题,允许对象 "remember" 它所适合的数据的属性。
但是,请注意 MinMaxScaler()
不会 扩展到 ~N(0, 1)。事实上,它被明确标榜为这种缩放的替代方案。换句话说,它根本不能保证单位方差或 0 均值。事实上,它并不关心传统意义上定义的标准偏差。
来自文档字符串:
The transformation is given by:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) X_scaled = X_std * (max_ - min_) + min_
其中 min_
和 max_
等于 MinMaxScaler()
的 __init__
中的解压缩 feature_range
(默认 (0, 1)
)。手动这是:
def scale(a):
# implicit feature_range=(0,1)
return (a - X_train.min(axis=0)) / (X_train.max(axis=0) - X_train.min(axis=0))
假设你有: 将 numpy 导入为 np 从 sklearn.model_selection 导入 train_test_split
np.random.seed(444)
X = np.random.normal(loc=5, scale=2, size=(200, 3))
y = np.random.normal(loc=-5, scale=3, size=X.shape[0])
X_train, X_test, y_train, y_test = train_test_split(
X, y, random_state=444)
如果你打电话给
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
知道 scaler.scale_
是 而不是 您进行拟合的数据的标准偏差。
scaler.scale_
# array([ 0.0843, 0.0852, 0.0876])
X_train.std(axis=0)
# array([ 2.042 , 2.0767, 2.1285])
相反,它是:
(1 - 0) / (X_train.max(axis=0) - X_train.min(axis=0))
# array([ 0.0843, 0.0852, 0.0876])