Scikit学习缩放问题(inverse_transform)

时间:2018-09-15 15:11:54

标签: python machine-learning scikit-learn

希望有人在这里可以提供帮助,我正在努力使预测值恢复为“未缩放”值。我在sklearn.preprocessing中使用StandardScaler()。我的数据集是一个有4列的numpy数组(称为数据集)。

我已经尝试过:

# full dataset scaled, then split to 
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X,Y, test_size = 0.4) 

# model looks good but can't inverse_transform(Y_pred) obviously. 
Y_pred = adam.predict(X_test)

scaled X_train, X_test # individually 
# model comes out bad

scaled X_train, X_test, Y_train, Y_test # individually 
# model comes out bad

我是否以错误的方式应用缩放?

关于如何在比例模型运行中对Y_pred的比例进行逆变换的任何建议?

谢谢您的帮助!

2 个答案:

答案 0 :(得分:0)

这里是我用来缩放数据以用于LSTM模型的示例。数据集为开仓,最高,最低,关闭财务数据。该模型使用开盘价,最高价,最低价和关闭价的过去值来尝试预测将来某个时候的关闭价,因此需要缩放所有数据,但需要将输出关闭价反比例缩放为实际价格点。

首先根据要使用的缩放器实例化两个缩放器对象:

from sklearn.preprocessing import MinMaxScaler
import numpy as np

scaler = MinMaxScaler(feature_range = (0, 1))
scaler_single = MinMaxScaler(feature_range = (0, 1))

使用scaler转换打开,最高和最低数据,并使用scaler_single缩放关闭数据。然后通过连接结果构建缩放数据集。 ohlcv是Pandas DataFrame对象。

scaled_data = np.concatenate([scaler.fit_transform(ohlcv[['Open', 'High', 'Low']]), 
                                  scaler_single.fit_transform(ohlcv[['Close']])], axis = 1)

现在,为了反比例缩放输出的Close数据,请使用inverse_transform对象的scaler_single方法。 predicted_prices是我的模型返回的数组。

real_prices = scaler_single.inverse_transform(predicted_prices)

我希望有帮助。

答案 1 :(得分:0)

这是我的解决方法:

Update()

然后在测试/训练拆分并运行模型之后:

#standard scaler used to condition data
def scaler(x):
    mu = statistics.mean(x)
    stddev = statistics.stdev(x)
    standardized = (x-mu)/stddev
    return(standardized)

#Split data into X, Y and condition (X are the "features", Y is the forecasted/predicted price or "target")
Y = dataset[:,6]
ymu = statistics.mean(Y) #before scaler transform, get mean to inverse scaler transform after model
ystddev = statistics.stdev(Y) #before scaler transform, get stdev
Y = scaler(Y) #scale (i.e. condition/transform) forecasted price data
Xprice = dataset[:,4]
Xvolume = dataset[:,5]
Xprice = scaler(Xprice) #scale (i.e. condition/transform) price data
Xvolume = scaler(Xvolume) #scale (i.e. condition/transform) volume data
X = np.vstack((Xprice, Xvolume)).T #create 2D array of scale features

根据Y数据的实际规模和Y预测正确(据我所知),这产生了良好的结果。