【问题标题】:fit_transform vs transform when doing inference进行推理时的 fit_transform 与变换
【发布时间】:2020-09-11 06:57:50
【问题描述】:

我已经训练了一个 keras 模型并保存了它。我现在想在 Web 应用程序中使用该模型进行推理。我想通过使用来自 sklearn 的StandardScaler() 缩放输入来预处理输入。 但是每当我运行transform(inputs) 时,就会出现一个错误,希望我先进行拟合。这是代码

from sklearn.preprocessing import StandardScaler
inputs = [1,8,0,0,4,18,4,3,576,9,8,8,14,1,0,4,0,0,3,6,0,1,1]
inputs = scale.transform(inputs)
preds = model.predict(inputs, batch_size = 1)

然后我更改了代码以进行拟合

from sklearn.preprocessing import StandardScaler
    inputs = [1,8,0,0,4,18,4,3,576,9,8,8,14,1,0,4,0,0,3,6,0,1,1]
    inputs = scale.fit_transform(inputs)
    preds = model.predict(inputs, batch_size = 1)

它有效,但无论我提供什么输入,缩放后的数据都是一堆零,从而做出错误的预测。我肯定在这里缺少一些关键概念,我正在寻求帮助。谢谢

【问题讨论】:

    标签: keras scikit-learn


    【解决方案1】:

    标准缩放函数有公式:

    z = (x - u) / s
    

    这里,

    x: Element  
    u: Mean  
    s: Standard Deviation
    

    此元素转换是按列进行的。 因此,当您调用拟合时,会计算 meanstandard_deviation 的值。

    例如:

    from sklearn.preprocessing import StandardScaler
    import numpy as np
    
    x = np.random.randint(50,size = (10,2))
    x
    

    输出:

    array([[26,  9],
           [29, 39],
           [23, 26],
           [29, 22],
           [28, 41],
           [11,  6],
           [42, 40],
           [ 1, 25],
           [ 0, 39],
           [44, 45]])
    

    现在,安装标准缩放器

    scale = StandardScaler()
    scale.fit(x)
    

    您可以使用 StandardScaler 对象的内置方法查看均值和标准差

    # Mean
    scale.mean_   # array([23.3, 29.2])
    
    # Standard Deviation
    scale.scale_  # array([14.36697602, 13.12859475])
    

    您使用 transform 方法转换这些值。

    scale.transform(x)
    

    输出:

    array([[ 0.18793099, -1.53862621],
           [ 0.3967432 ,  0.74646222],
           [-0.02088122, -0.24374277],
           [ 0.3967432 , -0.54842122],
           [ 0.32713913,  0.89880145],
           [-0.85613006, -1.76713506],
           [ 1.3015961 ,  0.82263184],
           [-1.55217075, -0.31991238],
           [-1.62177482,  0.74646222],
           [ 1.44080424,  1.20347991]])
    

    第一个元素的计算:

    z = (26 - 23.3) /  14.36697602
    z = 0.18793099
    

    这个怎么用?
    转换应在训练模型之前完成。培训应在转换后的数据上进行。对于预测,测试数据应使用与训练数据相同的均值和标准差值。 IE。不要对测试数据使用fit 方法。您应该使用用于转换训练数据的对象来转换您的测试数据。

    【讨论】:

      猜你喜欢
      • 2017-01-31
      • 2015-06-13
      • 2017-02-21
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2020-06-23
      相关资源
      最近更新 更多