目录
1.什么是特征处理
通过特点的统计法(数学方法),将数据转换成算法要求的数据
2.不同的特征数据处理方式
数值型数据(实数型),通过标准缩放进行处理,标准缩放简单来讲就是将数字大小缩小化(偏0),如100缩小到0~1之间,常用的算法有:
- a.归一化
- b.标准化
类别型数据,比如性别,国籍,这些有限类别的数据值,可将其转换为整数数字,性别男女对于0或1;世界上有197个国家,所以可用1-197对国籍标号,对于这样的处理方式,常用的算法有:
- a.one-hot编码化
时间型数据,对于时间型数据,常用的做法是切分时间段,算法为:
- a.时间切分
3.归一化
归一化是指对原始数据进行变换,把数据映射到一个指定的区间,如[0,1]之间
公式
公式讲解
对于下列数据,将其做归一化,其结果如右。max代表一列的最大值,min代表一列的最小值,x代表为变量(被归一化的值)。比如特征1(第一列)的第一个值90,这一列的最大值为90,最小值为60,则有
X`=90-60/90-60=1
mx和mi分别为指定区间值,mx为1,mi为0,区间值指的是我们想要缩小到的区间,默认是[0,1]。sklearn 可以调整这个区间值。
X``=1*(1-0)+0=1
所以90进过归一化后变成了1,类似的60变成了0,75变成了0.5
sklearn 归一化实例
sklearn API接口: sklearn.preprocessing.MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
def normalization():
mm=MinMaxScaler()
data=mm.fit_transform([[90,2,10,40],
[60,4,15,45],
[75,3,13,46]])
print(data)
if __name__=="__main__":
normalization()
打印结果
缩小区间可以调整, 如将其调整到(1,3)
mm=MinMaxScaler(feature_range=(1,3))
归一化的运用场景
相亲约会对象数据,这个样本时男士的数据,三个特征,玩游戏所消耗时间的 百分比、每年获得的飞行常客里程数、每周消费的冰淇淋公升数。然后有一个 所属类别,被女士评价的三个类别,不喜欢didnt、魅力一般small、极具魅力large 也许也就是说飞行里程数对于结算结果或者说相亲结果影响较大,但是统计的 人觉得这三个特征同等重要。
在此处为什么要进行归一化,归一化说白了就是控制数据在指定的范围内,防止过大数据对结果造成干扰。
这里先使用一个k-means算法(k近临算法)
k-means就是同一特征下的两个样本,相减取平方。
对于上图标红的两个样本(从现在开始,表中的行称为样本,列称为特征值),使用k-means时,计算(72993-35948)^2 + (10.141740-6.830792)^2 + (1.032955-1.213192)^2,会发现(72993-35948)^2的值过大,后面两项基本可以忽略不计了,但是案例中有一句话很重要------“统计的 人觉得这三个特征同等重要”。所以,就要解决这个情况,可以使用归一化解决。
最终,使得某一个特征对最终结果不会造成更大影响。
归一化的缺点——异常点
如果数据中异常点较多,对归一化会有什么影响?
回忆归一化公式,x1=x-min/max-min , x1的值容易受到max-min的影响,x2也就受到影响,所以当出现特别大和特别小的数值,会对结果产生很大的影响,如下面这组值,
data=mm.fit_transform([[900,2,10,40], [60,4,15,45], [75,3,13,46], [45,3,13,46], [65,3,13,46], [90,3,13,46],])
进行归一化的结果为,第一个值900极大的影响了这一特征值,使得其他数值被极大缩小了:
[[1. 0. 0. 0. ]
[0.01754386 1. 1. 0.83333333]
[0.03508772 0.5 0.6 1. ]
[0. 0.5 0.6 1. ]
[0.02339181 0.5 0.6 1. ]
[0.05263158 0.5 0.6 1. ]]
总结:注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性(可以理解为稳定性)较差,只适合传统精确小数据场景。
4.标准化
标准化是指对原始数据进行变换把数据变换到均值为0,标准差为1。如何将一组特征值变满足这一条件的一组值,需要用到以下公式。
公式
x代表当前特征值,mean代表该类特征值的平均数
其中σ的计算方式如下,var代表方差,σ为方差var开根号
公式分析
有以下一组特征值,计算第一列三个(90,60,75)的X`。
[90,2,10,40],
[60,4,15,45],
[75,3,13,46]
第一列平均数
mean=90+60+75/3=75
var=(90-75)^2+(60-75)^2+(75-75)^2/3=150
σ=√150=12.247
X1`=90-75/12.247=1.2247897
X2`=60-75/12.247=-1.2247897
X3`=75-75/12.247=0
标准化处理后的第一组数据为
1.2247897 -1.2247897 0
对于这一组结果,是否满足均值为0,标准差为1呢?计算一下
均值=1.2247897+(-1.2247897)+0/3=0
标准差=√方差=√((1.2247897-0)^2+(1.2247897-0)^+(0-0)^2)/3=1(注意,这里其实是约等于1)
根据计算结果,显然满足我们对标准化的定义
sklearn 标准化实例
sklearn API接口:sklearn.preprocessing.StandardScaler
from sklearn.preprocessing import StandardScaler
def standar():
st = StandardScaler()
data = st.fit_transform([[90,2,10,40],
[60,4,15,45],
[75,3,13,46]])
print(data)
if __name__=="__main__":
standar()
输出结果,可以看到第一列的值与我们计算的是一样的。
标准化的意义
使用标准化的意义在于解决归一化的缺陷,即当出现异常点,影响了最大值或最小值,那么结果显然会发生改变;而对于标准化来说,具有一定数据量,少量的异常点对平均值的影响不是那么大,从而方差改变也较小
缺失值处理方法
在做数据预处理之前,有些数据可能存在缺失值,比如对某一组特征数据,其不存在特征x,或者在获取该特征时因为某些原因没有录入,有两种处理方式:
- 删除:删除该行数据(不对这一组数据做特征值预处理),或是删除该特征值(不对该特征做预处理)
- 填补:可用该列特征值的平均数或中位数进行填补,通常来说,使用填补的方式处理缺失值更加稳妥
比如该组数据
[90,2,10,40],
[60,4,15,45],
[75,3,13,46]
假设某组数据有缺失值,这样就有个问题,缺失的部分填什么,填0或者不填可以么,当然不可以
[90,2,10,],
[,4,15,45],
[75,3,,46]
补充:numpy提供了缺失值的填补方式,即np.nan
使用numpy填补后的数据
[90,2,10,np.nan],
[np.nan,4,15,45],
[75,3,np.nan,46]
sklearn 提供了缺失值处理API:sklearn.impute.SimpleImputer
我们使用平均值来填补缺失值
from sklearn.impute import SimpleImputer
def imputer():
im=SimpleImputer(missing_values=np.nan,strategy="mean")
data=im.fit_transform([[90,2,10,np.nan],
[np.nan,4,15,45],
[75,3,np.nan,46]])
print(data)
if __name__=="__main__":
imputer()
结果如下
注意:平均值不计算缺失部分,如第一列特征的平均值=90+75/2=82.5
参考资料
归一化案例:约会相亲对象 https://www.cnblogs.com/cwj2019/p/11720029.html
数据的标准化(normalization)和归一化 https://www.cnblogs.com/LazyJoJo/p/7216523.html
数据预处理Preprocessing data https://blog.csdn.net/pipisorry/article/details/52247679
缺失值处理&异常值处理 https://blog.csdn.net/xiedelong/article/details/81607598