python - 如何在 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))
解决方案
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))
推荐阅读
- linux - 从远程网站下载 PDF 文件
- laravel - 如何将数据发送到 laravel voyager 管理面板中的自定义按钮
- c# - 如何在通知期间调用 XAMARIN iOS 中的 AVPlayer 而不是 30 秒的最大持续时间通知声音?
- c - GTK_TOGGLE_BUTTON() 宏期间的段错误。更改复选框状态后更改的指针值
- firebase - Firebase:FieldValue.arrayUnion 与对象
- ios - UICollectionView 在 iOS 11 上覆盖全屏
- r - 在 R 中进行子集化后保留列表元素名称
- react-native - 配置branch.io后,ios构建失败,抛出node_modules/react-native-branch/ios/Branch-SDK/Fabric/Fabric.h:没有这样的文件或目录
- firebase - Firestore 规则限制用户只能读/写他们的数据
- node.js - 当会话在 Angular 和 nodejs 中过期时,我想在登录页面上重定向