当适合多个时,Sklearn inverse_transform仅返回一列

时间:2018-10-29 15:59:58

标签: python scikit-learn

当初始转换器适合整个数据集时,有没有办法用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变量安装一个转换器,但是,我想避免这种情况。这种方法将增加在以后的项目中移动缩放器并维护它们的复杂性。

3 个答案:

答案 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