zoukankan      html  css  js  c++  java
  • 数据预处理

    数据预处理

    处理数据缺失

    方法 具体措施
    忽略 直接删除,简单粗暴,缺失数据少的时候很管用
    手动填充 重新收集数据,需要某些领域的专业知识,可行性不高
    自动填充 取中位数或者平均数

    离群点检测 OUTLIER

    世界之大,无奇不有,有时候明显和其他数据格格不入的数据,并不一定是错误的点,比如我们身边平时很少有身高超过2m的人,但是这是的的确确存在的。

    尽管如此,我们在训练模型的时候为了更加符合常识,囊括更多的情况,就不能让这些点干扰我们的模型,此时这些点就被界定为“离群点”。

    下面介绍课程中的一种算法:基于密度的局部离群点检测

    定义

    (reachdistance_k(A,B)):可达距离,理解为定义一个A到B的距离的度量即可

    (k-distance(B)):对象B的第k领域距离

    (d(A,B)):A点到B点的距离(可以是欧式距离)

    (reachdistance_k(A,B) = max{k-distance(B),d(A,B)})

    (lrd(A)=frac{|N_kA|}{sum_{B∈N_k(A)}reachdistance_k(A,B)})

    (N_k(A))表示临近点的集合

    (lrd(A))表示度量A点到相邻点的相近程度

    单单看lrd(A)并不能得出什么,需要采用相对的概念对其进行描述

    (LOF_k(A) = frac{sum_{B∈N_k(A)}{frac{lrd(B)}{lrd(A)}}}{{N_k(A)}})

    如果A和相邻的点比较远,除了A点之外的点和它们各自的近邻比较近,相比之下A就可以被认为是一个离群点。

    更多的参照这个博客:https://blog.csdn.net/mw21501050/article/details/75389267

    重复数据判别

    有时候,由于网络原因,客户可能重复提交数据,导致数据库中出现相同的数据,又或者同名同姓的人在同一个数据库中提交了记录。这些情况都要视各个领域的不同而具体制定不同的处理方案。

    对于简单的完全重复数据,可以采用滑动窗口的方法对其进行剔除。但是这是基于重复的数据互相挨得很近的假设,毕竟现在是大数据时代,对于如此海量的数据维持一个滑动窗口实在是不太可能。

    数据类型编码

    数据可以是连续的、离散的、抽象的、具体的,可以是文本数据,可以是音频数据,对于无法转换成数值数据的需要将他们进行编码,才可以导入模型进行计算。

    one-hot 编码

    区别于{low,media,high}这样的有序数据,更多的数据是像{医生、工程师、老师}这样的数据,数据类型之间是平等的,并不存在先后排名。

    one-hot编码则是形成一个矩阵,每个特征作为单独的一列

    这种编码方式的缺点也很明显,特征维数高了之后矩阵的规模是巨大的。

    数据采样

    数据量很大时

    受限于IO,读取所有的数据太费时费力,而且是不必要的,但是读取部分数据的同时又要保持数据的完整特征,才能保证训练出来的模型的正确性。

    不平衡数据集

    数据的不平衡指的是数据集中一种类别的样本远超另一种类别。

    衡量不平衡度

    (G-mean = (Acc^{+} + Acc^{-})^{1/2})

    其中(Acc^{+}=frac{TP}{TP+FN} ,Acc^{-}=frac{TN}{TN+FP})

    (F-measure = frac{2 imes Precision imes Recall}{Precision + Recall})

    其中(Precision = frac{TP}{TP+FP} ,Recall = frac{TP}{TP+FN})

    解决方案

    SMOTE算法:手动生成较少的类的数据,一种简单的做法就是按照随机正态分布在每个点的周边生成点

    描述数据

    协方差、中位数、平均数、方差

    数据可视化

    见本人博客:https://www.cnblogs.com/seaman1900/p/15356531.html

    特征选择

    信息&熵&信息增益

    往信息增益高的特征选择

    参见我的博文:https://www.cnblogs.com/seaman1900/p/15314895.html

    以随机森林剪枝为例:

    搜索算法

    模拟退火、贪心搜索、遗传算法

    PCA——主成分分析

    网课中省略了太多知识点,在这里进行一一详细说明

    首先引入协方差

    (Cov(a,b)=frac{1}{m-1}{sumlimits_{i=1}^{m}(a_i-μ_a)(b_i-μ_b)})

    一般来说,数据的处理需要去除平均值,也就使得

    (Cov(a,b)=frac{1}{m-1}{sumlimits_{i=1}^{m}(a_ib_i)})

    对于协方差来说:

    (Cov(a,b)>0,a,b正相关)

    (Cov(a,b)<0,a,b负相关)

    (Cov(a,b)=0,a,b关系不确定)

    网课上还有一个难以理解的问题,突然给出了(S(x)=frac{1}{n-1}XX^T)

    现在看来豁然开朗,这个(frac{1}{n-1})来自于协方差,将上面的式子展开就可以得到一个协方差矩阵,同时也是对称阵,对角线上表示的是方差,下面以二维矩阵为例子展示:

    (frac{1}{n-1}XX^T=left[egin{matrix}Cov(a,a)&Cov(a,b)\Cov(b,a)&Cov(b,b)end{matrix} ight])

    联系协方差的特性,我们的目标和工具也就逐渐清晰起来:将一组 N 维向量降为 K 维,其目标是选择 K 个单位正交基,使得原始数据变换到这组基上后,各变量两两间协方差为 0(即除了对角线上的数,其他都尽量接近0即可),而变量方差则尽可能大(在正交的约束下,取最大的 K 个方差)

    那么如何才能使得变换后的协方差尽可能小,方差尽可能大呢?

    将这个问题转换为拉格朗日问题

    我们给定原始矩阵(X)(去除过均值),给定变换之后的基为(omega),变换后的坐标为(Xomega)样本的方差描述为(推导过程看这里:https://zhuanlan.zhihu.com/p/77151308)

    (D = omega ^T (frac{1}{n-1}XX^T) omega)

    中间的不就是原样本的协方差矩阵嘛,列成拉格朗日问题的形式

    (left{egin{matrix}max{omega ^T S omega} \ s.t.omega^Tomega =1end{matrix} ight})

    (L(omega)=omega ^TSomega+lambda(1-omega ^Tomega))

    (omega)进行求导,这里就涉及了矩阵求导的知识,这里列了一个表格可以快速查询:https://blog.csdn.net/a493823882/article/details/81324037

    求导之后的值是:(Somega = lambdaomega)

    此时(D=lambda)

    因此,(X)投影后的方差就是协方差矩阵的特征值。我们要找到最大方差也就是协方差矩阵最大的特征值,最佳投影方向就是最大特征值所对应的特征向量,次佳就是第二大特征值对应的特征向量,以此类推

    求解步骤

    设有 m 条 n 维数据。

    1. 将原始数据按列组成 n 行 m 列矩阵 X;
    2. 将 X 的每一行进行零均值化,即减去这一行的均值;
    3. 求出协方差矩阵(C = frac{1}{n-1}XX^T)
    4. 求出协方差矩阵的特征值及对应的特征向量;
    5. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k 行组成矩阵 P;
    6. (Y=PX)即为降维到 k 维后的数据。

    LDA——线性判别分析

    区别于PCA,LDA是无监督的降维技术,中心思想:投影后类内方差最小,类间方差最大

    二类LDA——分两类

    我们定义

    (mu_i=frac{1}{N_j}sumlimits_{x∈X_j}x(i=0,1))

    表示同类数据的中心点的距离

    (sum_j=sumlimits_{x∈X_j}(x-mu_j)(x-mu_j)^T(j=0,1))

    表示同一类别数据的散度

    由于LDA需要让不同类别的数据的类别中心之间的距离尽可能的大,也就是我们要最大化(||omega ^Tmu_0-omega^Tmu_1||_2^2),同时我们希望同一种类别数据的投影点尽可能的接近,也就是要同类样本投影点的协方差(omega^Tsum_jomega)尽可能的小,即最小化(omega^Tsum_0omega+omega^Tsum_1omega)

    因此定义一个数用来描述我们的优化目标:

    (J(omega)=frac{||omega ^Tmu_0-omega^Tmu_1||_2^2}{omega^Tsum_0omega+omega^Tsum_1omega}=frac{omega^T(mu_0-mu_1)(mu_0-mu_1)^Tomega}{omega^T(sum_0+sum_1)omega})

    为了简化计算,定义类内散度矩阵

    (S_omega=(sum_0+sum_1))

    同时定义类间散度矩阵

    (S_b=(mu_0-mu_1)(mu_0-mu_1))

    简化之后的东西又叫做广义瑞利熵,根据这个东西的性质可以求得,有能力还可以直接求导获得

    (omega = S_omega ^{-1}(mu_0-mu_1))

    具体分析过程见这个博客:https://www.cnblogs.com/pinard/p/6244265.html

    LDA流程

    输入:数据集(D={(x1,y1),(x2,y2),...,(x_m,y_m)}),其中任意样本(x_i)(n)维向量,(y_i∈{C1,C2,...,Ck},y_i∈{C_1,C_2,...,C_k}),降维到的维度(d)

    输出:降维后的样本集(D′)

    1. 计算类内散度矩阵(S_omega)

    2. 计算类间散度矩阵(S_b)

    3. 计算矩阵(S^{−1}_wS_b)

    4)计算(S^{−1}_wS_b)的最大的(d)个特征值和对应的(d)个特征向量((w_1,w_2,...w_d)),得到投影矩阵(W)

    1. 对样本集中的每一个样本特征(x_i),转化为新的样本(z_i=W^Tx_i)

    2. 得到输出样本集(D′={(z1,y1),(z2,y2),...,(zm,ym)})

  • 相关阅读:
    SpringBoot相知
    SpringBoot初识
    Mybatis 3 配置 Log4j
    IdeaVim-常用操作
    [ZZ] 基于Matlab的标记分水岭分割算法
    [综] meanshift算法
    [ZZ] 麻省理工( MIT)大神解说数学体系
    [ZZ] UIUC同学Jia-Bin Huang收集的计算机视觉代码合集
    公务员 素养
    [zz]有哪些优秀的科学网站和科研软件推荐给研究生?
  • 原文地址:https://www.cnblogs.com/seaman1900/p/15356565.html
Copyright © 2011-2022 走看看