Новая версия MinMaxScaler больше не принимает диапазон максимальных и минимальных значений - PullRequest
1 голос
/ 27 октября 2019

В более ранних версиях Sklearn MinMaxScaler можно было указать минимальное и максимальное значения, на основании которых скалер нормализует данные. Другими словами, возможно следующее:

from sklearn import preprocessing
import numpy as np
x_data = np.array([[66,74,89], [1,44,53], [85,86,33], [30,23,80]])
scaler = preprocessing.MinMaxScaler()
scaler.fit ([-90, 90])
b = scaler.transform(x_data)

Это приведет к масштабированию приведенного выше массива до диапазона (0,1) с минимально возможным значением -90, равным 0, максимально возможнымзначение 90 становится 1, а все промежуточные значения масштабируются соответственно. С версией 0.21 sklearn это выдает ошибку:

ValueError: Expected 2D array, got 1D array instead:
array=[-90.  90.].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

Я превратил scaler.fit ([-90, 90]) в scaler.fit ([[-90, 90]]), но затем я получил:

ValueError: operands could not be broadcast together with shapes (4,3) (2,) (4,3)

Я точно знаю, что яможет сделать scaler.fit (x_data), но это приводит к следующему результату после преобразования:

 [0.         0.33333333 0.35714286]
 [1.         1.         0.        ]
 [0.3452381  0.         0.83928571]]

У меня проблема с этим двоякая: 1) числа кажутся неправильными. Они должны были быть масштабированы от 0 до 1, но я получаю много 0 и много 1 для значений, которые должны быть выше и ниже соответственно. 2) что если я захочу масштабировать каждый будущий массив до диапазона (0,1) на основе фиксированного диапазона, скажем, (-90. 90)? Это была удобная функция, но теперь мне нужно использовать определенный массив для масштабирования. Более того, масштабирование будет давать разные результаты каждый раз, потому что мне придется заново подгонять каждый будущий массив, получая, таким образом, переменные результаты.

Я что-то здесь упускаю? Есть ли способ сохранить эту отличную функцию? А если нет, как я буду следить за тем, чтобы мои данные корректно и последовательно масштабировались каждый раз?

1 Ответ

1 голос
/ 27 октября 2019

Кажется, что проблема не в версии пакета scikit-learn, а в форме входных данных для fit() метода MinMaxScaler объекта:

import numpy as np
import sklearn
from sklearn.preprocessing import MinMaxScaler

print('scikit-learn package version: {}'.format(sklearn.__version__))
# scikit-learn package version: 0.21.3

scaler = MinMaxScaler()
x_sample = [-90, 90]
scaler.fit(np.array(x_sample)[:, np.newaxis]) # reshape data to satisfy fit() method requirements
x_data = np.array([[66,74,89], [1,44,53], [85,86,33], [30,23,80]])

print(scaler.transform(x_data))

# [[0.86666667 0.91111111 0.99444444]
# [0.50555556 0.74444444 0.79444444]
# [0.97222222 0.97777778 0.68333333]
# [0.66666667 0.62777778 0.94444444]]

Чтобы узнать о требованиях к входным даннымтаких популярных препроцессоров, как StandardScaler, MinMaxScaler и т. д., вы можете увидеть мой ответ на другую проблему со входом StandardScaler.fit().

...