MinMaxScale归一化之后数据出现负值

原始数据中不含负值,已经规定feature_range=(0, 1),但进行MinMaxScale归一化之后的数据中出现负值,问题出在哪里?

img

中间你是不是对数据处理过,可能产生了负数?

数值舍入误差导致的,不是错误
参考 https://stackoverflow.com/questions/39192613/how-can-i-correctly-use-pipleline-with-minmaxscaler-nmf-to-predict-data
使用np.where或np.allclose函数来比较两个数组的元素是否在一定的容差内相等,或者改变feature_range=(1, 2)试下,留出一些安全空间

建议改用 StandScale(也叫零均值标准化或分数标准化,是当前使用最广泛的数据标准化方法。经过该方法处理的数据均值为0,标准差为1。)

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料中MinMaxScaler的公式计算过程,可以看到归一化后的数据出现负值的原因是因为MinMaxScaler是根据每个特征的最大值和最小值来进行缩放的。如果某个特征的最小值不为0,则归一化之后的数据可能会出现负值。

    解决这个问题的方法有两种: 1. 使用StandardScaler替代MinMaxScaler进行数据归一化。StandardScaler使用均值和标准差来缩放数据,不会出现负值。具体步骤如下:

    ```python
    from sklearn.preprocessing import StandardScaler
    
    # 假设原始数据为X
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    ```
    
    1. 自定义一个函数来进行归一化,确保归一化的结果不会出现负值。具体步骤如下:

      ```python def custom_MinMaxScaler(X): min_val = X.min(axis=0) max_val = X.max(axis=0) scaled_X = (X - min_val) / (max_val - min_val) return scaled_X

      假设原始数据为X

      X_scaled = custom_MinMaxScaler(X) ```

    无论选择哪种方法,都要根据具体情况选择合适的归一化方法来保证数据的有效性。

方法是数据平移,所有正/负数据都加一个正数常量,常量需足够大到让所有数据都变为正数,之后再归一化处理即可

可能是由于数据读取错误、数据预处理步骤中的错误或者代码中的其他问题导致的。
如果原始数据中确实存在负值,但在规定feature_range=(0, 1)时没有考虑到这一点,那么在进行MinMaxScale归一化时就会出现负值。
还有就是在使用MinMaxScale函数进行归一化的过程中,函数的实现存在问题,可能会导致归一化后的数据中出现负值。

计算的过程中出现误差导致的吧,对计算过程检查一下

TechWhizKid参考GPT回答:

  • 尽管你指定的feature_range=(0, 1)。这个问题的出现可能是因为df2中存在一些值比df1中的最小值还要小。MinMaxScaler的工作原理是这样的:
  1. 先会找到训练数据中的最小值和最大值(也就是在你的例子中,会找到df1中的最小值和最大值)。

  2. 然后对任何新的数据(在这个例子中就是df1df2),会根据下面的公式对其进行转换:


    `(x - min) / (max - min)`

在这里,min和max是训练数据中的最小值和最大值。

现在如果df2中有一些值比df1中的最小值还要小,那么转换后的结果就会是负的,因为x - min这个值会是负的。

方案1: 单独在df1df2上fit和transform MinMaxScaler。

from sklearn.preprocessing import MinMaxScaler

# 对df1进行fit和transform
scaler1 = MinMaxScaler(feature_range=(0, 1))
df1_normalized = scaler1.fit_transform(df1)

# 对df2进行fit和transform
scaler2 = MinMaxScaler(feature_range=(0, 1))
df2_normalized = scaler2.fit_transform(df2)

方案2: 先对所有可能出现的数据(包括训练集和测试集)进行fit,然后再分别对它们进行transform。

from sklearn.preprocessing import MinMaxScaler

# 连接df1和df2
df_combined = pd.concat([df1, df2])

# 对所有数据进行fit
scaler = MinMaxScaler(feature_range=(0, 1))
scaler.fit(df_combined)

# 对df1和df2进行transform
df1_normalized = scaler.transform(df1)
df2_normalized = scaler.transform(df2)

方案3: 在训练集上fit,然后在新的数据上transform,使用RobustScaler。

from sklearn.preprocessing import RobustScaler

# 对df1进行fit
scaler = RobustScaler()
scaler.fit(df1)

# 对df1和df2进行transform
df1_normalized = scaler.transform(df1)
df2_normalized = scaler.transform(df2)

这里假设df1和df2是Pandas的DataFrame类型。如果它们是NumPy的数组,那么应该使用np.concatenate而不是pd.concat。