Scikit Learn系数多项式特征

7

我已经通过PolynomialFeatures训练了一个模型,但我不知道如何获取模型的系数。代码如下:

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt

X = np.matrix([0,1,2,3,4,5,6,7,8,9,10]).reshape((11,1))
Y = np.matrix([0,2.2,3.5,14.3,20.4,32.1,40.3,  
           59.1,86.2,90.3,99.9]).reshape((11,1))
a = PolynomialFeatures(15)
modelo = make_pipeline(a, LinearRegression())
modelo.fit(X, Y)
plt.plot(X,Y,'.')
plt.plot(X, modelo.predict(X),'-')
plt.show()

original data

1个回答

21

让我们从使用二次多项式开始,而不是您示例中的15次多项式,以简化问题(并避免过度拟合)。

二次多项式拟合

使用您的X值,让我们看看这些值是如何变换的。

a = PolynomialFeatures(2)
a.fit_transform(X)

array([[   1.,    0.,    0.],
       [   1.,    1.,    1.],
       [   1.,    2.,    4.],
       [   1.,    3.,    9.],
       [   1.,    4.,   16.],
       [   1.,    5.,   25.],
       [   1.,    6.,   36.],
       [   1.,    7.,   49.],
       [   1.,    8.,   64.],
       [   1.,    9.,   81.],
       [   1.,   10.,  100.]])

我们可以看到第一个特征是 X^0,第二个特征是 X^1,第三个特征是 X^2

现在,使用您现有的代码,您正在构建两步骤的管道,名称为modelo

我们能够使用modelo.steps[1][1]访问第二步骤的估计器。从那里,我们可以使用coef_获取系数,并使用intercept_获取截距。

modelo.steps[1][1].coef_
# [[ 0.          3.3486014   0.76468531]]

modelo.steps[1][1].intercept_
# [-2.75244755]

从这里可以看出,多项式为 y_estimated = -2.75 + 0 * X^0 + 3.35 * X^1 + 0.76 * X^2


2
在我看来,model.coef_[0] 看起来总是为 0.0,实际的截距应该是 clf.intercept_,你有这样的经验吗?你知道有什么文档可以证实这一点吗? - Alex
是的,这是我在使用“LinearRegression”模型时的经验。这可能因使用的sklearn估计器而有所不同。 - David Maust
您可以在特征中包含偏差: make_pipeline(PolynomialFeatures(degree, include_bias=True),LinearRegression(fit_intercept=False)) 或者在线性回归中包含偏差: make_pipeline(PolynomialFeatures(degree, include_bias=False),LinearRegression(fit_intercept=True))。默认情况下,两者都为 True,第一个 coef_ 始终为零。 - Ramon Crehuet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接