You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pt5jvslni/Chapter3/生成多项式特征.md

85 lines
2.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 3.5 数据预处理常用技巧---生成多项式特征
## 引例
假设现在给了你一份数据,数据的分布如下图所示(其中横轴代表神秘特征`X`的值,纵轴代表与`X`所对应的目标值`Y`,也就是说纵轴的值可以根据`X`以及一种映射关系计算出来)
![](6.jpg)
我想让你根据`X`来将`Y`算出来,此时,你观察数据的分布,认为数据的分布有点像一条直线,所以你可能会使用一条直线来来表示这些数据的分布,如下图中红色的直线:
![](7.jpg)
但是你会发现,红色的直线好像并不能很好的表示数据的分布,毕竟数据的分布像是一个弯弯的勾号,如果能根据特征`X`,使得这条直线能“打勾”就好了。如下图所示:
![](8.jpg)
这个时候,我们就可以试试生成多项式特征了。即将原来的“直线”给“掰弯”。
## 使用sklearn来生成多项式特征
在`sklearn`中通过`PolynomialFeatures`来生成多项式特征,使用方法如下:
```python
import numpy as np
# 导入PolynomialFeatures类
from sklearn.preprocessing import PolynomialFeatures
# 定义数据:
# [[0, 1]
# [2, 3]
# [4, 5]]
data = np.arange(6).reshape(3, 2)
# 实例化PolynomialFeatures的对象多项式的阶为2阶
poly = PolynomialFeatures(degree=2)
# 添加多项式特征
data = poly.fit_transform(data)
# 添加之后的结果
>>>data
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])
```
你会看到原始数据中只有 2 个特征,而添加完多项式特征之后,特征数量增加到了 6 个。这是因为在生成多项式特征时会将原始的两个特征$$(x_1, x_2)$$,先扩展成$$(1, x_1, x_2)$$,记为 X ,然后将两个 X 中的元素两两相乘,相乘后会得到$$1, x_1, x_2, x_1x_2, x_1^2, x_2^2$$,即转换过程如下图所示:
![](2.jpg)
所以特征数量会增加到 6 个。但是在一些情况下,我们只需要特征间的交互项,这可以通过设置 `interaction_only=True`来得到:
```python
import numpy as np
# 导入PolynomialFeatures类
from sklearn.preprocessing import PolynomialFeatures
# 定义数据:
# [[0, 1]
# [2, 3]
# [4, 5]]
data = np.arange(6).reshape(3, 2)
# 实例化PolynomialFeatures的对象多项式的阶为2阶并只保留交叉项
poly = PolynomialFeatures(degree=2, interaction_only=True)
# 添加多项式特征
data = poly.fit_transform(data)
# 添加之后的结果
>>>data
array([[ 1., 0., 1., 0.],
[ 1., 2., 3., 6.],
[ 1., 4., 5., 20.]])
```
特征转换情况如下:
![](3.jpg)
所以`interaction_only`为`True`时,特征的数量只增加到了 4 。