文章目录
前言
数据预处理主要有四个任务:数据清洗、数据集成、数据变换及数据规约。本文主要介绍常用的数据清洗与数据变换,其中数据清洗包括异常值与缺失值的处理;数据变换指将一种格式的数据转换为另一格式的数据。
一、数据清洗
当我们得到一组数据时,这组数据可能会存在一些缺失值和异常值(噪声数据)。此时我们进行数据清洗,主要包括两个部分:缺失值处理与异常值处理。
1.1 缺失值处理
缺失值的处理方法主要有三种:删除记录、数据插补和不处理。
-
删除记录,顾名思义,指当该组数据某一个案的数据缺省时,删除这组个案的数据,这种方法的优点是处理方便,但在数据较少时要慎重使用。\
-
数据插补,使用不同的插补方法将缺省的数据补齐。主要插补方法有:均值/中位数/众数插补;使用固定值插补;最近邻插补;回归方法插补;插值法插补。
最近邻插补:即在记录中找到与缺失样本最接近的样本的该属性插补,可以通过计算对象间的欧式距离衡量。
回归方法插补:根据已有数据和与其有关的其他变量的数据建立拟合模型来预测缺失值。
插值法:常用的插值方法有很多,这里可以阅读我的另一篇文章数学建模学习笔记(一):插值法。 -
不处理,有时我们可以将所有缺省数据的样本划分为另一组,进行特殊处理。
1.2 异常值处理
异常值的处理方法较为简单,主要方法有:删除记录、视为缺失值、平均值修正和不处理。由于处理异常值的方法简单,在此不作解释。
发现异常值是处理异常值的难点,发现异常值主要有两个方法:3
σ
\sigma
σ原则和画箱型图,可以查阅相关文章。
二、数据变换
在处理数据时我们会遇到各种类型的指标,大体上可分为三种类型:效益型指标、成本型指标及区间型指标。效益型指标即该指标越大越优,成本型指标即该指标越小越优,而区间型指标则是在某个区间内为最优。为了方便处理,我们通常要将数据指标统一转换为效益型指标。
2.1 线性变换
设原始的指标矩阵为
A
=
(
a
i
j
)
m
×
n
A=(a_{ij})_{m \times n}
A=(aij)m×n,
m
m
m为样本数量,
n
n
n为指标数,变换后的指标矩阵记为
B
=
(
b
i
j
)
m
×
n
B=(b_{ij})_{m\times n}
B=(bij)m×n,
i
=
1
,
…
,
m
,
j
=
1
,
…
,
n
i=1,…,m,j=1,…,n
i=1,…,m,j=1,…,n。设
a
j
m
a
x
a_j^{max}
ajmax是指标矩阵第
j
j
j列中的最大值,
a
j
m
i
n
a_j^{min}
ajmin是指标矩阵第
j
j
j列中的最小值。
若
x
j
x_j
xj为效益型指标,则
b
i
j
=
a
i
j
/
a
j
m
a
x
b_{ij}=a_{ij}/a_j^{max}
bij=aij/ajmax
若
x
j
x_j
xj为成本型指标,则
b
i
j
=
1
−
a
i
j
/
a
j
m
a
x
b_{ij}=1-a_{ij}/a_j^{max}
bij=1−aij/ajmax
经过变换可以将数据全都转换为效益型指标,输出范围为0——1之间。需要注意的是,这种方法不适用于
x
j
x_j
xj<0的情况。
2.2 向量规范化
无论
x
j
x_j
xj为效益型指标或成本型指标,均进行如下变换
b
i
j
=
a
i
j
/
∑
i
=
1
m
a
i
j
2
,
i
=
1
,
…
,
m
,
j
=
1
,
…
,
n
b_{ij}=a_{ij}/\sqrt{\sum_{i=1}^ma_{ij}^2},i=1,\ldots,m,j=1,\ldots,n
bij=aij/i=1∑maij2,i=1,…,m,j=1,…,n
这种变换也是线性的,但它无法分辨属性值的优劣。它的最大特点是,规范化后各方案的同一指标的平方和为1,因此常用于计算各方案与某种虚拟方案(如理想点或负理想点)的欧氏距离的场合。经过向量规范化处理后的数据在[-1,1]区间内。
2.3 min-max归一化
在实际问题中,不同变量的测量单位往往是不一样的。为了消除变量的量纲效应,使每个变量都具有同等的表现力,通常可以通过这种方式对数据去量纲化。
若
x
j
x_j
xj为效益型指标,令
b
i
j
=
a
i
j
−
a
j
m
i
n
a
j
m
a
x
−
a
j
m
i
n
b_{ij}=\frac{a_{ij}-a_j^{min}}{a_j^{max}-a_j^{min}}
bij=ajmax−ajminaij−ajmin
若
x
j
x_j
xj为成本型指标,令
b
i
j
=
a
j
m
a
x
−
a
i
j
a
j
m
a
x
−
a
j
m
i
n
b_{ij}=\frac{a_j^{max}-a_{ij}}{a_j^{max}-a_j^{min}}
bij=ajmax−ajminajmax−aij
若
x
j
x_j
xj为区间型指标(即在某个区间内最优),设给定的最优区间
[
a
j
0
,
a
j
∗
]
[a_j^0,a_j^*]
[aj0,aj∗],
a
j
’
a_j^’
aj’为无法容忍下限,
a
j
’
’
a_j^{’’}
aj’’为无法容忍上限,则
b
i
j
=
{
1
−
(
a
j
0
−
a
i
j
)
/
(
a
j
0
−
a
j
’
)
,
a
j
’
≤
a
i
j
<
a
j
0
1
,
a
j
0
≤
a
i
j
≤
a
j
∗
1
−
(
a
i
j
−
a
j
∗
)
/
(
a
j
’
’
−
a
j
∗
)
,
a
j
∗
<
a
i
j
≤
a
j
’
’
0
,
其
他
.
b_{ij}= \begin{cases} \begin{aligned} &1-(a_j^0-a_{ij})/(a_j^0-a_j^’),&a_j^’\le a_{ij}<a_j^0 \\ &1, &a_j^0\le a_{ij}\le a_j^*\\ &1-(a_{ij}-a_j^*)/(a_j^{’’}-a_j^*),&a_j^*<a_{ij}\le a_j^{’’}\\ &0,&其他. \end{aligned} \end{cases}
bij=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧1−(aj0−aij)/(aj0−aj’),1,1−(aij−aj∗)/(aj’’−aj∗),0,aj’≤aij<aj0aj0≤aij≤aj∗aj∗<aij≤aj’’其他.
经过如上转换可将所有指标转换为效益型指标,输出范围在0——1之间。该方法适用于
a
j
m
i
n
,
a
j
m
a
x
a_j^{min},a_j^{max}
ajmin,ajmax已知的情况,但如果有新数据加入,就可能会导致最小值(
a
j
m
i
n
a_j^{min}
ajmin)和最大值(
a
j
m
a
x
a_j^{max}
ajmax)发生变化,就需要进行重新定义。
2.4 z-score标准化
这也是另一种较为常用的数据去量纲化的处理方式,将原始数据作如下变换
b
i
j
=
a
i
j
−
a
j
‾
s
j
,
i
=
1
,
2
,
…
,
m
,
j
=
1
,
2
,
…
,
n
b_{ij}=\frac{a_{ij}-\overline{a_j}}{s_j},i=1,2,…,m,j=1,2,…,n
bij=sjaij−aj,i=1,2,…,m,j=1,2,…,n
其中
a
j
‾
=
1
m
∑
i
=
1
m
a
i
j
\overline{a_j}=\frac{1}{m}\sum_{i=1}^ma_{ij}
aj=m1∑i=1maij,
s
j
=
1
m
−
1
∑
i
=
1
m
(
a
i
j
−
x
j
‾
)
2
s_j=\sqrt{\frac{1}{m-1}\sum_{i=1}^m(a_{ij}-\overline{x_j})^2}
sj=m−11∑i=1m(aij−xj)2,
z-score标准化方法适用于属性集的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。
需要注意的是,若原数据是正态分布,则经过z-score标准化输出的数据仍符合正态分布;原来不是正态分布的,经过z-score变换之后并不会转换为正态分布。
三、数据预处理案例及代码实现
如下表所示,该组数据为研究生院试评估的部分数据。
我们知道,
x
1
,
x
3
x_1,x_3
x1,x3为效益型指标,
x
4
x_4
x4为成本型指标,而
x
2
x_2
x2为区间型指标。
下面我们使用Matlab分别用四种变换对数据进行预处理:
3.1 线性变换-代码实现
我们可以对指标
x
1
,
x
3
,
x
4
x_1,x_3,x_4
x1,x3,x4进行线性变换,结果如下:
附Matlab代码:
a = [0.1 5000 4.7;0.2 6000 5.6;0.4 7000 6.7;0.9 10000 2.3;1.2 400 1.8];
[m,n]=size(a)
for j=1:n
b(:,j)=a(:,j)/sum(a(:,j));
end
b(:,3)=1-b(:,3);%成本型指标正向化
3.2 向量规范化-代码实现
我们对指标
x
1
,
x
2
,
x
3
,
x
4
x_1,x_2,x_3,x_4
x1,x2,x3,x4进行向量规范化处理,结果如下:
附Matlab代码:
a = [0.1 5 5000 4.7;0.2 6 6000 5.6;0.4 7 7000 6.7;0.9 10 10000 2.3;1.2 2 400 1.8];
[m,n]=size(a)
for j=1:n
b(:,j)=a(:,j)/norm(a(:,j));
end
3.3 min-max归一化-代码实现
这里我们假设生师比
x
2
x_2
x2为区间型指标,最佳区间为[5,6],无法容忍下限
a
2
’
=
2
a_2^’=2
a2’=2,无法容忍上限
a
2
’
’
=
12
a_2^{’’}=12
a2’’=12。归一化处理后结果如下:
附Matlab代码:
a = [0.1 5 5000 4.7;0.2 6 6000 5.6;0.4 7 7000 6.7;0.9 10 10000 2.3;1.2 2 400 1.8];
[m,n]=size(a)
x2=@(qujian,lb,ub,x)(1-(qujian(1)-x)./(qujian(1)-lb)).*(x>=lb&x<qujian(1))+...
(x>=qujian(1)&x<=qujian(2))+(1-(x-qujian(2))./(ub-qujian(2))).*...
(x>qujian(2)&x<=ub);%利用函数句柄转换区间型变量
qujian=[5,6];lb=2;ub=12;
a(:,2)=x2(qujian,lb,ub,a(:,2));
A=[a(:,1) a(:,3) a(:,4)];
A=maxmin(A);%maxmin为自定义的归一化函数
b=[A(:,1) a(:,2) A(:,2) A(:,3)];
%{
%对数据进行归一化函数
function new=maxmin(old)
%找出每列的最大最小值
maxold=max(old);
minold=min(old);
%张成与old一样大小,主要对行进行复制,列不用变
m=size(old,1);
maxnew=repmat(maxold,m,1);
minnew=repmat(minold,m,1);
new=(old-minnew)./(maxnew-minnew);
end
%}
3.4 z-score标准化-代码实现
我们使用Matlab自带的zscore函数对数据进行标准化处理,结果如下:
附Matlab代码:
a = [0.1 5 5000 4.7;0.2 6 6000 5.6;0.4 7 7000 6.7;0.9 10 10000 2.3;1.2 2 400 1.8];
b=zscore(a);%将每组数据按列标准化
总结
以上就是在数学建模及Matlab应用中数据预处理的一些步骤与方法,由于博主水平有限,编写过程中尽管搜集了参考资料,但可能仍存在错误,敬请大家指正。
参考资料
[1] 【【零基础教程】老哥:数学建模算法、编程、写作和获奖指南全流程培训!-哔哩哔哩】 https://b23.tv/5W2Q9Oh
[2] zscore函数的数据标准化处理及MATLAB实现
[3] 数据标准化(一) - Z-Score标准化 - 超人老爹的文章 - 知乎
[4]Z-Score - Adamas的文章 - 知乎