Python 如何用Lasso和RobustScalar建立预测函数?

Python 如何用Lasso和RobustScalar建立预测函数?,python,machine-learning,scikit-learn,lasso-regression,Python,Machine Learning,Scikit Learn,Lasso Regression,我正试图找出如何使用LASSO回归预测值,而不使用Sklearn提供的.predict函数。这基本上只是为了扩大我对套索内部工作原理的理解。我问了一个关于LASSO回归如何工作的问题,其中一个评论提到了预测函数如何与线性回归中的函数一样工作。正因为如此,我想尝试制作自己的函数来实现这一点 我能够在更简单的示例中成功地重新创建predict函数,但是当我尝试将它与RobustScaler结合使用时,我不断得到不同的输出。在这个例子中,我用Sklearn得到的预测值为4.33,用我自己的函数得到的预

我正试图找出如何使用LASSO回归预测值,而不使用Sklearn提供的
.predict
函数。这基本上只是为了扩大我对套索内部工作原理的理解。我问了一个关于LASSO回归如何工作的问题,其中一个评论提到了预测函数如何与线性回归中的函数一样工作。正因为如此,我想尝试制作自己的函数来实现这一点

我能够在更简单的示例中成功地重新创建predict函数,但是当我尝试将它与
RobustScaler
结合使用时,我不断得到不同的输出。在这个例子中,我用Sklearn得到的预测值为4.33,用我自己的函数得到的预测值为6.18。我错过了什么?我不是在最后对预测进行了正确的反变换吗

将熊猫作为pd导入
从sklearn.preprocessing导入RobustScaler
从sklearn.linear_模型导入套索
将numpy作为np导入
df=pd.数据帧({'Y':[5,-10,10,5,2.5,15],'X1':[1.,-2,2.,.1,5,3],'X2':[1,1,2,1,1,1],
‘X3’:[6,6,6,5,6,4],‘X4’:[6,5,4,3,2,1]})
X=df[['X1','X2','X3','X4']]
y=df[['y']]
#缩放
transformer_x=RobustScaler().fit(x)
transformer_y=RobustScaler().fit(y)
X_scal=变压器X.变换(X)
y_scal=变压器y.变换(y)
#套索
套索
套索=套索拟合(X_标度,y_标度)
#套索信息
打印('分数:',套索分数(X刻度,y刻度))
打印('Raw Intercept:',套索截距(2)[0])
截距=变压器y.逆变换([lasso.截距][0][0]
打印('未缩放截距:',截距)
打印(“\n使用的效率:”)
coeff_数组=lasso.coef_
逆系数数组=变换器逆变换(套索系数整形(1,-1))[0]
对于zip中的i、j、k(X列、系数数组、逆系数数组):
如果j!=0:
印刷品(i、j圆(2)、k圆(2))
#预言
示例=[[3,1,1,1]]
pred=套索预测(示例)
pred_scal=变压器y.逆变换(pred.重塑(-1,1))
打印('\nRaw预测,其中X1=3:',pred[0])
打印('X1=3:'的无标度预测,预测标度[0][0])
#不使用.predict函数的预测
定义套索预测值(X1、X2、X3、X4):
打印('截取:',截取)
打印('coef:',逆系数数组[0])
打印('X1:',X1)
preds=截距+逆系数数组[0]*X1
打印('您的预测值为:',preds)
套索预测值(3,1,1,1)

无论给定数据点是否缩放,经过训练的
套索
都没有任何信息。因此,手动进行预测的方法不应考虑缩放方面

如果我删除您对模型系数的处理,我们可以得到sklearn模型的结果


example = [[3,1,1,1]]
lasso.predict(example)

# array([0.07533937])


#Predictions without using the .predict function 
def lasso_predict_value_(X1,X2,X3,X4): 
    x_test = np.array([X1,X2, X3, X4])
    preds = lasso.intercept_ + sum(x_test*lasso.coef_)
    print('Your predicted value is: ', preds)


lasso_predict_value_(3,1,1,1)

# Your predicted value is:  [0.07533937]

更新2: 一旦我使用套索,我需要看看我的预测在他们的 原始单位。我的因变量是美元金额,如果我 不要把它反变换回来,我看不出我花了多少美元 预测的必要性

这是一个非常有效的场景。您需要应用
transformer\u y.inverse\u transform
来获取未催款的美元金额值。无需干扰模型权重

更新示例

example = [[3,1,1,1]]
scaled_pred = lasso.predict(transformer_x.transform(example))
transformer_y.inverse_transform([scaled_pred])
# array([[4.07460407]])

#Predictions without using the .predict function 
def lasso_predict_value_(X1,X2,X3,X4): 
    x_test = transformer_x.transform(np.array([X1,X2, X3, X4]).reshape(1,-1))[0]
    preds = lasso.intercept_ + sum(x_test*lasso.coef_)
    print('Your predicted value is: ', preds)
    print('Your unscaled predicted value is: ', 
          transformer_y.inverse_transform([scaled_pred]))


lasso_predict_value_(3,1,1,1)
# Your predicted value is:  [0.0418844]    
# Your unscaled predicted value is:  [[4.07460407]]

所以我已经知道怎么做这部分了。如何处理缩放数据?缩放数据,然后应用模型系数。请找到我的最新答案。希望对你有帮助,教授,也许我不太清楚。我想在最后取消预测的比例,这就是为什么我在代码中使用了逆_变换,但得到了不同的结果。如何使用套索在缩放数据上预测未来值,然后在最后取消缩放预测值?另外,请注意。我看到你用transformer_x来缩放预测。我一直在使用transformer_y,这是一个值得怀疑的问题。我应该用transformer_x来代替吗?所以不可能对系数进行逆变换或者对套索模型进行截距?我需要在拟合模型之前缩放数据,这仅仅是因为我的数据没有标准化,而LASSO在没有缩放的情况下表现非常差。一旦我使用套索,我需要看看我的预测是什么,在他们的原始单位。我的因变量是以美元为单位的,如果我不把它反变换回来,我就看不出预测需要多少美元。