当前位置:   article > 正文

回归、分类问题中的多项式特征

多项式特征

前面的博客针对的二分类问题,一直有个隐含的前提,即数据是线性可分的,对于回归问题,所使用的波士顿房价数据也是可以用一条直线表征数据与标签间的映射关系。但是实际应用中,根据数据走势,分类问题未必就是线性可分的,回归问题中一条直线也未必能很好的表示表示数据走势,如何处理这类非线性的问题,就引出一种处理方法------多项式特征
说明:为了说明多项式特征,将利用sklearn封装的方法进行测试


polynomial regression

我们来生成一组测试用例,随机生成100个符合下述函数走势的散点,为了贴合实际,加入N~(0,1)的噪声:
在这里插入图片描述

x = np.random.uniform(-3, 3, size=100)
X = x.reshape(-1, 1)
y = x ** 2 + 2 * x + 3 +np.random.normal(0, 1, 100)
  • 1
  • 2
  • 3

首先利用线性回归进行训练,得到下图映射关系:

from sklearn.linear_model import LinearRegression
lin = LinearRegression()
lin.fit(X, y)
y_predict = lin.predict(X)
plt.plot(x, y_predict, c='r')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
在这里插入图片描述
显然这条直线并不能很好的表示数据的走势(因为我们事先知道这些点是符合一个二次函数走势的),多项式特征的做法就是在原特征的基础上增一些幂级的特征,它被封装在sklearn中的PolynomialFeatures中,感兴趣的读者请参见
在这里插入图片描述
在这里插入图片描述
可以看到PolynomialFeatures这个函数的第一个参数多项式特征的最高指数,Default = 2。第一幅图标红线的部分:当degree=2是,[a,b]特征变为[1, a, b, a2,ab,b2],从下方给的examples中可以看到其用法(第二幅图),PolynomialFeatures(2)之后会返回一个新的多项式矩阵,其中第一列全为1,第二三列为原矩阵的特征,第四列为X[:,0}**2,第五列为X[:,0]*X[:,1],第六列为X[:,1]**2
我们用PolynomialFeatures训练我们随机生成的数据,最终得到下图的曲线:

poly = PolynomialFeatures(degree=2)
poly.fit(X)
X2 = poly.transform(X)
lin_reg2 = LinearRegression()
lin_reg2.fit(X2, y)
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
在这里插入图片描述
对应的x的0,1,2次幂的系数也接近于我们事先设定函数,显然要比直接线性回归得到的直线效果好
注意:随着幂数增加,高次幂的特征和低次幂的特征会不在一个量纲,所以需要进行数据归一化,并且degree不能设置过大,否则会造成过拟合现象。
在这里插入图片描述


逻辑回归中的多项式特征

同上我们随机生成200个测试用例,并将下述圆作为分类边界,圆以内分类位1,圆以外分类为0:
在这里插入图片描述

X = np.random.normal(0, 1, size=(200, 2))
y = np.array((X[:, 0] ** 2 + X[:, 1] ** 2) < 1.5, dtype='int')
  • 1
  • 2

首先利用逻辑回归来学习这条分类曲线,得到分类决策面:

log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
x1 = np.linspace(-3, 3, 1000)
plt.plot(x1, (-log_reg.intercept_[0] - log_reg.coef_[0][0] * x1) / log_reg.coef_[0][1], c='r')
plt.axis([-3, 3, -5, 5])
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
在这里插入图片描述
显然,这样的分类器是不可取的,并不能达到优良的效果,然后引入多项式特征,使用同时对数据进行归一化:

poly_lr = Pipeline([
        ('poly', PolynomialFeatures(degree=2)),
        ('std_scaler', StandardScaler()),
        ('log_reg', LogisticRegression())
    ])
poly_lr.fit(X_train, y_train)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
在这里插入图片描述
这样,利用多项式特征可以解决逻辑回归中的线性不可分的问题。


总结

1.有些时候,数据无法直接可视化,我们可以尝试针对问题使用回归或者分类算法,如果score未达到预期,此时考虑加入多项式特征会是解决score较低的一个思路。
2.sklearn封装的Pipeline是个好用的工具,以元组的形式传入一个列表,每个元组需要传入两个参数,第一个可以是第二参数的描述,第二个是具体要执行的方法,我们可以将PolynomialFeatures(),StandardScaler(),LogisticRegression()或者LinearRegression()封装到pipeline中,代码将顺次执行多项式特征,归一化,线性or逻辑回归,然后调用fit函数拟合训练数据,同时也可以使用predict,score方法进行预测和计算score,感兴趣的读者请参见
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/526079
推荐阅读
相关标签
  

闽ICP备14008679号