【问题标题】:MinMaxScaler returns same value for single inputMinMaxScaler 为单个输入返回相同的值
【发布时间】:2020-12-27 17:00:06
【问题描述】:

我有一个如下所示的数据框,我使用 Scikit-Learn 的 MinMaxScalerpath_len 列的值标准化为 0 和 1。

之前我的数据框的前三行:

feature_1, feature_2, path_len
        0          1        10
        1          1        16
        0          0        117

代码:

from sklearn.preprocessing import MinMaxScaler
min_max = MinMaxScaler()
features['path_len'] = min_max.fit_transform(features[['path_len']])

我的数据框的前三行之后:

feature_1, feature_2, path_len
        0          1  0.033582
        1          1  0.055970
        0          0  0.432836

当我尝试在 path_len 的新输入值上使用 min_max.transform() 时,我得到了相同的确切值:

def preprocess_input(link, min_max, features):
 
    df = pd.DataFrame( columns=features.columns)
    df['feature_1'] = ...
    df['feature_2'] = ...
    df['path_len'] = 86 #arbitrary number
    df['path_len'] = min_max.transform(df[['path_len']]) ### right here!
    return df
    

df['path_len'] 中的最终值又是86

我该如何解决这个问题?

【问题讨论】:

  • 看来你忘记了fit_transform 而不是transform,否则我得到了NotFittedError: This MinMaxScaler instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.
  • 我将 fit_transform 与 path_len 列上的训练数据一起使用,然后将缩放器传递给函数并在新输入上使用 transform得到我上面所说的结果。这里的目的是在将新输入传递给机器学习模型之前对其进行预处理。
  • 这种方式应该是转换你的数据的正确方式,因为你没有提供完整的代码,我认为函数调用和保存输出有问题,你可以在不调用函数的情况下尝试您的代码并分享结果

标签: python python-3.x pandas scikit-learn


【解决方案1】:

换行:

features['path_len'] = min_max.fit_transform(features[['path_len']])

到:

min_max.fit(features[['path_len']])
features['path_len'] = min_max.transform(features[['path_len']])

您的代码将按预期完全运行。

【讨论】:

    【解决方案2】:

    如果您不想再次适合 scaler 对象,您可以执行以下操作:

    scaled_value = (value_in_original_scale - scaler.data_min_[i]) * scaler.scale_[i]
    

    其中i 是您要转换的列索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多