如何在旧的 MinMaxScaler 上重新调整新数据库? [复制]

Posted

技术标签:

【中文标题】如何在旧的 MinMaxScaler 上重新调整新数据库? [复制]【英文标题】:How to rescale new data base on old MinMaxScale? [duplicate] 【发布时间】:2020-04-21 20:03:37 【问题描述】:

我遇到了扩展新数据的问题。在我的方案中,我已经训练和测试了模型,所有 x_train 和 x_test 都使用 sklearn.MinMaxScaler() 进行了缩放。然后,应用到实时过程中,如何在训练和测试数据的相同规模下缩放新输入。 步骤如下

featuresData = df[features].values # Array of all features with the length of thousands
sc = MinMaxScaler(feature_range=(-1,1), copy=False)
featuresData = sc.fit_transform(featuresData)

#Running model to make the final model
model.fit(X,Y)
model.predict(X_test)

#Saving to abcxyz.h5

然后用新数据实现

#load the model abcxyz.h5
#catching new data 
#Scaling new data to put into the loaded model << I'm stucking in this step
#...

那么如何缩放新数据来预测然后逆变换到最终结果呢?根据我的逻辑,它需要在训练模型之前以与旧缩放器相同的方式进行缩放。

【问题讨论】:

【参考方案1】:

从你使用 scikit-learn 的方式来看,你需要已经保存了转换器:

import joblib
# ...
sc = MinMaxScaler(feature_range=(-1,1), copy=False)
featuresData = sc.fit_transform(featuresData)

joblib.dump(sc, 'sc.joblib') 

# with new data
sc = joblib.load('sc.joblib')
transformData = sc.transform(newData)
# ...

使用 scikit-learn 的最佳方式是将转换与模型合并。这样,您只需保存包含转换管道的模型。

from sklearn import svm
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import Pipeline


clf = svm.SVC(kernel='linear')
sc = MinMaxScaler(feature_range=(-1,1), copy=False)

model = Pipeline([('scaler', sc), ('svc', clf)])

#...

当您执行model.fit 时,模型首先会在引擎盖下为您的缩放器执行fit_transform。使用model.predict,您的缩放器的transform 将参与其中。

【讨论】:

【参考方案2】:

您应该使用fit()transform() 来执行以下操作:

# Lets say you read real times data as new_data

featuresData = df[features].values
sc = MinMaxScaler(feature_range=(-1,1), copy=False)
featuresData = sc.fit_transform(featuresData)
new_data = sc.transform(new_data)

sc.transform 将在 new_data 上应用与在 featuresData 上应用相同的比例。

【讨论】:

有什么方法可以保存第一次缩放的缩放参数吗?所以我不需要每次都有新数据时一次又一次地fit_transform 假设您在第一个输入中有 100 作为最大值。缩放后你得到 1。如果第二个输入中的最大值等于 1000,那么缩放后会得到什么值? 它不会在给定范围内缩放它。 1000 的缩放值将超过 MinMaxScaler 的给定缩放范围的顶部。 @MykolaZotko【参考方案3】:

考虑以下示例:

data1 = np.array([0, 1, 2, 3, 4, 5])
data2 = np.array([0, 2, 4, 6, 8, 10])

sc = MinMaxScaler()
sc.fit_transform(data1.reshape(-1, 1))

输出:

array([[0. ],
       [0.2],
       [0.4],
       [0.6],
       [0.8],
       [1. ]])

第二个数据集将在缩放后为您提供相同的值:

sc.fit_transform(data2.reshape(-1, 1))

输出:

array([[0. ],
       [0.2],
       [0.4],
       [0.6],
       [0.8],
       [1. ]])

让我们适应第一个数据集并为第二个数据集使用相同的缩放器:

sc.fit(data1.reshape(-1, 1))
sc.transform(data2.reshape(-1, 1)) 

输出:

array([[0. ],
       [0.4],
       [0.8],
       [1.2],
       [1.6],
       [2. ]])

【讨论】:

以上是关于如何在旧的 MinMaxScaler 上重新调整新数据库? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何网站搬家

如何使用 selenium 重新加载 html DOM,以便新命令能够定位新节点?

新 phpmyadmin 中的外键

如何在旧的反应组件中使用上下文?

防止软件包安装在旧的 Python 版本上

如何在旧的 AFNetworking 中使用 AFNetworking 2.0+?