流水线后如何逆变换回归预测?

时间:2019-05-14 15:12:15

标签: python python-3.x machine-learning pipeline lasso

我正在尝试弄清楚如何在使用管道时对数据进行缩放(大概使用inverse_transform)进行预测。以下数据仅是示例。我的实际数据更大,更复杂,但是我希望使用RobustScaler(因为我的数据有异常值)和Lasso(因为我的数据具有许多无用的功能)。我是管道的新手。

基本上,如果我尝试使用此模型进行任何预测,则希望以无标度的术语进行该预测。管道有可能吗?如何使用inverse_transform做到这一点?

import pandas as pd
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import RobustScaler

data = [[100, 1, 50],[500 , 3, 25],[1000 , 10, 100]]
df = pd.DataFrame(data,columns=['Cost','People', 'Supplies'])

X = df[['People', 'Supplies']]
y = df[['Cost']]

#Split
X_train,X_test,y_train,y_test = train_test_split(X,y)

#Pipeline
pipeline = Pipeline([('scale', RobustScaler()),
            ('alg', Lasso())])

clf = pipeline.fit(X_train,y_train)

train_score = clf.score(X_train,y_train)
test_score = clf.score(X_test,y_test)

print ("training score:", train_score)
print ("test score:", test_score)

#Predict example 
example = [[10,100]]
clf.predict(example)

1 个答案:

答案 0 :(得分:0)

简单说明

您的管道仅转换 X 中的值,而不是 y。您在 y 中看到的预测差异与使用缩放数据与未缩放数据拟合的两个模型之间的系数值差异有关。

因此,如果您“希望以未缩放的方式进行预测”,则将缩放器从您的管道中移除。如果您希望以 缩放 术语进行预测,则需要在将新预测数据传递给 .predict() 函数之前对其进行缩放。如果您在其中包含了缩放步骤,则流水线实际上会自动为您执行此操作。

缩放和回归

此处缩放的实际目的是当人和用品具有不同的动态范围时。使用 RobustScaler() 删除中值并根据分位数范围缩放数据。通常,只有当您认为您的人员或供应数据具有会以负面方式影响样本均值/方差的异常值时,您才会这样做。如果不是这种情况,您可能会使用 StandardScaler() 去除均值并缩放到单位方差。

数据缩放后,您可以比较回归系数以更好地了解模型如何进行预测。这很重要,因为未缩放数据的系数可能会产生误导。

使用代码的示例

以下示例显示:

  1. 使用和不使用管道的缩放和未缩放数据的预测。

  2. 两种情况下的预测都匹配。

  3. 您可以通过查看非管道示例了解管道在后台执行的操作。

  4. 我还在这两种情况下都包含了模型系数。请注意,缩放拟合模型与未缩放拟合模型的系数或权重非常不同。

  5. 这些系数用于为变量example生成每个预测值。

    <块引用>
    import pandas as pd
    from sklearn.linear_model import Lasso
    from sklearn.model_selection import train_test_split
    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import RobustScaler
    
    data = [[100, 1, 50],[500 , 3, 25],[1000 , 10, 100]]
    df = pd.DataFrame(data,columns=['Cost','People', 'Supplies'])
    
    X = df[['People', 'Supplies']]
    y = df[['Cost']]
    
    #Split
    X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0)
    
    #Pipeline
    pipeline_scaled = Pipeline([('scale', RobustScaler()),
                         ('alg', Lasso(random_state=0))])
    
    pipeline_unscaled = Pipeline([('alg', Lasso(random_state=0))])
    
    clf1 = pipeline_scaled.fit(X_train,y_train)
    clf2 = pipeline_unscaled.fit(X_train,y_train)
    
    
    #Pipeline predict example 
    example = [[10,100]]
    print('Pipe Scaled: ', clf1.predict(example))
    print('Pipe Unscaled: ',clf2.predict(example))
    
    #------------------------------------------------
    
    rs = RobustScaler()
    reg = Lasso(random_state=0)
    # Scale the taining data 
    X_train_scaled = rs.fit_transform(X_train)
    reg.fit(X_train_scaled, y_train)
    # Scale the example
    example_scaled = rs.transform(example)
    # Predict using the scaled data
    print('----------------------')
    print('Reg Scaled: ', reg.predict(example_scaled))
    print('Scaled Coefficents:',reg.coef_)
    
    #------------------------------------------------
    reg.fit(X_train, y_train)
    print('Reg Unscaled: ', reg.predict(example))
    print('Unscaled Coefficents:',reg.coef_)
    

输出:

<块引用>
Pipe Scaled:  [1892.]
Pipe Unscaled:  [-699.6]
----------------------
Reg Scaled:  [1892.]
Scaled Coefficents: [199.  -0.]
Reg Unscaled:  [-699.6]
Unscaled Coefficents: [  0.     -15.9936]

为了完整性

您最初的问题是关于“取消缩放”您的数据。我认为这不是您真正需要的,因为 X_train 是您未缩放的数据。但是,以下示例展示了如何使用管道中的缩放器对象来执行此操作。

#------------------------------------------------
pipeline_scaled['scale'].inverse_transform(X_train_scaled)

输出

<块引用>
array([[ 3., 25.],
       [ 1., 50.]])