#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.