Python: Sklearn.linear_model.LinearRegression работает странно

#python #scikit-learn

#python #scikit-learn

Вопрос:

Я пытаюсь выполнить линейную регрессию с несколькими переменными. Но я нахожу, что sklearn.linear_model работает очень странно. Вот мой код:

 import numpy as np
from sklearn import linear_model

b = np.array([3,5,7]).transpose() ## the right answer I am expecting
x = np.array([[1,6,9],   ## 1*3   6*5   7*9 = 96
              [2,7,7],   ## 2*3   7*5   7*7 = 90
              [3,4,5]])  ## 3*3   4*5   5*7 = 64
y = np.array([96,90,64]).transpose()

clf = linear_model.LinearRegression()
clf.fit([[1,6,9],
         [2,7,7],
         [3,4,5]], [96,90,64])
print clf.coef_ ## <== it gives me [-2.2  5  4.4] NOT [3, 5, 7]
print np.dot(x, clf.coef_) ## <== it gives me [ 67.4  61.4  35.4]
 

Ответ №1:

Чтобы вернуть свои начальные коэффициенты, вам нужно использовать ключевое fit_intercept=False слово при построении линейной регрессии.

 import numpy as np
from sklearn import linear_model

b = np.array([3,5,7])
x = np.array([[1,6,9],  
              [2,7,7],   
              [3,4,5]])  
y = np.array([96,90,64])

clf = linear_model.LinearRegression(fit_intercept=False)
clf.fit(x, y)
print clf.coef_
print np.dot(x, clf.coef_)
 

Использование fit_intercept=False предотвращает LinearRegression работу с объектом x - x.mean(axis=0) , с которым он мог бы работать в противном случае (и фиксировать среднее значение с помощью постоянного смещения y = xb c ) — или, что эквивалентно, путем добавления столбца 1 to x .

В качестве дополнительного замечания, вызов transpose 1D-массива не имеет никакого эффекта (он меняет порядок ваших осей на противоположный, а у вас есть только одна).

Комментарии:

1. Большое вам спасибо! Как вы могли заметить такие детали, как это!