Использование inverse_transform MinMaxScaler из scikit_learn, чтобы заставить фрейм данных находиться в диапазоне другого - PullRequest
1 голос
/ 16 января 2020

Я следовал этому ответу , чтобы применить обратное преобразование к масштабированному фрейму данных. Мой вопрос: как я могу преобразовать новый фрейм данных в диапазон значений исходного фрейма? До сих пор я делал это:

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
cols = ['A', 'B']
data = pd.DataFrame(np.array([[2,3],[1.02,1.2],[0.5,0.3]]),columns=cols)
scaler = MinMaxScaler() # default min and max values are 0 and 1, respectively
scaled_data = scaler.fit_transform(data)
orig_data = scaler.inverse_transform(scaled_data) # obtain same as `data`
new_data = pd.DataFrame(np.array([[8,20],[11,2],[5,3]]),columns=cols)
inver_new_data = scaler.inverse_transform(new_data)   

Я хочу, чтобы inver_new_data был кадром данных со столбцами в одном и том же диапазоне значений столбцов data, например, столбец A между 0,5 и 2, и так далее. Однако я получаю для столбца A значения от 8 до 17. Любые идеи?

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Чтобы объяснить вам, что MinMaxScaler делает :

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

Таким образом, каждая функция вашего data будет в основном между 0 и 1. В момент запуска: fit_transform(data), обучен.

Для преобразования у вас есть:

X_scaled = scale * X + min - X.min(axis=0) * scale

, где scale = (max - min) / (X.max(axis=0) - X.min(axis=0)) шкала была обучена по методу подбора.

Так что, если вы запустите inverse_transofmr(new_data) это вам совсем не поможет.

Также inver_new_data= scaler.transform(new_data) вам не поможет.

Вам нужно уточнить, что для вас значит тот же диапазон? Подход с MinMaxScaler не поможет вам прямо сейчас. Вы можете ограничить столбцы минимальными и максимальными значениями исходного кадра данных. Так, например:

dataA = new_data[['A']]
scalerA = MinMaxScaler(data['A'].min(), data['A'].max()) 
inver_new_data_A = scaler.fit_transform(dataA)  

, но это также не точный диапазон, minmax также учитывает расстояния между точками.

2 голосов
/ 16 января 2020

MinMaxScaler применяется к каждому столбцу следующее преобразование:

  1. Минимум столбца вычитания;
  2. Деление на диапазон столбца (т. Е. column max - column min).

Обратное преобразование применяет операцию «обратный» в «обратном» порядке:

  1. Умножение на диапазон столбцов перед преобразованием;
  2. Добавление минимального столбца.

Поэтому для столбца A выполняется

(df['A'] - df['A'].min())/(df['A'].max() - df['A'].min())

, в частности, в скейлере хранятся значения min 0.5 и диапазон 1.5

Когда вы применяете inverse_transform to [8, 11, 5] это становится:

[8*1.5 + 0.5, 11*1.5 + 0.5, 5*1.5 + 0.5]=[12.5, 18, 8]

Теперь это не , как правило, предлагается для любого машинного обучения, однако для преобразования диапазонов нового столбца в предыдущий , вы можете сделать что-то вроде следующего:

data = pd.DataFrame(np.array([[2,3],[1.02,1.2],[0.5,0.3]]),columns=cols)

# Create a Scaler for the initial data
scaler_data = MinMaxScaler() 

# Fit the scaler with these data, but there is no need to transform them.
scaler_data.fit(data)

#Create new data
new_data = pd.DataFrame(np.array([[8,20],[11,2],[5,3]]),columns=cols)

# Create a Scaler for the new data
scaler_new_data = MinMaxScaler() 

# Trasform new data in the [0-1] range
scaled_new_data = scaler_new_data.fit_transform(new_data)

# Inverse transform new data from [0-1] to [min, max] of data
inver_new_data = scaler_data.inverse_transform(scaled_new_data)

Например, это всегда будет сопоставлять минимальное и максимальное значения новых столбцов данных с минимальным и максимальным значениями столбцов начальных данных соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...