文章目录
- 目标
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)
X:numpy array格式的数据[n_samples,n_features] - 返回值:转换后的形状相同的array
- MinMaxScaler.fit_transform(X)
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]]