Press "Enter" to skip to content

【机器学习】数据预处理与特征工程

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

1.特征提取背景

 

一个机器学习系统可以学习的程度主要由训练数据的质量决定。尽管每一个机器学习的算法都有它的缺点和优点,但是不可否认的是系统性能的差异往往由于数据准备的方式或者表现形式的不同。因此特征工程可以理解为数据表示的一个工具

 

特征工程的问题是:什幺样的样本数据表示才是可以让系统学习到解决问题的方法的最佳表示。

 

2 数据预处理

 

处理数据一般要遵守规则。

 

预处理的三个步骤:

 

a.数据格式化

 

数据可能并不适合我们处理的那种格式,。比如机器学习常用的是矩阵数组的格式,传入的通常是列表的,元组的。

 

b.数据清理

 

数据中可能存在无效的或者丢失的条目。这些数据需要被清理或者移除。

 

c.数据采样

 

数据可能对于特定的目的而言太大了,我们需要把数据以一种巧妙的方式来采样。

 

3.特征工程

 

预处理的数据通常有三种操作形式。

 

某些机器学习算法常常要求数据在一个特定的范围之内,比如拥有零点零均值或者方差。缩放是将所有的特征(可能有不同的物理单位)变成特定范围内的值的一个过程。

 

数据集常常拥有比我们所能处理的更多的特征。特征分解就是把数据压缩成由少量的但具有更多的信息的数据成分组合的数据的过程。

 

有时需要把多个特征聚合成一个更有意义的特征。比如,一个数据集中可能包含每个用户登录web系统的时期和时间。更具特定任务,这个数据可能通过间的统计每个用户登录的次数来表示会更加合适。

 

3.1特征标准化

 

标准化就是把数据缩放到拥有零均值和单位方差的过程。对于大部分如果个别的特征无法满足这条件算法可能表现的不好的机器学习算法,一般都标准化处理。

 

每一个数据减去所有数据的平均值u然后除以数据的方差o.

 

对于每一个特征(数据)计算(x-v)/o

 

另外,scikit-learning在preprocessing 模块中提供了一个标准化的函数。

 

from sklearn import preprocessing
import numpy as np
X=np.array([1,-2,2],
[3,0,0],
[0,1,-1])
print(X)
X_scaled=preprocessing.scale(X)
print(X_scaled)
X_scaled.mean(axis=0)#np每一行的均值计算
X_scaled.std(axis=0)#np每一行的方差计算

 

一个标准化后的特征矩阵每一个行的均值等于0.

 

此外每一个行的方差为1.

 

3.2范数归一化

 

与标准化类似,归一化是缩放单个样本以使他们拥有单位范数的过程。我相信你知道范数表示的是一个向量的长度,且可以使用不同的方法来定义。常见范数L1范数:曼哈顿距离,L2范数:欧式距离

 

L1=sum(|x|)

 

L2=sqrt(sum|x|^2)

 

x1=x/L1

 

x2=x/L2

 

归一化意思就是在一个数据输入维度作为一个向量下,让这个向量成为一个范数单位。

 

在scikitlearn中,数据矩阵X可以使用normalize函数范数归一化,L1范数通过norm关键字设定。

 

x1_normalized=preprocessing.normalize(x,norm='l1')
x2_normalized=preprocessing.normalize(x,norm='l2')
print(x1_normalized,x2_normalized)

 

原始的矩阵是上边的例子:

 

输出的结果是x1:[0.2,-0.4,0.4]

 

[1,0,0]

 

[0,0.5,-0.5]

 

x2:[0.33333,-0.6666667,0.666667]

 

[1,0,0]

 

[0,0.707,-0.707]

 

3.3尺度归一化

 

这个归一化需要加入参数最大值和最小值。

 

一般来说这个数值是在零和1之间的。这样每一个特征的最大绝对值就缩放到单位尺寸了。

 

在scikitlearn中,可以使用MinMaxScaler来完成这个操作:

 

min_max_scaler=preprocessing.MinMaxScaler()

 

min_max_scaler=preprocessing.MinMaxScaler()
X=min_max_scaler.fit_transform(X)

 

默认情况下,数据会缩放到0-1之间,当然可以规定到想要的尺幅范围:

 

可以通过传入MinMaxScaler的关键字feature_range来指定不同的范围:

 

min_max_scaler=preprocessing.MinMaxScaler(feature_range=(-10,10))#定义对象
X4=min_max_scaler.fit_transform(X)

 

结果:

 

[-3.333,-10,10]

 

[10,3.333,-3.3333]

 

[-10,10,-10]

 

4特征阈值二值化处理

 

最后我们呢可能对数据如果期望的准确特征不关心,相反,可能仅仅想知道一个特征是存在还是不村子啊。二值化数据的操作可以通过对特征设定阈值来完成。

 

x=

 

[1,2,-2]

 

[3,0,0]

 

[0,1,-1]

 

binarizer=preprocessing.Binarizer(threshold=0.5)
x5=binarizer.transform(x)

 

x5=

 

[1,0,1]

 

[1,0,0]

 

[0,1,0]

 

5缺失的数据的处理

 

如果出现nan

 

x=

 

[nan,0,3]

 

[2,9,8]

 

[1,nan,1]

 

损失出现loss=Nan,可能的一个问题就是数据中有nan

 

非数nan

 

因此需要填充上一个数值,这个操作叫做填充缺失数值。

 

scikitlearn提供了三种方法:

 

1“mean”:将所有的nan数据替换成这个数组的平均。

 

2.”median:将nan数据替换成指定坐标轴的中间数据。

 

3.”most_frequest’:将nan数据替换成指定坐标

 

4.’0‘

 

5.线性插值:找到前后的数,计算均值。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。