Scikit узнать порядок коэффициентов для множественной линейной регрессии и полиномиальных признаков - PullRequest
0 голосов
/ 25 февраля 2019

Я подгоняю простую модель полиномиальной регрессии, и я хочу получить коэффициенты из подобранной модели.

Учитывая код подготовки:

import pandas as pd
from itertools import product
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline

# data creation
sa = [1, 0, 1, 2, 3]
sb = [2, 1, 0, 1, 2]
raw = {'a': [], 'b': [], 'w': []}
for (ai, av), (bi, bv) in product(enumerate(sa), enumerate(sb)):
    raw['a'].append(ai)
    raw['b'].append(bi)
    raw['w'].append(av + bv)
data = pd.DataFrame(raw)

# regression
x = data[['a', 'b']].values
y = data['w']
poly = PolynomialFeatures(2)
linr = LinearRegression()
model = make_pipeline(poly, linr)
model.fit(x, y)

Из этого ответа, я знаю, что коэффициенты могут быть получены с помощью

model.steps[1][1].coef_
>>> array([  0.00000000e+00,  -5.42857143e-01,  -1.71428571e+00,
             2.85714286e-01,   1.72774835e-16,   4.28571429e-01])

Но это дает одномерный массив, и я не уверен, какие числа соответствуют каким переменным.

Являются ли онизаказывается как a 0 , a 1 , a 2 , b 0 , b 1 ,b 2 или как a 0 , b 0 , a 1 , b 1 , а 2 , б 2 ?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете использовать get_feature_names() из PolynomialFeatures, чтобы узнать порядок.

В конвейере вы можете сделать это:

model.steps[0][1].get_feature_names()

# Output:
['1', 'x0', 'x1', 'x0^2', 'x0 x1', 'x1^2']

Еслиу вас есть названия функций («a», «b» в вашем случае), вы можете передать их для получения реальных функций.

model.steps[0][1].get_feature_names(['a', 'b'])

# Output:
['1', 'a', 'b', 'a^2', 'a b', 'b^2']
0 голосов
/ 25 февраля 2019

Во-первых, коэффициенты полинома степени 2 равны 1, a, b, a ^ 2, ab и b ^ 2, и они входят в этот порядок в реализации scikit-learn.Вы можете убедиться в этом, создав простой набор входных данных, например

x = np.array([[2, 3], [2, 3], [2, 3]])
print(x)
[[2 3]
 [2 3]
 [2 3]]

, а затем создав полиномиальные элементы:

poly = PolynomialFeatures(2)
x_poly = poly.fit_transform(x)
print(x_poly)
[[1. 2. 3. 4. 6. 9.]
 [1. 2. 3. 4. 6. 9.]
 [1. 2. 3. 4. 6. 9.]]

Вы можете видеть, что первая и вторая функцияb (без учета коэффициента смещения 1), третья особенность - это ^ 2 (то есть 2 ^ 2), четвертая - это ab = 2 * 3, а последняя - b ^ 2 = 3 ^ 2.то есть ваша модель:

enter image description here

...