Как нормализовать данные Train и Test, используя MinMaxScaler sklearn - PullRequest
0 голосов
/ 28 мая 2018

Итак, у меня есть это сомнение и я искал ответы.Поэтому вопрос заключается в том, когда я использую

from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()

df = pd.DataFrame({'A':[1,2,3,7,9,15,16,1,5,6,2,4,8,9],'B':[15,12,10,11,8,14,17,20,4,12,4,5,17,19],'C':['Y','Y','Y','Y','N','N','N','Y','N','Y','N','N','Y','Y']})

df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']])
df['C'] = df['C'].apply(lambda x: 0 if x.strip()=='N' else 1)

, после чего я буду тренировать и тестировать модель (A, B в качестве элементов, C в качестве метки) и получить некоторый показатель точности.Теперь я сомневаюсь, что произойдет, когда мне придется предсказать метку для нового набора данных.Скажем,

df = pd.DataFrame({'A':[25,67,24,76,23],'B':[2,54,22,75,19]})

Потому что, когда я нормализую столбец, значения A и B будут изменены в соответствии с новыми данными, а не данными, на которых будет обучаться модель.Итак, теперь мои данные после шага подготовки данных, как показано ниже, будут

data[['A','B']] = min_max_scaler.fit_transform(data[['A','B']])

Значения A и B изменятся относительно значений Max и Mindf[['A','B']].Подготовка данных df[['A','B']] относится к Min Max из df[['A','B']].

Как подготовка данных может быть действительной в отношении разных чисел?Я не понимаю, как прогноз будет верным здесь.

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Лучший способ - обучить и сохранить модель MinMaxScaler и загрузить ее, когда это необходимо.

Сохранение модели:

df = pd.DataFrame({'A':[1,2,3,7,9,15,16,1,5,6,2,4,8,9],'B':[15,12,10,11,8,14,17,20,4,12,4,5,17,19],'C':['Y','Y','Y','Y','N','N','N','Y','N','Y','N','N','Y','Y']})
df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']])  
pickle.dump(min_max_scaler, open("scaler.pkl", 'wb'))

Загрузка сохраненной модели:

scalerObj = pickle.load(open("scaler.pkl", 'rb'))
df_test = pd.DataFrame({'A':[25,67,24,76,23],'B':[2,54,22,75,19]})
df_test[['A','B']] = scalerObj.transform(df_test[['A','B']])
0 голосов
/ 28 мая 2018

Вы должны подгонять MinMaxScaler, используя данные training, а затем применить масштабирование к данным testing перед прогнозом.


В итоге:

  • Шаг 1: установите scaler на TRAINING data
  • Шаг 2: используйте scaler до transform the training data
  • Шаг 3: используйтеtransformed training data до fit the predictive model
  • Шаг 4: используйте scaler до transform the TEST data
  • Шаг 5: predict, используя trained model и transformed TEST data

Пример использования ваших данных:

from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
#training data
df = pd.DataFrame({'A':[1,2,3,7,9,15,16,1,5,6,2,4,8,9],'B':[15,12,10,11,8,14,17,20,4,12,4,5,17,19],'C':['Y','Y','Y','Y','N','N','N','Y','N','Y','N','N','Y','Y']})
#fit and transform the training data and use them for the model training
df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']])
df['C'] = df['C'].apply(lambda x: 0 if x.strip()=='N' else 1)

#fit the model
model.fit(df['A','B'])

#after the model training on the transformed training data define the testing data df_test
df_test = pd.DataFrame({'A':[25,67,24,76,23],'B':[2,54,22,75,19]})

#before the prediction of the test data, ONLY APPLY the scaler on them
df_test[['A','B']] = min_max_scaler.transform(df_test[['A','B']])

#test the model
y_predicted_from_model = model.predict(df_test['A','B'])

Пример использования данных радужной оболочки:

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVC

data = datasets.load_iris()
X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)

model = SVC()
model.fit(X_train_scaled, y_train)

X_test_scaled = scaler.transform(X_test)
y_pred = model.predict(X_test_scaled)

Надеюсь, это поможет.

...