当初始转换器适合整个数据集时,有没有办法用sklearn对一列进行逆转换?以下是我想要得到的示例。
import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
# Setting up a dummy pipeline
pipes = []
pipes.append(('scaler', MinMaxScaler()))
transformation_pipeline = Pipeline(pipes)
# Random data.
df = pd.DataFrame(
{'data1': [1, 2, 3, 1, 2, 3],
'data2': [1, 1, 1, 2, 2, 2],
'Y': [1, 4, 1, 2, 2, 2]
}
)
# Fitting the transformation pipeline
test = transformation_pipeline.fit_transform(df)
# Pulling the scaler function from the pipeline.
scaler = transformation_pipeline.named_steps['scaler']
# This is what I thought may work.
predicted_transformed = scaler.inverse_transform(test['Y'])
# The output would look something like this
# Essentially overlooking that scaler was fit on 3 variables and fitting
# the last one, or any I need.
predicted_transfromed = [1, 4, 1, 2, 2, 2]
作为数据准备过程的一部分,我需要能够适应整个数据集。但是后来我使用sklearn.externals joblibs将缩放器导入另一个实例。在这种新情况下,预测值是唯一存在的东西。因此,我只需要提取Y列的反比例缩放器即可返回原始图像。
我知道我可以为X变量和Y变量安装一个转换器,但是,我想避免这种情况。这种方法将增加在以后的项目中移动缩放器并维护它们的复杂性。
答案 0 :(得分:1)
有点晚了,但是我认为这段代码可以满足您的需求:
# - scaler = the scaler object (it needs an inverse_transform method)
# - data = the data to be inverse transformed as a Series, ndarray, ...
# (a 1d object you can assign to a df column)
# - ftName = the name of the column to which the data belongs
# - colNames = all column names of the data on which scaler was fit
# (necessary because scaler will only accept a df of the same shape as the one it was fit on)
def invTransform(scaler, data, colName, colNames):
dummy = pd.DataFrame(np.zeros((len(data), len(colNames))), columns=colNames)
dummy[colName] = data
dummy = pd.DataFrame(scaler.inverse_transform(dummy), columns=colNames)
return dummy[colName].values
请注意,您需要提供足够的信息才能在幕后使用inverse_transform
对象的scaler
方法。
答案 1 :(得分:0)
类似的问题。我有一个多维时间序列作为输入(一个数量和“外生”变量),一个维度(一个数量)作为输出。由于缩放器需要多维输入,因此我无法反转缩放比例以将预测与原始测试集进行比较。
我能想到的一种解决方案是为数量和外部列使用单独的缩放器。
我能想到的另一种解决方案是给定标器足够的“垃圾”列,以填充未缩放的数组的大小,然后仅查看输出的第一列。
然后,一旦我进行预测,就可以对预测值进行换算以获取可以与测试集进行比较的值。
答案 2 :(得分:0)
改进威廉的话。这样可以减少输入。
def invTransform(scaler, data):
dummy = pd.DataFrame(np.zeros((len(data), scaler.n_features_in_)))
dummy[0] = data
dummy = pd.DataFrame(scaler.inverse_transform(dummy), columns=dummy.columns)
return dummy[0].values