【问题标题】:How to normalize the Train and Test data using MinMaxScaler sklearn如何使用 MinMaxScaler sklearn 标准化训练和测试数据
【发布时间】:2018-11-07 00:31:27
【问题描述】:

所以,我有这个疑问,一直在寻找答案。所以问题是我什么时候使用,

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]})

因为当我对列进行规范化时,AB 的值将根据新数据而不是模型将要训练的数据进行更改。 所以,现在我的数据在下面的数据准备步骤之后,将是。

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

AB 的值将相对于 df[['A','B']]MaxMin 值发生变化。 df[['A','B']] 的数据准备是相对于df[['A','B']]Min Max

数据准备如何对不同的数字关联有效?我不明白这里的预测如何正确。

【问题讨论】:

  • 如果您想使用经过训练的模型,您将不得不使用相同的缩放器。保存缩放器并重新应用它。

标签: python machine-learning scikit-learn normalization sklearn-pandas


【解决方案1】:

您应该使用training 数据拟合MinMaxScaler,然后在预测之前对testing 数据应用缩放器。


总结:

  • 第 1 步:将scaler 安装在TRAINING data
  • 第2步:使用scalertransform the TRAINING data
  • 第3步:使用transformed training datafit the predictive model
  • 第4步:使用scalertransform the TEST data
  • 第 5 步:predict 使用 trained model(第 3 步)和 transformed TEST data(第 4 步)。

使用您的数据的示例:

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)

希望这会有所帮助。

另请参阅此处的帖子: https://towardsdatascience.com/everything-you-need-to-know-about-min-max-normalization-in-python-b79592732b79

【讨论】:

  • 这很有帮助,谢谢,我想知道 transform() 在新数据帧上的工作原理是什么? df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']]) 这里的 minmax 缩放器使用公式 Xnorm = X-Xmin/Xmax-Xmin df_test[['A','B']] = min_max_scaler.transform(df_test[['A','B']]) 在这里,它没有使用那个公式,所以,究竟是数据在这里缩放?使用什么公式?上面的输出是,
  • 它使用了训练集中的X_minX_max(用于拟合min_max_scaler的那个)
  • @Tia 这里,XminXmax 是从训练集计算出来的,然后对训练数据进行归一化,最后使用相同的值对测试数据进行归一化。
  • @seralouk 如果 y_train 数据也有很大的规模怎么办?预测后应该如何纠正?在这种情况下,最好的方法是什么?
  • MinMaxScaler 是否假定训练数据将包含 X 的最大值?如果我的测试集或未来的预测数据集包含的值比 MinMaxScaler 适合的值大得多怎么办?它能处理吗?
【解决方案2】:

最好的方法是训练并保存 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']])

【讨论】:

    猜你喜欢
    • 2016-12-11
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2018-07-08
    • 2019-08-01
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多