#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.