需求
波士顿房价数据集在scikit-learn1.2版本以后被移除了。 目前自己用的刚好是1.2版本,但是需要复现书中的一些代码(Python机器学习基础教程),所以需要从其他途径获取波士顿房价数据集,主要是获得data(506, 104)和相关的target。
实现
1、获得data(506,104):
1 | import numpy as np |
2、获取target:
对数据进行归一化和多项式构造,并没有改变行的布局,只是列发生变化,所以shape变化的前后,target不变。
理解
特征的由少变多
最初的 13 个特征加上这 13 个特征两两组合(有放回)得到的 91 个特征,一共有 104 个特征。
两两组合计算: 思路1:
共13个特征,第一次抽取1这个特征,再放回1,也就是1可以和13个特征组合,也就是允许1和1组合。
第二次抽取2这个特征,再放回2,2也可以和13个特征组合,但是第一次抽取时1和2已经组合过了,所以需要去除这个1和2组合,即2只能和12个特征组合。
第三次抽取3这个特征,再放回3,3也可以和13个特征组合,但是第一次3和1已经组合过了,第二次3和2已经组合过了,即3只能和11个特征组合。
第 1 个特征可以与 13 个特征相乘,第 2 个可以与 12 个特征相乘(除了第 1 个),第 3 个可以与 11 个特征相乘……依次相加,13 + 12 + 11 + … + 1 = 91。
思路2:当成两部分计算,之前自己算成78,就是忽略了有放回这个条件即忽略了绿色部分;

MinMaxScaler()
Feature scaling,常见的提法有“特征归一化”、“标准化”,是数据预处理中的重要技术。[3]本文将Feature scaling叫作特征标准化,归一化指代min-max normalization。
常用feature scaling(标准化)方法:
- Rescaling (min-max normalization、range scaling) / 归一化
- Mean normalization
- Standardization (Z-score Normalization)
- Scaling to unit length
上述4种feature scaling方式,前3种为逐行操作,最后1种为逐列操作。本文只讨论min-max normalization这个方式。
当数据(x)按照最小值中心化后,再按极差(最大值 -
最小值)缩放,数据移动了最小值个单位,并且会被收敛到 [0,1]
之间(默认),而这个过程,就叫做数据归一化(Normalization,又称Min-Max
Scaling)[1]。
归一化其实就是标准化的一种方式,只不过归一化是将数据映射到了[0,1]这个区间中。[2]
归一化之后的数据服从正态分布,公式如下: \[X^* = \frac{x-min(x)}{max(x)-min(x)}\]
preprocessing.MinMaxScaler 官方文档
1 | class sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1), *, copy=True, clip=False) |
默认数据归一到 [ 0,1 ]
1 | from sklearn.preprocessing import MinMaxScaler |
1 | data = np.array([[3,4,5],[1,78,3],[60,56,32],[97,43,12]]) |
列是特征,行是样本,所以这里的归一化都是以列为单位;
1 | import numpy as np |
1 | print((0.00632-0.00632)/(88.9762-0.00632)) |
PolynomialFeatures()
再对波士顿数据进行归一化后,需要将13个特征两两相乘,添加更多的特征,需要用到多项式进行特征构造,即使用 PolynomialFeatures
使用 sklearn.preprocessing.PolynomialFeatures 这个类可以进行特征的构造,构造的方式就是特征与特征相乘(自己与自己,自己与其他人),这种方式叫做使用多项式的方式。例如:有 a、b 两个特征,那么它的 2 次多项式的次数为 \([1,a,b,a^{2},ab,b^{2}]\) [4]。
PolynomialFeatures 这个类有 3 个参数:
degree:控制多项式的次数;interaction_only:默认为 False,如果指定为 True,那么就不会有特征自己和自己结合的项,组合的特征中没有 \(a^2\) 和 \(b^2\) ;include_bias:默认为 True 。如果为 True 的话,那么结果中就会有 0 次幂项,即全为 1 这一列。
1 | from sklearn.preprocessing import PolynomialFeatures |