【问题标题】:Use MinMaxScaler on training data to generate std, min and max to be used on testing data在训练数据上使用 MinMaxScaler 以生成用于测试数据的标准、最小值和最大值
【发布时间】:2018-07-08 17:25:53
【问题描述】:

如何使用 scikit-learn MinMaxScaler 标准化 pandas 数据框训练数据集中的每一列,但在我的测试数据集上使用完全相同的标准差、最小/最大公式?

由于我的测试数据对模型来说是未知的,我不想标准化整个数据集,这对于未来的未知数据将不是一个准确的模型。相反,我想使用训练集对 0 和 1 之间的数据进行标准化,并对测试数据的公式使用相同的标准、最小值和最大值。

(显然我可以编写自己的 min-max 缩放器,但想知道 scikit-learn 是否已经可以做到这一点,或者是否有一个我可以首先使用的库)

【问题讨论】:

    标签: python scikit-learn minmax


    【解决方案1】:

    您应该能够在您的训练数据上 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,则会导致信息泄漏,因为您的训练数据会事先“看到”测试数据的规模。使用MinMaxScaler() 的基于类的实现是 sklearn 专门解决这个问题的方式,允许对象“记住”它所适合的数据的属性。

    但是,请注意 MinMaxScaler() 确实缩放到 ~N(0, 1)。事实上,它被明确称为这种缩放的替代方案。换句话说,它根本不保证您的单位方差或 0 均值。事实上,它并不关心传统意义上定义的标准差。

    来自文档字符串:

    变换由下式给出:

    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])
    

    【讨论】:

    • @Terry 对于 std,您可能需要 StandardScaler。
    猜你喜欢
    • 2018-11-07
    • 2012-10-09
    • 2017-10-18
    • 2017-09-04
    • 2020-03-21
    • 2023-03-12
    • 2016-11-03
    • 2020-08-30
    相关资源
    最近更新 更多