2016-12-16 4 views
0

Регрессия PLS с использованием sklearn дает очень плохие результаты прогнозирования. Когда я получаю модель, я не могу найти способ найти «перехват». Возможно, это влияет на предсказание модели? Матрица оценок и загрузок в порядке. Оформление коэффициентов также. В любом случае, как мне получить перехват с использованием уже полученных атрибутов?Как получить перехват PLS-регрессии (sklearn)

Этот код выдает коэффициенты переменных.

from pandas import DataFrame 
from sklearn.cross_decomposition import PLSRegression 

X = DataFrame({ 
     'x1': [0.0,1.0,2.0,2.0], 
     'x2': [0.0,0.0,2.0,5.0], 
     'x3': [1.0,0.0,2.0,4.0], 
    }, columns = ['x1', 'x2', 'x3']) 
Y = DataFrame({ 
     'y': [ -0.2, 1.1, 5.9, 12.3 ], 
    }, columns = ['y']) 

def regPLS1(X,Y): 
    _COMPS_ = len(X.columns) # all latent variables 
    model = PLSRegression(_COMPS_).fit(X, Y) 
    return model.coef_ 

В результате:

regPLS1(X,Y) 
>>> array([[ 0.84], [ 2.44], [-0.46]]) 

В дополнение к этим коэффициентам, величина перехвата является: 0,26. Что я делаю не так?

РЕДАКТИРОВАТЬ Правильный поставили (оценить) ответ Y_hat (точно так же, наблюдаемая Y):

Y_hat = [-0.2 1.1 5.9 12.3] 
+0

Как насчет предсказания '[0, 0, 0, 0]'? – MMF

+0

Я отредактировал свой ответ. Прогнозируемое значение (с использованием 3 VL) в точности соответствует наблюдаемому значению. – JonAnthrax

+0

Использование model.predict (X): – JonAnthrax

ответ

2

Для расчета использовать перехватывающие следующее:

plsModel = PLSRegression(_COMPS_).fit(X, Y) 

y_intercept = plsModel.y_mean_ - numpy.dot(plsModel.x_mean_ , plsModel.coef_) 

Я получил формулу непосредственно из R «PLS» пакет:

BInt[1,,i] <- object$Ymeans - object$Xmeans %*% B[,,i] 

Я проверил результаты и вычислил те же перехватывает в R «pls» и scikit-learn.

+0

С теми же данными? Версия Sklearn? ... – JonAnthrax

+0

Да, те же данные. sklearn 0.18.1. – Adam

+0

Да, теперь, генерируя полную модель, выведите предсказанные значения правильно. 'plsModel.predict (X)' предсказывает неправильно или не знает точно прогнозирует. Большое спасибо! – JonAnthrax

1

Исходя из моего чтения осуществления _PLS формула является Y = XB + Err, где model.coef_ является оценка B. Если вы посмотрите на метод predict, похоже, он использует установленный параметр y_mean_ как Err, поэтому я считаю, что это то, что вы хотите. Используйте model.y_mean_ вместо model.coef_. Надеюсь это поможет!

+0

Это правда, но я имею в виду константы прогностической модели. Как только все латентные переменные были получены. Я хотел бы знать, что такое модель в терминах констант и предикторов. Используя те же данные в R, я получаю как коэффициенты, так и перехват. И, очевидно, предсказание намного лучше. Я сделал это в R и вручную, используя алгоритм Гелади и Ковальского [«Частичная регрессия наименьших квадратов: учебник», Analytica Chimica Acta, 185 (1986)]. – JonAnthrax

+0

Чтобы уточнить. 'model.coef_' соответствует модели' B' в модели. 'model.y_mean_' соответствует' Err' (перехват) в них модели. Если вы получаете гораздо худшие результаты, возможно, вы обнаружили ошибку в реализации. Возможно, стоит попробовать выполнить R-реализацию и определить, используют ли они 'y_mean_' в качестве перехвата или нет. Если нет, вы можете подумать о отправке проблемы или исправления для sklearn. – mbecker

+0

ohhh ... да! Я использую два пакета («pls» и «plsdepot») для PLS-регрессии, и прогноз хорош. Очевидно, что значения предсказания [[2.07322661], [3.21992642], [5.62383293], [8.18301403]] далеки от наблюдаемых значений ... Как сообщить об ошибке в sklearn? – JonAnthrax