文章目录
- 目标
o 了解数据型数据、类别型数据特点
o应用
什么是预处理?
什么是特征预处理
sklearn官网的解释:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
1. 包含内容
- 数值型数据的无量纲化
- 归一化
- 标准化
2. 特征预处理API
sklearn.preprocessing
为什么我们要进行归一化/标准化?
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其他的特征
约会对象数据
相亲约会对象数据:这个的样本是男士的数据,三个特征,玩游戏所消耗时间的百分比、每年获得的飞行常客里程碑、每周消耗的冰淇淋公升数。然后有一个所属类别,被女士评价的三个类型,不喜欢didnt、魅力一般small、极具魅力largr
也许也就是说飞行里程数对于结果或者说相亲结果影响不大,但是统计的人觉得这三个特征同等重要
如果要计算上述图片红色的两个男士数据的特征是否接近:
(
72993
−
35948
)
2
+
(
10.14
−
6.83
)
2
+
(
1.03
−
1.21
)
2
\sqrt[]{ (72993-35948) ^ 2+ (10.14-6.83)^ 2 + (1.03-1.21) ^ 2 }
(72993−35948)2+(10.14−6.83)2+(1.03−1.21)2
可以很明显看出最后的结果主要是取决于里程数,如果不进行归一化或标准化就会导致,我没无法学习到除了里程数以外的学习特征,但是设定是三个特征同等重要,所以需要用到一些方法进行无量纲化,使不同规模的数据转换到同一规格
2.4.1 归一化
1. 定义
通过对原始数据进行变换把数据映射到(默认为[0,1])之间
2. 公式
X ′ = x − m i n m a x − m i n X'= \frac{x-min}{max-min} X′=max−minx−min X ′ ′ = X ′ ∗ ( m x − m i ) + m i X''=X'*(mx-mi)+mi X′′=X′∗(mx−mi)+mi
作用每一列,max为一列的最大值,min为一列的最小值,那么 X n X^n Xn为最终结果,mx,mi分别为指定区间默认mx为1,mi为0
那么怎么解释这个过程呢?举个例子:
eg: 对于第一列第3个数据,
X
′
=
75
−
60
90
−
60
=
0.5
X'=\frac{75-60}{90-60}=0.5
X′=90−6075−60=0.5
X
′
′
=
0.5
∗
1
+
0
=
0.5
X''=0.5*1+0=0.5
X′′=0.5∗1+0=0.5
3. API
sklearn.prerocessing.MinMaxScaler(feature_range=(0,1)…)
- MinMaxScaler.fit_transform(X)
o X:numpy array格式的数据[n_samples,n_features] - 返回值:转换后的形状相同的array
4. 数据计算
我们对一下数据进行运算,在dating.txt中。保存的就是之前的约会对象数据
milage,liters,Consumtime,target
40902,8.326976,0.953953,3
14488,7.153469,1.673904,2
26052,1.441871,0,805124,1
75136,13.147394,0.428964,1
38344,1.669788,0.134296,1
……
- 分析
- 获取数据
- 实例化MinMaxScaler
- 通过fit_transform转换
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
# 1.获取数据
data = pd.read_csv("dating.txt")
print("data:\n", data)
打开dating.txt的输出结果
data:
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
3 75136 13.147394 0.428964 1
4 38344 1.669788 0.134296 1
.. ... ... ... ...
995 11145 3.410627 0.631838 2
996 68846 9.974715 0.669787 1
997 26575 10.650102 0.866627 3
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
例如本题数据归一化不需要target列,所以我们可以只选取前三列
# 只要前三列
data = data.iloc[:,:3]
print("data:\n",data)
输出结果:
data:
milage Liters Consumtime
0 40920 8.326976 0.953952
1 14488 7.153469 1.673904
2 26052 1.441871 0.805124
3 75136 13.147394 0.428964
4 38344 1.669788 0.134296
.. ... ... ...
995 11145 3.410627 0.631838
996 68846 9.974715 0.669787
997 26575 10.650102 0.866627
998 48111 9.134528 0.728045
999 43757 7.882601 1.332446
[1000 rows x 3 columns]
# 2.实例化一个转换器
# 默认区间[0,1]
transfer = MinMaxScaler()
# 3.调用fit_transform
data_new=transfer.fit_transform(data)
print("data_new\n",data_new)
输出结果:
data_new
[[0.44832535 0.39805139 0.56233353]
[0.15873259 0.34195467 0.98724416]
[0.28542943 0.06892523 0.47449629]
...
[0.29115949 0.50910294 0.51079493]
[0.52711097 0.43665451 0.4290048 ]
[0.47940793 0.3768091 0.78571804]]
# 尝试其他区间范围
transfer = MinMaxScaler(feature_range=[2,3])
data_new=transfer.fit_transform(data)
print("data_new\n",data_new)
输出结果:
data_new
[[2.44832535 2.39805139 2.56233353]
[2.15873259 2.34195467 2.98724416]
[2.28542943 2.06892523 2.47449629]
...
[2.29115949 2.50910294 2.51079493]
[2.52711097 2.43665451 2.4290048 ]
[2.47940793 2.3768091 2.78571804]]
问题(归一化的缺点):如果数据中异常点较多,会有什么影响?
5. 归一化总结
如果有异常值(最大值或者最小值),进行公式计算时:
X
′
=
x
−
m
i
n
m
a
x
−
m
i
n
X'= \frac{x-min}{max-min}
X′=max−minx−min
X
′
′
=
X
′
∗
(
m
x
−
m
i
)
+
m
i
X''=X'*(mx-mi)+mi
X′′=X′∗(mx−mi)+mi
会导致公式的结果不准确,这种方法鲁棒性较差,只适合传统精确小数据场景
2.4.3 标准化
1. 定义
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
2. 公式
X
′
=
x
−
m
e
a
n
σ
X'= \frac{x-mean}{σ}
X′=σx−mean
作用于每列,mean为平均值,σ为标准差(集中程度)
所以回到刚才异常点的地方,我们再来看看标准化
- 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生变化
- 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小
API
- sklearn.preprocessing.StandardScaler()
o 处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
o StandardScaler.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
o 返回值:转换后的形状相同的array
数据计算
同样对上面的数据进行处理
- 分析
- 实例化StandardScaler
- 通过fit_transform转换
from sklearn.preprocessing import StandardScaler
data = pd.read_csv("dating.txt")
data = data.iloc[:,:3]
transfer = StandardScaler()
data_new=transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("标准化结果\n",data_new)
print("每一列特征的平均值\n",transfer.mean_)
print("每一列特征的方差\n",transfer.var_)
输出结果:
标准化结果
[[ 0.33193158 0.41660188 0.24523407]
[-0.87247784 0.13992897 1.69385734]
[-0.34554872 -1.20667094 -0.05422437]
...
[-0.32171752 0.96431572 0.06952649]
[ 0.65959911 0.60699509 -0.20931587]
[ 0.46120328 0.31183342 1.00680598]]
每一列特征的平均值
[3.36354210e+04 6.55996083e+00 8.32072997e-01]
每一列特征的方差
[4.81628039e+08 1.79902874e+01 2.46999554e-01]
标准化总结
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景