Примените коэффициенты из полинома n степени к формуле

#python #numpy #scikit-learn #scipy

Вопрос:

Я использую LinearRegression() оценку sklearn с 5 переменными

 ['feat1', 'feat2', 'feat3', 'feat4', 'feat5']  

Для того, чтобы предсказать непрерывное значение.

Оценщик возвращает список значений коэффициентов и смещение:

 linear = LinearRegression() print(linear.coef_) print(linear.intercept_)  [ 0.18799409 -0.05406106 -0.01327966 -0.13348129 -0.00614054] -0.011064865422734674  

Затем, учитывая тот факт, что у меня есть каждая функция в качестве переменных, я могу жестко закодировать коэффициенты в линейную формулу и оценить свои значения, например так:

 val = ((0.18799409*feat1) - (0.05406106*feat2) - (0.01327966*feat3) - (0.13348129*feat4) - (0.00614054*feat5)) -0.011064865422734674  

Теперь предположим, что я использую полиномиальную регрессию степени 2, используя конвейер и распечатав:

 model = Pipeline(steps=[  ('scaler',StandardScaler()),  ('polynomial_features', PolynomialFeatures(degree=degree, include_bias=False)),   ('linear_regression', LinearRegression())])  #fit model model.fit(X_train, y_train)  print(model['linear_regression'].coef_) print(model['linear_regression'].intercept_)  

Я получаю:

 [ 7.06524186e-01 -2.98605001e-02 -4.67175212e-02 -4.86890790e-01  -1.06320101e-02 -2.77958604e-03 -3.38253025e-04 -7.80563090e-03  4.51356888e-03 8.32036733e-03 3.57638244e-02 -2.16446849e-02  -7.92169287e-02 3.36809467e-02 -6.60531497e-03 2.16613331e-02  2.10097993e-02 3.49970303e-02 -3.02970698e-02 -7.81462599e-03] 0.011042927069084668  

Как мне преобразовать приведенную выше формулу, чтобы рассчитать val из регрессии , со значениями из .coef_ и .intercept_ , используя индексацию массива вместо жесткого кодирования значений, для любой степени «n»?

Есть ли какой scipy -либо метод или numpy метод, подходящий для этого?

Ответ №1:

Важно отметить, что полиномиальная регрессия-это просто расширенный случай линейной регрессии, поэтому все, что нам нужно, — это последовательно преобразовывать наши входные данные. Для любого N, которое мы можем использовать PolynomialFeatures sklearn.preprocessing. с использованием фиктивных данных, мы можем увидеть, как это будет работать:

 import numpy as np from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures #set parameters X = np.stack([np.arange(i,i 10) for i in range(5)]).T Y = np.random.randn(10)*10 3 N = 2  poly_reg=PolynomialFeatures(degree=N,include_bias=False) X_poly=poly_reg.fit_transform(X)  #print(X[0],X_poly[0]) #to check parameters, note that it includes the y intercept as an input of 1  poly = LinearRegression().fit(X_poly, Y)  

И таким образом, мы можем получить коэффициент, как вы делали это раньше, и просто выполнить умножение матрицы, чтобы получить регрессированное значение.

 new_dat = poly_reg.transform(np.arange(2,2 10,2)[None]) #5 new datapoints  np.testing.assert_array_equal(poly.predict(new_dat),new_dat @ poly.coef_   poly.intercept_)  

—-РЕДАКТИРОВАТЬ—-

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

 new_feats = np.array([feat1,feat2,feat3,feat4,feat5])  from itertools import combinations_with_replacement def gen_poly_feats(x,N):  #this function returns all unique groupings (w/ replacement) of the indices into the array x for use in polynomial regression.  return np.concatenate([[np.product(x[np.array(i)]) for i in list(combinations_with_replacement(range(len(x)), n))] for n in range(1,N 1)])[None]  new_feats_poly = gen_poly_feats(new_feats,N) # just to be sure that this matches... np.testing.assert_array_equal(new_feats_poly,poly_reg.transform(new_feats[None])) #then we can use the above linear regression model to predict the new data val = new_feats_poly @ poly.coef_   poly.intercept_  

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

1. val соответствуют будущим значениям, недоступным на момент подгонки регрессии. ты это имеешь в виду new_dat ?

2. new_dat это просто некоторые новые данные того же размера/типа, что и данные обучения X .

3. Я немного запутался, потому что на самом деле я использую конвейер(), из-за которого значения немного неудобно извлекать либо из препроцессора, либо из оценщиков. . Может быть, ты адаптируешь свой ответ, и я назначу тебе награду. Я отредактировал вопрос, чтобы сделать его более полным

4. Отредактировал свой ответ, хотя я не уверен на 100%, почему бы вам просто не использовать функцию sklearn PolynomialFeatures . В любом случае, надеюсь, сейчас это сработает для вас.

5. Добавлено еще одно редактирование, потому что мое предыдущее не будет работать для N, кроме 2.