Вы можете найти хорошее объяснение того, как MinMaxScaler
работает на следующем сайте: http://benalexkeen.com/feature-scaling-with-scikit-learn/#Min-Max-Scaler
В scikit-Learn вы делаете:
import numpy as np
from sklearn import preprocessing
x = np.array([[1., -1., 2.],
[2., 0., 0.],
[0., 1., -1.]])
print(x)
# [[ 1. -1. 2.]
# [ 2. 0. 0.]
# [ 0. 1. -1.]]
scaler = preprocessing.MinMaxScaler().fit(x)
x_transformed = scaler.transform(x)
print(x_transformed)
# [[0.5 0. 1. ]
# [1. 0.5 0.33333333]
# [0. 1. 0. ]]
Встроенный экземпляр MinMaxScaler
внутренне сохраняет средства:
# [[ 1. -1. 2.]
# [ 2. 0. 0.]
# [ 0. 1. -1.]]
print(scaler.data_min_)
# [ 0. -1. -1.]
print(scaler.data_max_)
# [ 2. 1. 2.]
В качестве альтернативы вы можете вычислять и масштабировать каждое значение с помощью numpy
:
x_plain_np = np.apply_along_axis(lambda col: (col- np.min(col)) / (np.max(col) - np.min(col)), 0, x)
print(x_plain_np)
# [[0.5 0. 1. ]
# [1. 0.5 0.33333333]
# [0. 1. 0. ]]
Здесь все о self.min_
:
data_range = data_max - data_min
self.scale_ = ((feature_range[1] - feature_range[0]) /
_handle_zeros_in_scale(data_range))
self.min_ = feature_range[0] - data_min * self.scale_
(0, 1)
является значением по умолчанию feature_range
.В вашем примере мы можем воспроизвести каждый шаг:
1-й: вычислить data_range
:
data_range = scaler.data_max_ - scaler.data_min_
print(data_range) # [2. 2. 3.]
2-й: вычислить scale_
:
scale_ = ((scaler.feature_range[1] - scaler.feature_range[0]) / # 1 - 0
preprocessing.data._handle_zeros_in_scale(data_range)) # we have no zeros
print(scale_) # [0.5 0.5 0.33333333]
Третий: Вычислить min_
:
min_ = scaler.feature_range[0] - scaler.data_min_ * scale_
print(min_) # [0. 0.5 0.33333333]
Наш результат соответствует внутреннему результату:
print(min_) # [0. 0.5 0.33333333]
print(scaler.min_) # [0. 0.5 0.33333333]
Наконец, мы можем использовать scale_
и min_
для преобразования наших данных:
x *= self.scale_
x += self.min_