数据预处理

为什么要进行数据的预处理

  • 现实世界的数据是“肮脏的”
    • 不完整的:有些感兴趣的属性缺少属性值,或仅包含聚集数据
    • 含噪声的:包含错误或者“孤立点”
    • 不一致的:在编码或者命名上存在差异
  • 没有高质量的数据,就没有高质量的挖掘结果
    • 准确性
    • 完整性
    • 一致性
    • 时效性:及时更新
    • 可信性:数据是否被用户信赖
    • 可解释性:数据是否容易理解

主要任务

  1. 数据清理

    • 空缺值,噪声数据,删除孤立点,解决不一致性

    • 如果用户认为数据是脏的,那么可信性会降低

  2. 数据集成

    • 集成多个数据库、数据立方体或文件
  3. 数据归约

    • 得到数据集的压缩表示,但可以得到相同或相近的结果

    • 维归约:小波变换,主成分分析,属性子集选择,属性构造

    • 数值规约:参数模型,非参数模型

  4. 数据变换

    • 规范化和聚集
  5. 数据离散化

    • 将连续数据进行离散处理

数据清理

  1. 空缺值

    • 忽略元组 :当类标号缺少时通常这么做(假定挖掘任务设计分类或描述),当每个属性缺少值的百分比变化很大时,它的效果非常差。

    • 人工填写空缺值

      • 工作量大,可行性低

      • 使用一个全局变量填充空缺值:比如使用$unknown$或$-∞$替换

        • 尽管简单,但程序可能会认为这些空缺形成了一个有趣的概念:unknown,也可能会使数据有偏
    • 使用属性的平均值填充空缺值:可能有偏

    • 使用与给定元组属同一类的所有样本的平均值:可能有偏

      • 使用最可能的值填充空缺值:使用像Bayesian公式或判定树这样预测的方法,可能有偏
    • 相当场合下,数据有空缺不意味着错误

  2. 噪声:一个测量变量中的随机错误或偏差

    • 处理噪声数据
      • 分箱binning:首先排序数据,并将他们分到等深的箱中然后可以按箱的平均值平滑、按箱中值平滑、按箱的边界平滑等等
      • 回归regression:用回归函数预测
      • 离群点分析outlierAnalysis:利用聚类检测离群点

数据集成

困难:数据语义的多样性和结构带来的实体识别问题

  • 匹配来自不同数据源的现实世界的实体
  • 检测并解决数据值的冲突
    • 对现实世界中的同一实体,来自不同数据源的属性值可能是不同的
    • 可能的原因:不同的数据表示,不同的度量等等

冗余和相关分析

  • 标称数据的$\chi^2$相关检验
    • 相依表:![alt text](D:/Desktop/myfile/UESTC undergraduate course/Grade Ⅳ/数据挖掘和大数据分析/notes/认识数据和数据预处理/image-5.png)
    • 期望频度:$e_{ij}=\frac{N(A=a_i)N(B=b_j)}{n}$
    • 观测频度:相依表中的实际计数$\sigma_{ij}$
    • $Pearson \chi^2$统计量:$\chi^2 = \sum_{i}\sum_{j}\frac{(\sigma_{ij}-e_{ij})^2}{e_{ij}}$
  • 数值数据的相关系数
    • $Pearson$相关系数:$r_{A,B}=\frac{\sum_{i}(a_i-\bar{A})(b_i-\bar{B})}{(n-1)\sigma_A\sigma_B}$
    • $R_{A,B}=0$意味着两类属性独立,$R_{A,B}$越接近1,意味着某一个越可能是冗余项,越接近-1,意味着存在相互阻碍的效应,但是相关性不蕴含因果关系
  • 数据数值的协方差
    • 协方差:$Cov(A,B)=\frac{\sum_{i}(a_i-\bar{A})(b_i-\bar{B})}{n}$
    • $r_{A,B}=\frac{Cov(A,B)}{\sigma_A\sigma_B}$
    • $Cov(A,B)=E(AB)-E(A)E(B)$
    • 描述两个属性如何一起变化
    • 协方差0不蕴含独立性

数据规约

用来得到数据集的归约表示,它小得多,但可以产生相同的(或几乎相同的)分析结果

  • 维归约: 减少考虑的属性个数
  • 数量规约:用较小的数据表示形式替代原数据,分为 参数的和非参数的
  • 数据压缩:使用某种变换

小波变换

  • 离散小波变换DWT
    • 变换后的数据可以仅存放一小部分最强的小波系数
    • 对于相同的近似,DWT比DFT需要的空间少,局部性更好
    • 适合高维数据
  • 属于维规约,保存小波较大的系数进行原始数据的压缩,主要用于图像分析中。
  • 属于有损压缩

PCA方法&K-L变换

    • 搜索k个最能代表数据的n维正交向量
    • 适合处理稀疏的和倾斜的数据
    • 可以作为多元回归和聚类分析的输入
  • 找到一个投影,其能表示数据的最大变化
  • 属于维规约

特征筛选

目的:通过删除不相干的属性或维减少数据量

挑战:d个属性有$2^d$个可能的子集 ,枚举所有几乎不可行

策略:启发式的方法:逐步向前选择,逐步向后删除,向前选择和向后删除相结合

算法:信息增益, 互信息, Relief,卡方分析

直方图

将数据划分成不相交的桶

规则:等宽,等深,V-最优,MaxDiff

回归

回归:将数据拟合成直线

对数线性模型:近似离散的多维概率分布

聚类

将数据元组看成对象,将他们划分成簇,每一簇的对象互相相似,簇的直径越大,质量越好

抽样

  • 无放回简单随机抽样SRSWOR
  • 有放回简单随机抽样SRSWR
  • 簇抽样
  • 分层抽样

数据变换

最小-最大规范化

将数据集X映射到区间A

$Normal(v)=min(A)+\frac{x-min(X)}{max(X)-min(X)}(max(A)-min(A))$​

零均值规范化

实际最大值最小值未知,或者离群点影响对最大最小规范化影响太大时,该方效果较好

$Normal(v)=\frac{x-\bar X}{\sigma_X}$​

离散化和概念分层

  1. 分箱(binning):分箱技术递归的用于结果划分

  2. 直方图分析(histogram):直方图分析方法递归的应用于每一部分,可以自动产生多级概念分层。

  3. 聚类分析:将数据划分成簇,每个簇形成同一个概念层上的一个节点,每个簇可再分成多个子簇,形成子节点。

  4. 基于信息熵的方法等

第四章:数据仓库和联机分析处理

  • 构建数据仓库: 数据清理,数据集成,数据变换
  • 数据仓库提供OLAP工具

4.1 数据仓库:基本概念

4.1.1 什么是数据仓库

  • 面向问题
  • 集成的
  • 时变的
  • 非易失的
  • 支持管理者的决策过程
  • 更新驱动的:将多个异构数据库的信息预先集成,重新组织到语义一致的数据存储(不必像查询驱动方法,和局部数据源竞争资源)

4.1.2 操作数据库系统与数据仓库的区别

  • 联机事务处理OLTP:联机事务,查询处理
  • 联机分析处理OLAP:用不同格式组织数据
  • 区别:
    • OLTP面向顾客,OLAP面向市场
    • OLTP数据琐碎难以用于决策,OLAP汇总集成数据,有利于决策
    • OLTP采用ER数据模型(实体-联系)和面向应用的数据库设计,OLAP通常采用星形或雪花模型和面向主题的数据库设计
    • OLTP主要关注企业当前数据,OLAP常常跨越数据库模式
    • 访问模式:OLTP主要由原子事务组成,OLAP大量只读操作

4.1.3 为什么需要分离的数据仓库

  • 在操作数据库上进行OLAP查询,可能会使得操作任务性能降低
  • OLAP查询对汇总数据记录进行只读访问,不适用操作数据库的多事务的并发处理
  • 两种数据库路的结构内容和用法不相同

4.1.4 数据仓库:一种多层体系结构

  • 底层: 仓库数据服务器
  • 中间层:OLAP服务器
  • 前端客户层

4.1.5 数据仓库模型:企业仓库、数据集市和虚拟仓库

  • 企业仓库:搜集了关于主题的全部信息
  • 数据集市:范围限定与选定主题
  • 虚拟仓库:操作数据库上视图的集合

4.1.6 数据提取、变换和装入

  • 利用后端工具加载和刷新数据
  • 数据提取,清理,变换,装入,刷新

4.1.7 元数据库

  • 数据仓库结构的描述
  • 操作元数据
  • 用于汇总的算法
  • 由操作环境到数据仓库的映射
  • 关于系统性能的数据
  • 商务元数据

4.2 数据仓库建模:数据立方体与OLAP

4.2.1 什么是数据立方体:一种多为数据模型

  • 维,维表
  • 事实,事实表
  • 基本方体,顶点方体:诸维每个可能子集形成方体的格
  • ![1710852368991](D:/Desktop/myfile/UESTC undergraduate course/Grade Ⅳ/数据挖掘和大数据分析/notes/认识数据和数据预处理/image/第四章:数据仓库和联机分析处理/1710852368991.png)

4.2.2 星形,雪花形和事实星座:多为数据模型的模式

  • 星形模式:
    ![1710852509245](D:/Desktop/myfile/UESTC undergraduate course/Grade Ⅳ/数据挖掘和大数据分析/notes/认识数据和数据预处理/image/第四章:数据仓库和联机分析处理/1710852509245.png)
  • 事实星座:
    ![1710852610476](D:/Desktop/myfile/UESTC undergraduate course/Grade Ⅳ/数据挖掘和大数据分析/notes/认识数据和数据预处理/image/第四章:数据仓库和联机分析处理/1710852610476.png)

4.2.3 维:概念分层的应用

  • 模式分层:形成数据库模式中的属性的全序和偏序的概念分层
  • 集合分组分层:将给定位或属性的值离散化

4.2.4 度量的分类和计算

度量根据所用的聚集函数分为3类

  • 分布式:聚集函数例如sum(),min(),max(),count()函数用于划分数据集的得到的聚集值的结果和函数用于不划分的数据集结果一致
  • 代数的:聚集函数可以用让若干参数计算,这些参数可以用分布聚集函数求得,比如avg=sum()/count()
  • 整体的:不存在有限个参数的代数函数可以计算出来,比如median(),mode(),rank()

4.2.5 典型的OLAP操作

  • 上卷
  • 下钻
  • 切片
  • 转轴

4.2.6 查询多为数据库的星网查询模型

  • ![1710853897932](D:/Desktop/myfile/UESTC undergraduate course/Grade Ⅳ/数据挖掘和大数据分析/notes/认识数据和数据预处理/image/第四章:数据仓库和联机分析处理/1710853897932.png)

4.3 数据仓库的设计与使用

4.3.1 数据仓库的设计的商务分析框架

  • 自顶向下视图
  • 数据源视图
  • 数据仓库视图
  • 商务查询视图

4.3.2 数据仓库的设计过程

  • 自顶向下
  • 自底向上
  • 二者结合的混合设计

4.3.3 数据仓库用于信息处理

三类数据仓库应用:

  • 数据处理
  • 分析处理
  • 数据挖掘

4.3.4 从联机分析处理到多维数据挖掘

多维数据挖掘OLAM:数据挖掘与OLAP技术的集成

4.4 数据仓库的实现

4.4.1 数据立方体的有效计算:概述

  • compute cube操作和维灾难
    • $\text{方体总数}=\prod(\text{关联层数}_i+1)$
  • 部分物化:方体的选择计算
    • 物化一个外壳立方体:与计算少量维,其他的组合查询临时计算

4.4.2 索引OLAP数据:位图索引和连接索引

  • 位图索引:
    ![1710855256882](D:/Desktop/myfile/UESTC undergraduate course/Grade Ⅳ/数据挖掘和大数据分析/notes/认识数据和数据预处理/image/第四章:数据仓库和联机分析处理/1710855256882.png)
  • 连接索引
    ![1710855448916](D:/Desktop/myfile/UESTC undergraduate course/Grade Ⅳ/数据挖掘和大数据分析/notes/认识数据和数据预处理/image/第四章:数据仓库和联机分析处理/1710855448916.png)

4.4.3 OLAP查询的有效处理

  • 确定哪些操作可以在可利用的方体执行
  • 确定相关操作应该使用哪些物化的方体

4.4.4 OLAP服务器结构

  • 关系OLAP服务器ROLAP
  • 多维OLAP服务器HOLAP
  • 混合OLAP服务器
  • 特殊的SQL服务器

4.5 数据泛化:面向属性的归纳

4.5.1 数据特征的面向属性的归纳

  • 基本操作:数据泛化
    • 属性删除
    • 属性泛化
      • 属性泛化阈值控制
      • 广义关系阈值控制

4.5.2面向属性归纳的有效实现

  • 关系查询
  • 收集初始关系的统计量
  • 导出主关系P

4.5.3 类比较的面向属性归纳

如何进行类比较?

  • 数据收集
  • 相关维分析
  • 同步泛化
  • 导出比较的表示

挖掘频繁模式、关联和相关性:基本概念和方法

概念

  • 频繁模式:频繁地出现在数据集中的模式(项集,序列,子结构)
  • 频繁项集:频繁出现在交易数据集中的商品
  • 频繁序列模式:交易序列频繁地出现购物历史中

购物篮分析

  • 商品是否被购买代表一个bool向量
  • 购物篮可用一个bool向量代替
  • 关联规则举例
    $computer\to software[support = 2% ; confidence = 60% ]$
    support支持度:computer和software被同时购买的占全体事务的比例
    confidence置信度:在购买computer的顾客同时购买software的频率
    如果一条关联规则满足最小置信度和最小支持度阈值,那么认为这条规则是有趣的

频繁项集,闭项集和关联规则

  • 事务TID:每个事务的标识
  • 规则$A\to B$,在事务集中成立,具有支持度$s$,置信度$c$
    $s=P(AB),c=P(B|A)$
  • 满足最小置信度和支持度的规则被认为是强的
  • 挖掘关联规则可以归结为挖掘频繁项集
    1. 找出全体频繁项集
    2. 从频繁项集中产生强规则
  • 反单调性:
    • 在数据集的某一个项集,增加一项不会使得它的支持度变高
    • 频繁项集的非空子集也是频繁项集
    • 非频繁项集的超集不会是频繁项集
  • 如果X是闭项集,如果不存在Y,$X \subset Y$,Y与X具有相同的支持度
    • (X添加一个元素都会使得其支持度降低)
  • 如果X是极大项集,如果X是频繁项集,且不存在Y,$X \subset Y$,Y是频繁的
    • (X添加一个元素甚至会导致支持度小于阈值)
  • 闭频繁项集包含频繁项集的所有信息

频繁项集挖掘方法

Apriori算法:通过限制候选产生发现频繁项集

  1. 数据预处理
    1. 找到全体频繁1项集
    2. 按照支持度降序给每个事务重新排序
  2. 递归连接
    1. 假设生成全体频繁k项集$L_k$,对于每一个可连接的$l_i,l_j\in L_k$,
      • 称频繁k项集a,b可连接,如果它们前k-1项相同但是最后一项不同
    2. 将$L_i \cup L_j$ 加入$L_{k+1}$
  3. 剪枝
    • 扫描刚刚生成的$L_{k+1}$,剪去那些非频繁的项集

由频繁项集产生关联规则

  • 对于某一个频繁项集$L$,其自动满足关联规则的支持度规则,因此划分称两个部分$L=A\cup B$
  • 如果$A\to B$满足置信度规则,那么这个关联规则就是强规则

提高Apriori算法的效率

  • 基于散列的技术:
    • 一个其hash桶的计数小于阈值的k-itemset 不可能是频繁的
  • 事务压缩
    • 不包含任何频繁k项集的事务不可能包含任何频k+1项集
    • 因此这些事务在其后的考虑中,可以加上标记或删除
  • 划分
    • 原理:项集在DB中是频繁的, 它必须至少在DB的一个划分中是频繁的
    • 扫描 1: 划分数据库, 并找出局部频繁模式 local frequent itemset
    • 扫描 2: 求出全局频繁模式
  • 抽样

挖掘频繁模式的增长算法

  • FP-growth算法

    1. 建立FP树

      • 创建根节点null

      • 找到频繁1项集

      • 全体事务按照支持度递减顺序处理

      • 事务按照次序建字典树,同时标记权重

        • 考虑为一个事务增加分枝时,沿共

        • 向上同前缀每个结点计数加1,再创建结点和连接

        • 创建项头表,每项通过结点链指向树上的位置

          image-20240528171902886

    2. 挖掘频繁模式

      • 从项头表的后面向前考虑
      • 对于当前项在树上的每一个位置,开始爬树,生成条件模式基
      • 把新的条件模式基看成新的事务集,建立条件FP树

    image-20240528172315980

    1. 特点:
      • FP增长算法对长和短的模式都是有效且可伸缩的
      • 效率比Apriori算法快了一个数量级
      • 对内存要求较大, 算法实现相对复杂

哪些模式是有趣的:模式评估方法

强规则不一定是有趣的

尽管关联规则有可能满足最小置信度和最小支持度,但是置信度小于没有关联规则的概率时,关联规则就具有误导性了;

从关联分析到相关分析

强规则不一定是有趣的,甚至是“误导”的。

原因:置信度的缺点在于该度量忽略了规则后件中项集的支持度。

  • 提升度(兴趣因子)
    • $lift(A,B)=\frac{P(AB)}{P(A)P(B)}=\frac{P(B|A)}{P(B)}$
    • 描述A出现对B出现的提升程度
  • $\chi^2$分析
    • $\chi^2 = \sum_{i}\sum_{j}\frac{(\sigma_{ij}^2-e_{ij})}{e_{ij}}$
    • $\chi^2$大于1,说明负相关

模式评估度量比较

  • 下面每种越接近1,A,B联系越紧密
    • 全置信度
      • $all_{conf}(A,B)=min{P(A|B),P(B|A)}$
    • 最大置信度
      • $all_{conf}(A,B)=max{P(A|B),P(B|A)}$
    • Kule度量
      • $Kule(A,B)=\frac{P(A|B)+P(B|A)}{2}$
    • 余弦度量
      • $cosine(A,B)=\sqrt{P(A|B)\times P(B|A)}$
  • 对于指示有趣的模式联系,哪个最好?
    • 不平衡比$IR=\frac{|sup(A)-sup(B)|}{sup(A)+sup(B)-sup(AB)}$
    • $IR$越接近0,四种度量越平衡

挖掘频繁模式、关联和相关性:基本概念和方法

  • 频繁模式:频繁地出现在数据集中的模式(项集,序列,子结构)
  • 频繁项集:频繁出现在交易数据集中的商品
  • 频繁序列模式:交易序列频繁地出现购物历史中

6.1 基本概念

6.1.1 购物篮分析

  • 商品是否被购买代表一个bool向量
  • 购物篮可用一个bool向量代替
  • 关联规则举例
    $computer\to software[support = 2% ; confidence = 60% ]$
    support支持度:computer和software被同时购买的占全体事务的比例
    confidence置信度:在购买computer的顾客同时购买software的频率
    如果一条关联规则满足最小置信度和最小支持度阈值,那么认为这条规则是有趣的

6.1.2 频繁项集,闭项集和关联规则

  • 事务TID:每个事务的标识
  • 规则$A\to B$,在事务集中成立,具有支持度$s$,置信度$c$
    $s=P(AB),c=P(B|A)$
  • 满足最小置信度和支持度的规则被认为是强的
  • 挖掘关联规则可以归结为挖掘频繁项集
    1. 找出全体频繁项集
    2. 从频繁项集中产生强规则
  • 反单调性:
    • 在数据集的某一个项集,增加一项不会使得它的支持度变高
    • 频繁项集地非空子集也是频繁项集
    • 非频繁项集的超集不会是频繁项集
  • 如果X是闭项集,如果不存在Y,$X \subset Y$,Y与X具有相同的支持度
    • (X添加一个元素都会使得其支持度降低)
  • 如果X是极大项集,如果X是频繁项集,且不存在Y,$X \subset Y$,Y是频繁的
    • (X添加一个元素甚至会导致支持度小于阈值)
  • 闭频繁项集包含频繁项集的所有信息

6.2 频繁项集挖掘方法

6.2.1 Apriori算法:通过限制候选产生发现频繁项集

  1. 数据预处理
    1. 找到全体频繁1-项集
    2. 按照支持度降序给每个事务重新排序
  2. 递归连接
    1. 假设生成全体频繁k项集$L_k$,对于每一个可连接的$l_i,l_j\in L_k$,
      • 称频繁k项集a,b可连接,如果它们前k-1项相同但是最后一项不同
    2. 将$L_i \cup L_j$ 加入$L_{k+1}$
  3. 剪枝
    • 扫描刚刚生成的$L_{k+1}$,剪去那些非频繁的项集

6.2.2 由频繁项集产生关联规则

  • 对于某一个频繁项集$L$,其自动满足关联规则的支持度规则,因此划分称两个部分$L=A\cup B$
  • 如果$A\to B$满足置信度规则,那么这个关联规则就是强规则

6.2.3 提高Apriori算法的效率

  • 基于散列的技术:
    • 一个其hash桶的计数小于阈值的k-itemset 不可能是频繁的
  • 事务压缩
    • 不包含任何频繁k项集的事务不可能包含任何频k+1项集
    • 因此这些事务在其后的考虑中,可以加上标记或删除
  • 划分
    • 原理:项集在DB中是频繁的, 它必须至少在DB的一个划分中是频繁的
    • 扫描 1: 划分数据库, 并找出局部频繁模式 local frequent itemset
    • 扫描 2: 求出全局频繁模式
  • 抽样

6.2.4 挖掘频繁模式的增长算法

  • FP-growth算法
    1. 建立FP树
      • 创建根节点null
      • 找到频繁1项集
      • 全体事务按照支持度递减顺序处理
      • 事务按照次序建字典树,同时标记权重
        • 考虑为一个事务增加分枝时,沿共
        • 向上同前缀每个结点计数加1,再创建结点和连接
        • 创建项头表,每项通过结点链指向树上的位置
        • alt text
    2. 挖掘频繁模式
      • 从项头表的后面向前考虑
      • 对于当前项在树上的每一个位置,开始爬树,生成条件模式基
      • 把新的条件模式基看成新的事务集,建立条件FP树

6.2.5 使用垂直模式格式挖掘频繁项集

  • 等价类变换Eclat
    • alt text
    • alt text
    • 假设得到频繁k项集的垂直模式
    • 取两两的TID集的交,将生成的频繁k+1项集

6.2.6 挖掘闭模式和极大模式

  • 策略:挖掘过程中直接识别闭项集,识别成功后尽早剪枝
    • 项合并剪枝
    • 子项集剪枝
    • 项跳过

6.3 哪些模式是有趣的:模式评估方法

6.3.1 强规则不一定是有趣的

尽管关联规则有可能满足最小置信度和最小支持度,但是置信度小于没有关联规则的概率时,关联规则就具有误导性了;

6.3.2 从关联分析到相关分析

  • 提升度
    • $lift(A,B)=\frac{P(AB)}{P(A)P(B)}=\frac{P(B|A)}{P(B)}$
    • 描述A出现对B出现的提升程度
  • $\chi^2$分析
    • $\chi^2 = \sum_{i}\sum_{j}\frac{(\sigma_{ij}^2-e_{ij})}{e_{ij}}$
    • $\chi^2$大于1,说明负相关

6.3.3 模式评估度量比较

  • 下面每种越接近1,A,B联系越紧密
    • 全置信度
      • $allConf(A,B)=min{P(A|B),P(B|A)}$
    • 最大置信度
      • $maxConf(A,B)=max{P(A|B),P(B|A)}$
    • Kule度量
      • $Kule(A,B)=\frac{P(A|B)+P(B|A)}{2}$
    • 余弦度量
      • $cosine(A,B)=\sqrt{P(A|B)\times P(B|A)}$
  • 对于指示有趣的模式联系,哪个最好?
    • 不平衡比$IR=\frac{|sup(A)-sup(B)|}{sup(A)+sup(B)-sup(AB)}$
    • $IR$越接近0,四种度量越平衡

Apriori算法

input.txt

  • 每一个事务都是由不到150的单项组成,用字符串表示;
  • 总共100个事务;

output.txt

  • 一共挖掘出约4500个频繁项集;
  • 最长的项集长度为10;

基本参数

  • 最小支持度:0.2
  • 最小置信度:0.3

相关笔记

  • 数据预处理

    1. 找到全体频繁1-项集
    2. 按照支持度降序给每个事务重新排序
  • 递归连接

    1. 假设生成全体频繁k项集$L_k$,对于每一个可连接的$l_i,l_j\in L_k$,
      • 称频繁k项集a,b可连接,如果它们前k-1项相同但是最后一项不同
    2. 将$L_i \cup L_j$ 加入$L_{k+1}$
  • 剪枝

    • 扫描刚刚生成的$L_{k+1}$,剪去那些非频繁的项集
  • 对于某一个频繁项集$L$,其自动满足关联规则的支持度规则,因此划分称两个部分$L=A\cup B$

    • 如果$A\to B$满足置信度规则,那么这个关联规则就是强规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.data.xy.DefaultXYDataset;


//ע��label ��1��ʼ
public class PicUtility {

public static void show(double[][][] T, int numC)
{
double[][][] datas = new double[numC][][];
for (int n = 0; n < numC; n++)
{
double[][] l = T[n];
datas[n] = new double[2][l.length];
for (int m = 0; m < l.length; m++)
{
datas[n][0][m] = l[m][0];
datas[n][1][m] = l[m][1];
}
}

DefaultXYDataset dataSet = new DefaultXYDataset();
for (int n = 0; n < datas.length; n++)
{
dataSet.addSeries(" "+ n, datas[n]);
}
JFreeChart chart = ChartFactory.createScatterPlot("cluster Picture", "x", "y",
dataSet);
ChartFrame frame = new ChartFrame("kmean ", chart, true);
frame.pack();
frame.setVisible(true);


}
}

数据流挖掘

Background

Content

数据流的三个特征

  • One by one
  • Potentially Unbounded
  • Concept Drift

数据流挖掘的四个挑战

  • 单程处理Single Pass Handling
  • 内存限制Memory Limitation
  • 时间复杂度Low Time Complexity
  • 概念漂移 Concept Drift

什么是概念漂移

In predictive analytics and machine learning, the concept drift means that the statistical properties of the target variable, which the model is trying to predict, change over time in unforeseen ways.

在预测分析和机器学习中,概念漂移意味着模型试图预测的目标变量的统计属性会随着时间而以不可预见的方式发生变化;

模型的概率分布发生变化,表现三个方面:$P(C),P(X),P(C|X)$

这些变化可能是重要的,例如,对较旧的历史数据进行训练的模型所做的预测不再正确或者如果模型是根据最近的历史数据进行训练那么正确。

反过来,可以检测这些变化,并且如果检测到,则可以更新学习的模型以反映这些变化。

image-20240527210515291

Real concept drift vs. Virtual concept drift

image-20240527210943942

真实概念漂移指的是数据的分布和目标概念(即预测的目标变量的条件分布)同时发生变化。也就是说,输入特征与输出变量之间的关系发生了变化。这种漂移对机器学习模型的影响更为显著,因为模型的预测准确性可能会显著下降。真实概念漂移通常发生在以下情况中:

  • 市场变化:消费者的偏好和行为模式随着时间的推移而变化。例如,一个预测消费者购买行为的模型在几年后可能变得不准确,因为消费者的偏好和市场趋势发生了变化。
  • 环境变化:自然环境的变化可能影响预测模型的准确性。例如,气候变化可能影响农业产量预测模型的准确性,因为气候条件与作物产量之间的关系发生了变化。
  • 社会变化:社会和政策变化也会导致真实概念漂移。例如,新的法规可能改变企业运营的方式,从而影响金融风险预测模型的准确性。

虚拟概念漂移(Virtual Concept Drift)
虚拟概念漂移指的是数据的分布发生变化,但目标概念(即预测的目标变量的条件分布)没有变化。这种漂移主要影响输入特征的分布,而不改变输入特征与输出变量之间的关系。虚拟概念漂移的主要特征是,虽然输入特征的统计特性改变了,但这些变化不会导致模型预测目标的条件概率发生变化。因此,模型的准确性可能不会受到显著影响,但如果模型包含假设输入特征的分布是静态的,那么它可能需要更新以更好地适应新的输入分布。例如:

  • 在天气预报中,如果温度的分布在不同季节中变化,但温度与预测的天气(如晴天、雨天等)之间的关系保持不变,则属于虚拟概念漂移。
  • 在一个电子商务平台上,用户的浏览行为模式可能随时间变化(例如假期期间),但这些行为与购买意图之间的关系未变。

概念漂移的检测

  • ADWIN算法(Adaptive Windowing):基于分布的办法

    Monitoring the change of data distributions between two fixed or adaptive windows of data.

    监视两个固定或自适应数据窗口之间的数据分布变化。

    The idea is simple: whenever two “large enough” subwindows of W exhibit “distinct enough” averages, one can conclude that the corresponding expected values are different,and the older portion of the window is dropped

    这个想法很简单:每当 W 的两个“足够大”的子窗口表现出“足够明显”的平均值时,就可以得出结论,相应的期望值是不同的,并且窗口的较旧部分被丢弃

    可能的三个挑战:

    • Hard to determine window size;难以确定窗口大小
    • Learn concept drift slower;学习概念漂移的速度较慢
    • Virtual concept drift;虚拟概念漂移

    image-20240527211724942

  • PHT 基于错误率的办法

    Capture concept drift based on the change of the classification performance. (i.e. comparing the current classification performance to the average historical error rate with statistical analysis.) (e.g. PHT)

    根据分类性能的变化捕获概念漂移。(即通过统计分析将当前分类性能与平均历史错误率进行比较。(例如:PHT)

    • Sensitive to noise 对噪音敏感
    • Hard to deal with gradual concept drift 难以应对渐进式概念漂移
    • Depend on learning model itself heavily 严重依赖学习模型本身

    漂移检测方法:DDM

    The theory guarantees that while the class distribution of the examples is stationary , the error rate of the learning algorithm will decrease when i increases. A significant increase in the error of the algorithm, suggest a change in the class distribution, and whether is a significant increase is based on following formula.

    该理论保证了当样本的类分布是平稳的时,学习算法的错误率会随着i的增加而降低。算法误差的显著增加,表明类分布发生了变化,是否显著增加取决于以下公式;
    $$
    p_i+s_i\ge p_{min}+3s_{min}
    $$

数据流分类

  1. Process an example at a time, and inspect it only once
  2. Be ready to predict at any point
  3. Use a limited amount of memory
  4. Work in a limited amount of time
  • VFDT (Very Fast Decision Tree)

    A decision-tree learning system based on the Hoeffding tree algorithm

    基于Hoeffding树算法的决策树学习系统

    In order to find the best attribute at a node, it may be sufficient to consider only a small subset of the training examples that pass through that node.

    为了在节点上找到最佳属性,只需考虑通过该节点的训练示例的一小部分就足够了。

    Given a stream of examples, use the first ones to choose the root attribute.

    给定一系列示例,使用第一个示例来选择 root 属性

    Once the root attribute is chosen, the successive examples are passed down to the corresponding leaves, and used to choose the attribute there, and so on recursively.

    一旦选择了根属性,连续的例子就会传递到相应的叶子上,并用于选择那里的属性,依此类推递归。

    Use Hoeffding bound to decide how many examples are enough at each node

    使用 Hoeffding bound 来决定每个节点上有多少个示例就足够了

    image-20240527220722258

数据流聚类

微簇Micro-Clusters

A Micro-Cluster is a set of individual data points that are close to each other and will be treated as a single unit in further offline Macro-clustering

微簇是一组彼此接近的单个数据点,在进一步的离线宏集群中将被视为单个单元

Online micro-cluster maintenance在线微集群维护

Initial creation of q micro-clusters q 微簇的初始创建

q is usually significantly larger than the number of natural clusters q通常明显大于自然簇的数量

Online incremental update of micro-clusters 微集群在线增量更新

If new point is within max-boundary, insert into the micro cluster

o.w., create a new cluster  May delete obsolete micro-cluster or merge two closest ones

Offline Phase: Query-based macro-clustering

Based on a user-specified time-horizon h and the number of macro-clusters k, compute macroclusters using the k-means algorithm

Cluster Feature: CF = (N, LS, SS)

  1. (N) - 数量
    • (N) 是簇中数据点的总数。这提供了簇的规模信息。
  2. (LS) - 线性和
    • (LS) 是簇中所有数据点向量的逐元素和。对于d维数据点,如果簇中有k个数据点,则
      $$LS = \sum_{i=1}^{k} \mathbf{x}_i$$
      其中$ (\mathbf{x}_i)$ 是第 (i) 个数据点向量。这一项用于计算簇的质心(中心点)。
  3. (SS) - 平方和
    • (SS) 是簇中所有数据点向量的逐元素平方和。即
      $$SS = \sum_{i=1}^{k} \mathbf{x}_i^2$$
      其中 $(\mathbf{x}_i^2) $表示第 (i) 个数据点向量的逐元素平方和。这一项用于计算簇的散布(方差或标准差)。

Hadoop/Spark

设计准则:大规模数据处理,并行化,容错率及恢复,简明接口

Hadoop

Hadoop是一个开源的分布式计算框架,用于处理和存储大规模数据集。它由Apache软件基金会开发和维护,提供了高可靠性、可扩展性和分布式处理能力。Hadoop的核心组件包括:

  1. HDFS(Hadoop Distributed File System)

    • HDFS是一个分布式文件系统,负责存储大规模数据。它将数据分成块(通常64MB或128MB),并在集群中的多个节点上进行复制存储,以提高数据的可靠性和可用性。
  2. MapReduce

    • MapReduce是Hadoop的分布式计算模型。它将计算任务分为两个阶段:Map阶段和Reduce阶段。Map阶段处理输入数据并生成中间结果,Reduce阶段合并中间结果以生成最终输出。
  3. YARN(Yet Another Resource Negotiator)

    • YARN是Hadoop的资源管理系统,负责管理和调度集群资源,协调不同应用程序的执行。
  4. Hadoop生态系统

    • Hadoop有一个庞大的生态系统,包括Pig(数据流脚本语言)、Hive(数据仓库基础设施)、HBase(分布式数据库)、Sqoop(数据导入导出工具)、Flume(日志数据收集工具)等。

Spark

Spark是一个开源的分布式计算系统,旨在提高数据处理速度和效率。由UC Berkeley的AMP实验室开发,后来成为Apache软件基金会的顶级项目。Spark提供了一个统一的分析引擎,可以处理批处理、流处理、交互式查询和机器学习任务。其核心组件包括:

  1. RDD(Resilient Distributed Dataset)

    • RDD是Spark的核心抽象,表示一个分布式的、不可变的数据集合。RDD支持两种操作:转换(如map、filter)和动作(如count、collect)。RDD的弹性体现在其自动容错和重计算能力上。
  2. Spark SQL

    • Spark SQL提供了对结构化数据的支持,允许使用SQL查询和数据框(DataFrame)API来处理数据。它集成了Hive元数据,可以直接查询Hive表。
  3. Spark Streaming

    • Spark Streaming支持实时数据流处理。它将实时数据流分成小批次,并使用Spark引擎进行处理,适用于日志分析、实时监控等场景。
  4. MLlib(机器学习库)

    • MLlib是Spark的机器学习库,提供了多种机器学习算法,如分类、回归、聚类和协同过滤等,以及特征提取和评估工具。
  5. GraphX

    • GraphX是Spark的图计算库,支持图结构的并行计算和图算法,如PageRank、Connected Components等。
  6. Spark生态系统

    • Spark的生态系统包括各种与数据处理相关的工具和库,如Delta Lake(数据湖管理)、Koalas(Pandas与Spark DataFrame的统一API)、MLflow(机器学习生命周期管理)等。

比较

  1. 处理模式

    • Hadoop主要适用于批处理,数据处理延迟较高。
    • Spark不仅支持批处理,还支持实时流处理和交互式查询,处理速度更快。
  2. 编程模型

    • Hadoop的MapReduce模型较为复杂,需要显式地编写Map和Reduce函数。
    • Spark提供了更高层次的API,如DataFrame和Dataset,使编程更加简洁和易用。
  3. 性能

    • Hadoop的MapReduce在处理大量小文件时性能较差。
    • Spark在内存中进行计算,性能显著提升,尤其在迭代计算和交互式查询中表现更佳。
  4. 生态系统

    • Hadoop有一个成熟的生态系统,支持广泛的数据存储和处理工具。
    • Spark的生态系统不断扩展,提供了强大的实时处理和高级分析功能。

适用场景

  • Hadoop:适用于批处理、大规模数据存储和离线分析任务,如日志分析、数据仓库构建等。
  • Spark:适用于实时数据处理、机器学习、图计算和交互式数据分析,如实时流处理、推荐系统、数据科学等。

总之,Hadoop和Spark各有优劣,适用于不同类型的数据处理需求。根据具体的业务需求和数据特性选择合适的框架可以最大化数据处理效率和效果。

Hash技术

Background

大数据挖掘面临的问题:

  • 高维诅咒:比如K-dTree无法处理高维问题;
  • 存储问题
  • 检索速度问题

Hash技术致力于解决这个问题,也是Hash技术的作用;

Content

K-Shingles技术

$K$-Shingle:连续$K$​​​个字符一起出现的序列;

通过$K$-shingle技术,可以很方便地将文档存储成一个列表,进行后续操作;

签名矩阵与最小哈希(MinHashing)

现有一个矩阵,有$M$列(记录$M$个文档),列的长度$N$也很长;

我们希望对列C作Hash,转化为签名$Sig(C)$,有如下性质:

  • 对于两列$C_1,C_2$,相似性$Sim(C_1,C_2)=\mathbb P(Sig(C_1)=Sig(C_2))$​,解决检索速度问题;
  • $Sig(C)$对$C$​​降维,解决存储问题和维度诅咒问题;

将$C$​表示为长度为$N$的布尔向量,有的元素标记为1,没有标记0,那么计算两个集合(列)的Jaccard相似度:
$$
Jaccard(C_1.C_2)=\frac{|C_1\cap C_2|}{|C_1\cup C_2|}=\frac{a}{a+b+c}
$$
其中两个集合的同一个元素的存在情况有如下四种,分别计数$a,b,c,d$:
$$
\begin{array}{ccc}
cnt& \mathrm{C}{1} & \mathrm{C}{2} \
a & 1 & 1 \
b & 1 & 0 \
c & 0 & 1 \
d & 0 & 0
\end{array}
$$
定义最小哈希函数:集合中第一个出现1的索引;

下图是一个例子,permulation是三个对索引的全排列;

image-20240527172325790

可以看到,生成签名矩阵并不会对输入矩阵打乱;

对于两列$C_1,C_2$,事件$A_\pi$表示在随机的索引全排列为$\pi$下,最小哈希值相等$h(C_1)=h(C_2)$;

从索引1开始看到索引$N$,检查列$C_1,C_2$,直到我们第一次发现了1,它只能是type a的情况之于type a,type b,type c,因此$P(A_\pi)$也就是相似性;

我们准备很多个${1,2,…,N}$​的全排列,对于固定的输入矩阵,最小哈希函数对不同的索引排列将产生不同的行结果,将签名矩阵看成结果的vector;

我们如何准备这些全排列呢?答案还是哈希。

对于${1,2,…,N}$的全排列,哈希函数会将这个排列映射成$0,1,…,N-1$的排列;

注意,我们并不是得出整个索引排列之后,再找那个出现1最早的索引,而是不断的更新签名矩阵:

  1. 初始化签名矩阵$M(i,c)$为无穷大;
  2. 遍历所有行$1,2,…,N$;对固定的行$r$​,遍历所有的列;
  3. 对于固定的列$c$,如果第$r$行有1;
  4. 对每个准备好的Hash函数$h_i$,计算$h_i(r)$​;
  5. 更新$M(i,c)=\min{M(i,c),h_i(r)}$​

一个文档的签名指的是[M(0,c),M(1,c),...]

局部敏感哈希(Locality-Sensitive Hashing)

我们也许要准备很多个全排列,也就是很多个hash函数,这样才能用大数定律,以频率估计概率,从而估计相似性;

也就是说,我们的签名矩阵终于能降维到被内存装下了,但是找到相似文档依然不可能线性查找枚举所有可能的文档对,代价是$O(M^2)$​;

LSH 将原始数据空间中的两个相邻数据点通过相同的映射或投影变换(projection)后,这两个数据点在新的数据空间中仍然相邻的概率很大,而不相邻的数据点被映射到同一个桶的概率很小。也就是说,如果我们对原始数据进行一些hash映射后,我们希望原先相邻的两个数据能够被hash到相同的桶内,具有相同的桶号。这样只需要计算两个数据点的hash值是否在同一个桶里就能判断它们是否大概率相似;

这和普通的hash的设计带来的蝴蝶效应不同(混沌系统微小初值改变引起巨大变化),它不希望hash冲突;

但是对LSH来说,目的就是要创造更多的冲突,但本来相似的对象hash完很不相似,或者不相似的的对象hash完映射到一个桶的情况仍不可避免;

关键要找到这么一个性质的LSH函数,略.

一个trick:

集成学习

概念

集成学习 (ensemble learning) 通过构建并结合多个学习器来完成学习任务。 下图展示了集成学习的一般结构:先产生一组“个体学习器” (individual learner),再用某种策略将它们结合。若集成中只包含同种类型的个体学习器,这样的集成是“同质的” (homogeneous),同质集成中的个体学习器称为“基学习器” (base learner),相应的学习算法称为“基学习算法” (base learning algorithm)。集成也可以包含不同类型的个体学习器,即“异质的” (heterogenous)。

**集成学习通过将多个学习器进行结合,通常可以获得比单一学习器显著优越的泛化性能。**这对“弱学习器” (weak learner) 尤为明显。实际中,要获得好的集成,个体学习器通常应该“好二不同”,即个体学习器要有一定的“准确性”,并且要有“多样性”,即学习器间具有差异。

Bagging

给定包含 m个样本的数据集,先随机取出一个样本放入采样集,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,经过 m 次随机采样,得到含 m 个样本的采样集,初始训练集中有的样本在采样集多次出现,有的则从未出现。这样可采样出 T 个含 m 个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器结合。这就是 Bagging 的基本流程。

image-20240528111457637

image-20240614031753278

随机森林

随机森林 (Random Forset,RF) 是 Bagging 的一个扩展。RF 在以决策树为基学习器构建 Bagging 集成的基础上,在决策树的训练过程中引入随机属性选择。传统决策树在选择划分属性时是在当前节点的属性集合 (假定有 d 个属性) 中选择一个最优属性;而在 RF 中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 k 个属性的子集,然后再从这个子集中选择一个最优属性用于划分。参数 k 控制了随机性的引入程度。

  1. 假如有N个样本,则有放回的随机选择N个样本(每次随机选择一个样本,然后返回继续选择)。这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。
  2. 当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
  3. 决策树形成过程中每个节点都要按照步骤2来分裂(很容易理解,如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
  4. 按照步骤1~3建立大量的决策树,这样就构成了随机森林了

Boosting

Boosting 是一族可将弱学习器提升为强学习器的算法:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本进行调整,使得先前基学习器做错的训练样本在后续受到更多的关注,然后基于调整后的样本训练下一个基学习器,如此重复进行,直至基学习器达到事先指定的值,最终将这 T 个基学习器进行加权结合。

image-20240614031919466

著名代表为Adaboosting:

  1. 初始化训练数据的权值分布

    如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N

  2. 训练弱分类器

    如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低

    相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高

    权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去

  3. 将各个训练得到的弱分类器组合成强分类器

    加大分类误差率小的弱分类器的权重,而降低分类误差率大的弱分类器的权重

AdaBoost算法流程如下:

image-20240528111700595

Adaboost流程示意图image-20240614032129675

0%