数据预处理之数据清洗
1 缺失值、异常值的检测和处理
1.1 缺失值处理
若对单个数据求均值(mean),如果数据中含有缺失值,MATLAB 会返回一个空值(NaN),此时即表示数据中存在缺失值:
(1)寻找缺失值(ismisssing/isnan)
TF=ismissing(A)
A为输入数组,可以是向量、矩阵或多维数组等
TF为输出的逻辑数组,指示数组或表中有哪些元素包含缺失值。TF 的大小与A的大小相同。”1“代表缺失值,‘0’则不是。
ismissing的用法和isnan相同
% ismissing 寻找缺失值案例
%随机生成6*4数据矩阵
A=randi(10,6,4);
%替换一些值为缺失值
A(3:4,2)=nan
%输出数据矩阵
disp(A)
%寻找缺失值,1代表缺失值所在的位置
ismissing(A)
对于缺失值处理,我们要分情况讨论。
如果某个变量或某个样本缺失了70%以上的数据,那么此时对数据进行填补的话会引入更多的噪声,反而会降低模型的性能,故此时一般直接将该变量或样本删除。
MATLAB 中删除缺失值的函数(另外补充)
如果缺失的不多,我们可以考虑对缺失值进行填补。
以下重点介绍MATLAB中删除和填补缺失值的两个函数:
(2)删除缺失值(rmmissing)
[R ,TF]=rimissing(A,dim)
A为输入数组,可以是向量、矩阵或多维数组等
dim:运算维度,默认为1,删除缺失值所在行,设为2则删除缺失值所在列
R为删除缺失值条目后的数据
TF为已删除条目的指示符。
rimissing 这个函数比较简单粗暴,只要把缺失值所在行善良,谨慎使用。
(3)填补缺失值
方法1:常数填充,如用常数1填充
F=fillmisssing(A,'constant',1)
方法2:F=fillmissing(A,method)
method 是一个字符型参数,指填充缺失值的方法,MATLAB提供以下几种方法:
| method | 说明 |
|---|---|
| ‘previous' | 上一个非空值 |
| 'next' | 下一个非空值 |
| ’nearest‘· | 最邻近的非空值 |
| 'linear' | 线性插值 |
| 'spline' | 三次样条插值 |
| 'pchip' | 保形三次样条插值 |
方法3:F = fillmissing(A,movmethod,window)
移动窗口填充法,该方法的思想是在缺失值前后开一个“窗口”,用“窗口”内的数据的均值或中位数进行填充。
方法(movmethod)说明
‘movmean’窗口长度为 window 的移动均值
‘movmedian’窗口长度为 window 的移动中位数
举个栗子:
x = [4,2,5,3,nan,8,1,5,9]
fillmissing(x,'movmean',7)

window 表示窗口长度,必须是一个正整数。如果window是正整数标量,则窗口以当前元素为中心并且包含window-1各相邻元素。如果window是偶数,则窗口以当前元素和上一个元素为中心。
| 插补可用方法 | 方法描述 |
|---|---|
| 均值、中位数、众数插补 | 根据属性值的类型,用该属性取值的平均值、中位数、众数进行插补。 |
| 使用固定值 | 将缺失的属性值用一个常量替换。如广州的一个工厂普通外来务工人员的基本工资属性的空缺值可以用工资标准来填补,该方法就是使用固定值。 |
| 最近临插补 | 在记录中找到与缺失样本最接近的样本的该属性值的插补 |
| 回归方法 | 对带有缺失值的变量,根据已有数据和与其有关的其他变量(因变量)的数据建立拟合模型来预测缺失值的属性值。 |
| 插值法 | 插值法利用已知点建立合适的插值函数 ,未知值由对应点 求出的函数值 近似代替。 |
其中,插值法有Hermite 插值、分段插值、样条插值法,而最主要的有拉格朗日
插值法和牛顿插值法。
1.2 异常值处理
异常值是指样本中明显异于其他值的点,好比与羊群走散的落单羊。 我们要做的就是找到这只落单的羊并把它赶回羊群。 MATLAB 提供了以下两个函数处理异常值:
(1)检测异常值(isoutlier)
TF = isoutlier(A,method)
A 为输入数组,可以是向量、矩阵或多维数组等。
TF 是一个逻辑数组,用 1 标识异常值的位置。
method: 字符型参数 ,指定异常值检测的方法。 方法选项如下表:

(2)检测并替换异常值(filloutlier)
B = filloutliers(A,fillmethod,findmethod)
A 为输入数组,可以是向量、矩阵或多维数组等。
findmethod:字符型参数,指定异常值检测的方法。方法选项与上文 isoutlier
相同。
fillmethod: 填充方法,数值或字符型变量,方法选项如下表:
B为替换异常值后的数据。
| 填充方法 | 说明 |
|---|---|
| 数值标量 | 用指定的数值进行填充,如数字1 |
| ’center‘ | 使用由findmethod决定的中心值进行填充 |
| ’clip' | 对于比findmethod决定的下阈值还小的元素,用下阈值填充。对于比findmethod决定的上阈值还大的元素,用上阈值填充 |
| 'previous' | 使用上一个非离群值进行填充 |
| 'next' | 使用下一个非离群值进行填充 |
| 'nearest' | 使用最接近的非离群值进行填充 |
| 'linear' | 使用相邻的非离群值的线性插值进行填充 |
| 'spline' | 使用分段三次样条插值进行填充 |
| 'pchip' | 使用 保形分段三次样条 |
| 异常值处理方法 | |
|---|---|
| 删除含有异常值的记录 | 直接将异常值删除 |
| 视为缺失值 | 将异常值视为缺失值,利用缺失值处理方法 |
| 平均值修正 | 可用前后两个观测值的平均值修正该异常值 |
| 不处理 | 直接在具有异常值的数据集上进行挖掘建模 |
1.3重复值处理
若样本中含有相同的重复数据,将会导致样本不唯一,使得机器学习算法对同一
样本反复学习,容易导致模型过拟合。 因此,去重是数据挖掘过程中的一个必
备过程。 MATLAB 提供了 unique 函数来去除重复值。
% 返回 A 中所有唯一值
C = unique(A)
% 添加参数‘rows’,返回 A 中所有不重复的唯一行
C = unique(A, ‘rows’)

,未知值由对应点
求出的函数值
近似代替。