多元OLS、PLS和RidgeRegression在多重共线性下系数差异的理解

2024-05-15 03:32:12 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好,我是python新手,多元回归模型中的多重共线性有问题。

我有两条传送带的日期,一条接一条,每小时“负荷”“速度”“能量”等等。我想了解能源性能。首先,我尝试了一个普通的最小二乘模型来得到系数。但我也可以看到,不同的输送机之间的系数是不同的。关键是其中一条皮带要小几米,它有一个将负载向上提升几米的方法。我计算出坡度为0.09。现在我想了解一下。所以,我在每一条皮带上都放了一个单独的列,并附加它们。我做了一个岭回归,当alpha为零时,我又得到了OLS回归。但我现在得到的系数令人惊讶。像以前一样对负载有很大的影响,甚至新的坡度如预期,但是现在皮带的速度对能量性能有负面影响。当发动机转速提高时,能量就会减少,这是很好的,但不可能的

在我看来,这可能是多重共线性的结果。所以我用了一个相关矩阵,但是斜率和速度之间没有相关性。所以我试着做一个偏最小二乘法,但是我得到的系数接近于零,但是另一方面,PLS模型给我返回X和Y,加载我期望的值,就像我的系数一样。你知道吗

我知道PLS通过y = x*coef +ERR估计Coefs。你知道吗

我想知道是否有可能得到错误值?是不是一个ERR值太大而不能得到“好”的系数? PLS是否有可能得到比OLS低得多的系数?PLS模型中的yœu载荷值是多少? 有没有其他模型可以用来检查能源性能? 谢谢你的帮助。你知道吗

##########  Partial Least Square Regression ######

PLSRegr = PLSRegression(n_components=2)
pls = PLSRegr.fit(X_train, Y_train)
pls_pred = pls.predict(X_test)

pls_meanSquaredError = mean_squared_error(Y_test, pls_pred)
print("PLS MSE:", pls_meanSquaredError)
pls_rootMeanSquaredError = sqrt(pls_meanSquaredError)
print("PLS RMSE:", pls_rootMeanSquaredError)

pls_mean = mean_absolute_error(Y_test, pls_pred)
print("PLS Mean_absolute Error:",pls_mean)

pls_r2 = r2_score(Y_test,pls_pred)
print("PLS R²", pls_r2)

print('PLS Coefficients: \n', PLSRegr.coef_)
print('PLS loadings: \n', PLSRegr.y_loadings_)
print('PLS loadings: \n', PLSRegr.x_loadings_)



##### Ridge Regression 

n_alphas = 10
alphas = np.logspace(-1.5, 2.5, n_alphas)


coefs = []
errors = []
error_pred = []
Rsquared = []
Rsquared_pred = []
scores = []
p = 6 # Number of Predictors
N = 14266 # Total sample Size


for a in alphas:
    ridge = KernelRidge(alpha=a, kernel='linear', coef0=0)

    ridge.fit(X_train, Y_train)

    KRR_pred = ridge.predict(X_train)   # Prediction Train
    rgr_pred = ridge.predict(X_test)    # Prediction Test
    print(KRR_pred)
    print(ridge.dual_coef_)

    print(np.dot(X_train.transpose(),ridge.dual_coef_))
    coefs.append(np.dot(X_train.transpose(),ridge.dual_coef_))

    Rsquared.append(ridge.score(X_train, Y_train))
    print("R² of Trainset:",Rsquared)

    Rsquared_pred.append(r2_score(Y_test,rgr_pred))
    print("R² of Prediction:", Rsquared_pred)

    Rsquaredadj = 1 - (((1-(r2_score(Y_test,rgr_pred)))*(N-1))/(N-p-1))
    print("Adj R²",Rsquaredadj)

    errors.append(mean_squared_error(ridge.dual_coef_,KRR_pred))
    errors2.append(mean_squared_error(ridge.dual_coef_,rgr_pred))   
    print('MSE of bias:', errors)

    error_pred.append(mean_squared_error(Y_test, rgr_pred))
    print("RGR MSE:", error_pred)

    mse = np.mean((rgr_pred - Y_test) ** 2)
    print("MSE check", mse)

coefs = np.array(coefs)
coefs = coefs.reshape(n_alphas, 6)
print('Coefficients: \n', coefs)
print('Alphas: \n',alphas)
print(KRR_pred)
print(ridge.dual_coef_)

Temp, Load, Tension, speed, Slope

PLS Results : 0.00, 0.11, -0.01, 0.02, 0.04

OLS/Ridge(Alpha=Zero) Results: -0.038,1.37,-0.067,-0.11,0.33

OLS Result without slope: -0.011, 1.11, -0.33, 0.40

我期望像without slope这样的值,但是在speed系数为正的脊线中“更小”,在PLS中结果更高


Tags: testtrainerrormeanprintridge系数pred

热门问题