Привет, ребята, я новичок в Python, и у меня проблема с мультиколлинеарностью внутри многомерной регрессионной модели.
У меня есть дата двух конвейерных лент один за другим с «нагрузкой», «скоростью», «энергией» и т. Д. В час. Я хочу понять энергетические показатели. Сначала я попробовал обычную модель наименьших квадратов, чтобы получить коэффициенты. Но я также мог видеть, что коэффициенты у разных конвейеров разные. Дело в том, что один из ремней на несколько метров меньше, и он должен поднять нагрузку на несколько метров вверх. Я рассчитал уклон 0,09. Теперь я хочу получить информацию об этом. Итак, я вставляю отдельную колонку в каждый пояс и добавляю их. Я сделал регрессию Риджа, зная, что когда альфа равна нулю, у меня снова регрессия OLS . Но коэффициенты, которые я получаю сейчас, удивляют. Как и раньше, нагрузка оказывает большое влияние и даже новый уклон, как и ожидалось, но скорость ленты в настоящее время негативно влияет на энергетические характеристики. Было бы здорово, но невозможно, чтобы при увеличении частоты вращения двигателя уменьшалась энергия…
По моему мнению, это может быть результатом мультиколлинеарности. Поэтому я использовал Матрицу корреляции, но между наклоном и скоростью нет корреляций. Поэтому я попытался сделать частичные наименьшие квадраты, но коэффициенты, которые я там получаю, близки к нулю, но с другой стороны, модель PLS возвращает мне значения X и Y_loading со значениями, которые я ожидаю, так как мои коэффициенты будут выглядеть.
Я знаю, что PLS оценил Coefs на y = x*coef +ERR
.
Я хочу знать, есть ли возможность получить значения ERR? Может ли значение ERR быть слишком большим, чтобы получить «хорошие» коэффициенты?
Можно ли получить гораздо более низкие коэффициенты по PLS, чем по OLS? Каковы значения y_loadings внутри модели PLS?
и есть ли другая модель, которую вы бы использовали для проверки производительности энергии?
Спасибо за вашу помощь.
########## 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_)
Температура, нагрузка, напряжение, скорость, уклон
PLS Результаты: 0,00, 0,11, -0,01, 0,02, 0,04
OLS / Ridge (Alpha = Zero) Результаты: -0,038,1,37, -0,067, -0,11,0,33
OLS Результат без наклона: -0,011, 1,11, -0,33, 0,40
Я ожидаю такие значения, как without slope
, но "меньше" в Ридже с положительным speed
Коэффициент и более высокие результаты в PLS