数据预处理之数据变换

发布于:2022-12-24 ⋅ 阅读:(814) ⋅ 点赞:(0)

简单函数变换

在某些情况下,采取一些简单的函数变换对我们的建模会有所帮助。 比如:
当使用线性回归模型无法很好地拟合数据时,先对数据做一个 log 变换(转换成 非线性模型),再进行拟合往往会有不错的效果;
当数据跨度非常大时,数据较为稀疏,不便于计算机处理,此时对数据做一个 log10 变换可以使数据跨度变小,数据更为密集,方便运算。

 标准化变换

标准化,又称规范化,目的是将原来的度量值转换为无量纲的值,使得不同量纲 的指标可以在同一水平线上进行比较,而且除了概率模型(树模型)之外,其他模型如神经网络、最邻近分类和聚类算法等,都需要先对数据进行标准化,以消除量纲,缩放数据,加快算法的收敛速度。
MATLAB 提供了 normalize 函数对数据进行标准化,语法格式如下:
N = normalize(A, dim, method, methodtype)
A: 输入数据,指定为标量、向量、矩阵、多维数组、表或时间表。
dim: 运算维度,默认为 1,按列进行标准化; 设为 2 则按行进行标准化。
method: 字符型参数,默认为‘zscore’法,具体选项见下表:

 连续属性离散化: 也即离差标准化,公式如下:

其中,m a x maxmax 和 m i n minmin 为样本数据的最大值和最小值。该方法保留了原始数据中存在的关系,是消除量纲和数据取值范围影响的最简单的方法,缺点是若数据值集中或某个数值很大,规范化后各值会接近 0 且相差不大。

零-均值规范化: 即经过处理后均值为 0,标准差为 1,公式如下:

该方法目前使用广泛,不过均值和标准差受离群点影响较大,因此通常需要修改上述变换,比如用中位数M代替均值,用绝对标准差 \delta =\sum \left | x-W \right |.其中,W为平均数或中位数。
小数定标规范化: 通过移动属性值的小数位数,将属性值映射到 [-1,1] 之
间,移动的小数位数取决于属性值绝对值的最大值。转化公式为:

methodtype: 字符型参数,方法类型,为上一个参数“method”指定更加具体
的方法类型,具体选项见下表:

 分类变量处理

在数据挖掘过程中,算法可以直接处理数值型变量,但是算法一般无法直接处理分类变量。 分类变量没有好坏多少之分,多用 0,1,2,等数值代表一个类型,如果直接引入模型中计算容易让计算机误以为这是一个数值型变量,从而出现错误。 因此,在训练模型之前,需要对分类变量进行处理,使之转换为数值型变量。 常 见的分类变量处理方法如下:

 这里介绍一下比较热门的独热编码(one-hot Encoding):

独热编码是一种将分类变量转换为若干二进制列的方法,其中 1 表示属于该类别的样本

 MATLAB实现方法:

function data_encoded = onehot(data) 
% 独热编码函数,将分类变量转换若干二进制列
% 输入:分类变量组成的数组 data,注意数组元素均需为整数 
% 输出:编码好的数组 data_encoded 
test = abs(rem(data,1)); 
if sum(sum(test)) ~= 0 
fprintf('数组元素必须全为整数!\n' 
return 
end 
[m, n] = size(data); 
data_encoded = []; 
for k = 1:n 
    d = data(:,k); 
    labels = unique(d); %d 的类别 
num_labels = length(labels); %类别个数 
data_encoding = zeros(m,num_labels); 
    for i = 1:m 
        for j = 1:num_labels 
            if d(i) == labels(j) 
               data_encoding(i,j) = 1; 
            else
               continue 
            end 
        end 
    end 
    data_encoded =[data_encoded,data_encoding]; 
end

可以在MATLAB 命令行窗口中输入以下代码试运行onehot函数:
x = randi(3,5,1)
y = onehot(x)

先将onehot算法保存到matlab的默认工作路径,然后在命令行试运行。

连续变量离散化

连续变量离散化(又称数据分箱),是一种数据预处理方法,用于减少次要观察误差对模型的影响,降低模型过拟合的风险,使模型更加稳定。 但并非所有问题都需要做数据分箱,主要在一些分类算法中,如决策树 ID3 算法,要求自变量 都是离散型。 常见的连续变量离散化方法主要有以下三类:

(1)等宽法: 将属性的值域分成具有相同宽度的区间,区间的个数由数据本身 的特点决定或者用户指定,类似于制作频率分布表。
(2)等频法: 将相同数量的记录放进每个区间。 上述两个方法操作简单但都需要人为地规定划分区间的个数,等宽法的缺点在于对离群点比较敏感,因为离群点的出现会使得有些区间包含许多数据而另一些则数据很少,这样会严重损害所建立的决策模型。等频法避免了该问题,但却可能将相同数据值分到不同的区间以满足每个区间中固定的数据个数。
(3)(一维)聚类分析法: 首先将连续属性的值用聚类算法(如 K-Means)进行聚类,然后再将聚类得到的簇进行处理,合并得到一个簇的连续属性值做同一标记。
MATLAB 提供了 discretize 函数以实现等宽法分箱。
[Y,E] = discretize(X,N)
输入数组 X,将数组划分为 N 个宽度一致的区间(即“箱”,bin)
输出数组每个元素所在的区间的序号 Y,以及每个区间的边界 E
每个区间默认包含左边界,即 a <= x < b
Y = discretize(X,edges, ‘IncludedEdge’,side)
输入数组 X,按照 edges 进行分箱;
edges: 区间边界,输入为值递增的数值向量。 edges 中的连续元素形成离散的区间,discretize 使用这些区间 划分 X 中的数据。 默认情况下,每个区间都包括区间的左边界,除了最后一个区间,它包含区间的左右边界。
‘IncludedEdge’: 指定每个区间包含的边界。 side 为数值型参数,默认为’ left’,每个区间包含左边界,a <= x < b; 设为’right’则每个区间包含右 边界,即 a < x << span="">= b。
举 2 个栗子:
% 等宽法分箱
X = randi(10,1,10)
[Y,E] = discretize(X,3) 
% 自定义每个区间的边界进行分箱 
data = [1 1 2 3 6 5 8 10 4 4] 
edges = 2:2:10 
Y = discretize(data,edges)
Y 表示数据的每个元素属于哪个 bin。 由于值 1 超出了区间范围,因此 Y 会
在这些元素位置包含 NaN 值。

 可以直接用,不用提前保存脚本算法。

 

 


网站公告

今日签到

点亮在社区的每一天
去签到