首页 > 解决方案 > 如何在 Lasso 和 RobustScalar 之后对回归预测进行逆变换?

问题描述

我试图弄清楚如何在使用 RobustScalar 和 Lasso 之后对我的数据进行缩放(大概使用 inverse_transform)进行预测。下面的数据只是一个例子。我的实际数据更大更复杂,但我希望使用 RobustScaler(因为我的数据有异常值)和 Lasso(因为我的数据有几十个无用的特征)。

基本上,如果我尝试使用这个模型来预测任何东西,我想要以未缩放的术语进行预测。当我尝试使用示例数据点执行此操作时,我收到一个错误,似乎希望我取消缩放与训练子集大小相同的数据(也就是两个观察值)。我收到以下错误: ValueError: non-broadcastable output operand with shape (1,1) doesn't match the broadcast shape (1,2)

我怎样才能只取消一个预测?这可能吗?

import pandas as pd
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
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)

#Scale data
transformer = RobustScaler().fit(X_train)
transformer.transform(X_train)

X_rtrain = RobustScaler().fit_transform(X_train)
y_rtrain = RobustScaler().fit_transform(y_train)
X_rtest = RobustScaler().fit_transform(X_test)
y_rtest = RobustScaler().fit_transform(y_test)

#Fit Train Model
lasso = Lasso()
lasso_alg = lasso.fit(X_rtrain,y_rtrain)

train_score =lasso_alg.score(X_rtrain,y_rtrain)
test_score = lasso_alg.score(X_rtest,y_rtest)

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

#Predict example 
example = [[10,100]]
transformer.inverse_transform(lasso_alg.predict(example).reshape(-1, 1))

标签: pythonpython-3.xmachine-learningscikit-learn

解决方案


X 和 y不能使用相同的tranformer对象。在您的代码段中,您transformer是 X,即 2D,因此在转换预测结果时会出现错误,即 1D。(实际上你很幸运能得到一个错误;如果你的 X 是一维的,你会胡说八道)。

像这样的东西应该工作:

transformer_x = RobustScaler().fit(X_train)
transformer_y = RobustScaler().fit(y_train) 
X_rtrain = transformer_x.transform(X_train)
y_rtrain = transformer_y.transform(y_train)
X_rtest = transformer_x.transform(X_test)
y_rtest = transformer_y.transform(y_test)

#Fit Train Model
lasso = Lasso()
lasso_alg = lasso.fit(X_rtrain,y_rtrain)

train_score =lasso_alg.score(X_rtrain,y_rtrain)
test_score = lasso_alg.score(X_rtest,y_rtest)

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

example = [[10,100]]
transformer_y.inverse_transform(lasso.predict(example).reshape(-1, 1))

推荐阅读