Minmaxscaler inverse_transform не работает

#python

#python

Вопрос:

мой код выглядит следующим образом:

преобразование масштаба

 X = dataset #(100, 18)
scaler = MinMaxScaler(feature_range=(0, 1))
scaler = scaler.fit(X)
scaled_X = scaler.transform(X)
scaled_series = Series(scaled_X[:, 17])
print(scaled_series.head())
  

инвертировать преобразование

 inverted_X = scaler.inverse_transform(scaled_X)
inverted_series = Series(inverted_X[:, 17])
print(inverted_series.head())
  

проблема в том, что scaled_series и inverted_series — это один и тот же результат, как я должен исправить код?

Ответ №1:

Я думаю, проблема специфична для вашего набора данных. Например, когда я использую пример набора данных, scaled_series и inverted_series выдали два разных вывода:

 Scaled Series output:
0    0.729412
1    0.741176
2    0.741176
3    0.670588
4    0.870588
dtype: float32

Inverted Series output:
0    0.698347
1    0.706612
2    0.706612
3    0.657025
4    0.797521
dtype: float32
  

Оба scaled_series и inverted_series выдали разные выходные данные, но значения близки друг к другу. Если вы scale сохраните данные перед использованием MinMaxScalar :

 from sklearn.preprocessing import scale

X = scale(X)
  

Результат:

 Scaled Series output:
0    0.729412
1    0.741176
2    0.741176
3    0.670588
4    0.870588
dtype: float32

Inverted Series output:
0   -0.188240
1   -0.123413
2   -0.123413
3   -0.512372
4    0.589678
dtype: float32
  

Теперь выходные данные расположены не близко друг к другу, они совершенно разные.

Код:


 from sklearn.datasets import fetch_olivetti_faces
from sklearn.preprocessing import MinMaxScaler, scale
from pandas import Series

X, _ = fetch_olivetti_faces(return_X_y=True)
X = scale(X)

scaler = MinMaxScaler(feature_range=(0, 1))
scaler = scaler.fit(X)
scaled_X = scaler.transform(X)
scaled_series = Series(scaled_X[:, 17])
print("nScaled Series output:")
print(scaled_series.head())

inverted_X = scaler.inverse_transform(scaled_X)
inverted_series = Series(inverted_X[:, 17])
print("nInverted Series output:")
print(inverted_series.head())
  

Ответ №2:

Вы должны учитывать диапазон вашего набора данных X . Если мы рассмотрим формулу для MinMax scaler:

введите описание изображения здесь

Если диапазон X будет [0,1], разницы не будет, поскольку вы будете вычитать 0 и делить на 1. Таким образом, возвращая то же значение.

Нормализация возможна только для значений, которые не находятся в масштабе 0-1.