gpt4 book ai didi

python - 如何在流水线后对回归预测进行逆变换?

转载 作者:行者123 更新时间:2023-12-05 04:00:31 24 4
gpt4 key购买 nike

当我使用管道时,我正在尝试弄清楚如何取消缩放我的数据(大概使用 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)

最佳答案

简单说明

您的管道仅转换 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.]])

关于python - 如何在流水线后对回归预测进行逆变换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56133657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com