Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在使用鲁棒定标器后,我可以对LASSO回归的截距和系数进行逆变换吗?_Python_Machine Learning_Lasso Regression - Fatal编程技术网

Python 在使用鲁棒定标器后,我可以对LASSO回归的截距和系数进行逆变换吗?

Python 在使用鲁棒定标器后,我可以对LASSO回归的截距和系数进行逆变换吗?,python,machine-learning,lasso-regression,Python,Machine Learning,Lasso Regression,在使用鲁棒定标器对缩放数据拟合模型后,是否可以对LASSO回归中的截距和系数进行逆变换 我使用LASSO回归来预测未规范化的数据的值,除非事先进行了缩放,否则LASSO的性能不好。在缩放数据并拟合LASSO模型后,理想情况下,我希望能够看到模型截距和系数是多少,但以原始单位(而不是缩放版本)为单位。我问了一个类似的问题,但似乎这是不可能的。若否,原因为何?有人能给我解释一下吗?我试图扩大我对套索和健壮定标器工作原理的理解 下面是我使用的代码。在这里,我尝试使用transformer_x对系数进行

在使用鲁棒定标器对缩放数据拟合模型后,是否可以对LASSO回归中的截距和系数进行逆变换

我使用LASSO回归来预测未规范化的数据的值,除非事先进行了缩放,否则LASSO的性能不好。在缩放数据并拟合LASSO模型后,理想情况下,我希望能够看到模型截距和系数是多少,但以原始单位(而不是缩放版本)为单位。我问了一个类似的问题,但似乎这是不可能的。若否,原因为何?有人能给我解释一下吗?我试图扩大我对套索和健壮定标器工作原理的理解

下面是我使用的代码。在这里,我尝试使用transformer_x对系数进行逆变换,使用transformer_y对截距进行逆变换。然而,听起来这是不正确的

将熊猫作为pd导入
从sklearn.preprocessing导入RobustScaler
从sklearn.linear_模型导入套索
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_标度)
def pred_val(X1、X2、X3、X4):
打印('X1输入:',X1)
#用户手动输入的缩放X值
中位数X=X.中位数()
Q1_X=X分位数(0.25)
Q3_X=X分位数(0.75)
IQR_X=Q3_X-Q1_X
X_标度=(X1-med_X)/IQR_X
打印('X1手动缩放:',X_缩放[0]。圆形(2))
#用户输入的缩放X值-按函数
X_scaled2=变换器X.变换(np.数组([[X1,X2]]))
打印('X1按函数缩放:',X_缩放2[0][0]。四舍五入(2))
#人工拦截
中位数y=y.中位数()
Q1_y=y分位数(0.25)
Q3_y=y分位数(0.75)
IQR_y=Q3_y-Q1_y
inv_int=med_y+IQR_y*套索截距[0]
#函数截取
inv_int2=变压器y.逆变换(套索截距整形(-1,1))[0][0]
#手工系数
inv_coef=lasso.coef[0]*IQR\u y
#函数系数
inv_coef2=变压器x.逆变换(调节系数重塑(1,-1))[0]
#人工预测
preds=库存量+库存系数*X\u比例[0]
#函数预测
preds_inner=lasso.predict(X_scaled2)
preds_f=变压器y.逆变换(preds_内部.整形(-1,1))[0][0]
打印(“\n手工接收:”,库存[0]。第二轮)
打印('按函数截取:',inv_int2.round(2))
打印(“\n手工效率:”,库存系数[0]。四舍五入(2))
打印('按函数计算的系数:',inv_coef2[0]。四舍五入(2))
打印('\n手动预测值为:',预测值[0]。四舍五入(2))
打印('按函数计算的预测值为:',预舍入(2))
打印('完美预测值为80')
预测值(10,1,1,1)
更新:我已经更新了代码,以显示我试图创建的预测函数的类型。我只是想创建一个函数,它能准确地实现
.predict
的功能,但也能以无标度单位显示截距和系数

电流输出:

Out[1]:
X1 entered:  10
X1 scaled by hand:  5.97
X1 scaled by function:  5.97

Intercept by hand:  34.19
Intercept by function:  34.19

Coefficients by hand:  7.6
Coefficients by function:  8.5

Your predicted value by hand is:  79.54
Your predicted value by function is:  79.54
Perfect Prediction would be 80
理想输出:

Out[1]:
X1 entered:  10
X1 scaled by hand:  5.97
X1 scaled by function:  5.97

Intercept by hand:  34.19
Intercept by function:  34.19

Coefficients by hand:  7.6
Coefficients by function:  7.6

Your predicted value by hand is:  79.54
Your predicted value by function is:  79.54
Perfect Prediction would be 80

基于链接的SO线程,您只需获得未缩放的预测值。是这样吗

如果是,那么您需要做的就是:

# Scale the test dataset
X_test_scaled = transformer_x.transform(X_test)

# Predict with the trained model
prediction = lasso.predict(X_test_scaled)

# Inverse transform the prediction
prediction_in_dollars = transformer_y.inverse_transform(prediction)
更新:

假设列车数据仅包含一个名为
X
的特征。以下是RobustScaler将执行的操作:

X_scaled = (X - median(X))/IQR(X)
y_scaled = (y - median(y))/IQR(y)
然后,套索回归将给出如下预测:

a * X_scaled + b = y_scaled
您必须计算出方程式,以查看未标度数据上的模型系数:

# Substituting X_scaled and y_scaled from the 1st equation
# In this equation `median(X), IQR(X), median(y) and IQR(y) are plain numbers you already know from the training phase
a * (X - median(X))/IQR(X) + b = (y - median(y))/IQR(y)
如果你试图从这个方程中得到一个类似于a_new*x+b_new=y的方程,你最终会得到:

a_new = (a * (X - median(X)) / (X * IQR(X))) * IQR(y)
b_new = b * IQR(y) + median(y)
a_new * X + b_new = y
您可以看到未标度系数(
a_new
)取决于
X
。因此,您可以使用未缩放的
X
直接进行预测,但在这两者之间,您将间接应用转换

更新2

我已经修改了您的代码,现在它显示了如何在原始比例下获得系数。这个脚本只是我上面展示的公式的实现

import pandas as pd
import numpy as np
from sklearn.preprocessing import RobustScaler
from sklearn.linear_model import Lasso

df = pd.DataFrame({'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']]

#Scaling
transformer_x = RobustScaler().fit(X)
transformer_y = RobustScaler().fit(y)
X_scal = transformer_x.transform(X)
y_scal = transformer_y.transform(y)

#LASSO
lasso = Lasso()
lasso = lasso.fit(X_scal, y_scal)

def pred_val(X_test):

    print('X entered: ',)
    print (X_test.values[0])

    #Scale X value that user entered - by hand
    med_X = X.median()
    Q1_X = X.quantile(0.25)
    Q3_X = X.quantile(0.75)
    IQR_X = Q3_X - Q1_X
    X_scaled = ((X_test - med_X)/IQR_X).fillna(0).values
    print('X_test scaled by hand: ',)
    print (X_scaled[0])

    #Scale X value that user entered - by function
    X_scaled2 = transformer_x.transform(X_test)
    print('X_test scaled by function: ',)
    print (X_scaled2[0])

    #Intercept by hand
    med_y = y.median()
    Q1_y = y.quantile(0.25)
    Q3_y = y.quantile(0.75)
    IQR_y = Q3_y - Q1_y

    a = lasso.coef_
    coef_new = ((a * (X_test - med_X).values) / (X_test * IQR_X).values) * float(IQR_y)
    coef_new = np.nan_to_num(coef_new)[0]

    b = lasso.intercept_[0]
    intercept_new = b * float(IQR_y) + float(med_y)

    custom_pred = sum((coef_new * X_test.values)[0]) + intercept_new

    pred = lasso.predict(X_scaled2)
    final_pred = transformer_y.inverse_transform(pred.reshape(-1, 1))[0][0]


    print('Original intercept: ', lasso.intercept_[0].round(2))
    print('New intercept: ', intercept_new.round(2))
    print('Original coefficients: ', lasso.coef_.round(2))
    print('New coefficients: ', coef_new.round(2))
    print('Your predicted value by function is: ', final_pred.round(2))
    print('Your predicted value by hand is: ', custom_pred.round(2))


X_test = pd.DataFrame([10,1,1,1]).T
X_test.columns = ['X1', 'X2', 'X3', 'X4']

pred_val(X_test)
您可以看到,自定义预测使用原始值(
X\u test.values

结果:

X entered: 
[10  1  1  1]

X_test scaled by hand: 
[ 5.96774194  0.         -6.66666667 -1.        ]
X_test scaled by function: 
[ 5.96774194  0.         -6.66666667 -1.        ]

Original intercept:  0.01
New intercept:  3.83

Original coefficients:  [ 0.02  0.   -0.   -0.  ]
New coefficients:  [0.1 0.  0.  0. ]

Your predicted value by function is:  4.83
Your predicted value by hand is:  4.83

如上所述,新系数取决于
X_测试
。这意味着您不能将其当前值用于其他测试样本。对于不同的输入,它们的值将不同。

为了澄清:您希望系数和截距以原始单位表示,还是希望预测以原始单位表示(如斯特吉奥斯的回答)?我希望系数和截距以原始单位表示,如果您有以美元表示的预测值,并且X值以[yr,m^2,USD]表示(例如)你想要以美元/年、美元/平方米和纯数字表示的系数,以及以美元表示的截距?@Itamar Mushkin很抱歉,但我不太理解你的问题。我想要以原始单位表示的系数,是的。我希望以原始单位表示的系数和截距,而不是预测值。一旦我得到了未标度系数和截距tercept,我可以通过y=无标度截距+(无标度系数*X无标度)来预测值吗?请检查我上面的答案,说明你如何做到这一点。顺便问一下,你为什么要反转系数?最终目标是什么?对不起,我检查了你的答案,但我仍然不确定如何取消系数的缩放。当我做lasso.coef_u*IQR_y时,我得到的系数与我原来使用逆变换函数。这是为什么?(另外,我在这里的最终目标是简单地看看LASSO是如何预测值的,这在什么时候也很难看到