scikit-learn MinMaxScaler дает несколько иные результаты, чем имплантация NumPy
Я сравнил scikit-learn Min-Max scaler с его preprocessing
модуль с "ручным" подходом с использованием NumPy. Однако, я заметил, что результат немного отличается. У кого-нибудь есть объяснение этому?
используя следующее уравнение для масштабирования Min-Max:
который должен быть таким же, как scikit-learn one:(X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
я использую оба подхода следующим образом:
def numpy_minmax(X):
xmin = X.min()
return (X - xmin) / (X.max() - xmin)
def sci_minmax(X):
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0, 1), copy=True)
return minmax_scale.fit_transform(X)
на случайной пример:
import numpy as np
np.random.seed(123)
# A random 2D-array ranging from 0-100
X = np.random.rand(100,2)
X.dtype = np.float64
X *= 100
результаты немного отличаются:
from matplotlib import pyplot as plt
sci_mm = sci_minmax(X)
numpy_mm = numpy_minmax(X)
plt.scatter(numpy_mm[:,0], numpy_mm[:,1],
color='g',
label='NumPy bottom-up',
alpha=0.5,
marker='o'
)
plt.scatter(sci_mm[:,0], sci_mm[:,1],
color='b',
label='scikit-learn',
alpha=0.5,
marker='x'
)
plt.legend()
plt.grid()
plt.show()
1 ответов
scikit-learn
процессы каждого объекта индивидуально. Итак, вам нужно указать axis=0
при выполнении min
, иначе numpy.min
будет минут на все элементы массива, а не каждый столбец отдельно:
>>> xs
array([[1, 2],
[3, 4]])
>>> xs.min()
1
>>> xs.min(axis=0)
array([1, 2])
то же самое numpy.max
; поэтому правильной функцией будет:
def numpy_minmax(X):
xmin = X.min(axis=0)
return (X - xmin) / (X.max(axis=0) - xmin)
делая это, вы получите точное совпадение: