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

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

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

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()

在这里插入图片描述
在这里插入图片描述
显然这条直线并不能很好的表示数据的走势(因为我们事先知道这些点是符合一个二次函数走势的),多项式特征的做法就是在原特征的基础上增一些幂级的特征,它被封装在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)

在这里插入图片描述
在这里插入图片描述
对应的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')

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

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()

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

poly_lr = Pipeline([
        ('poly', PolynomialFeatures(degree=2)),
        ('std_scaler', StandardScaler()),
        ('log_reg', LogisticRegression())
    ])
poly_lr.fit(X_train, y_train)

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


总结

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

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值