【数据挖掘】《数据分析与数据挖掘》--天津大学公开课
天津大学《数据分析与数据挖掘》公开课--学习笔记
-
1.1 数据分析与数据挖掘
-
- 1.1.3 知识发现(KDD)的过程
- 1.1.4 区别
- 1.1.5 联系
-
1.2 分析与挖掘涉及的数据类型
-
1.2.1 基于数据库的数据类型
-
1.2.2 数据仓库中的数据类型
-
1.2.3 与事务相关的数据类型
-
1.2.4 数据矩阵的形式
-
1.2.5 网络化或图状结构的数据类型
-
1.3 数据分析与数据挖掘方法
-
- 1.3.1 频繁模式
- 1.3.2 分类与回归
- 1.3.3 聚类分析
- 1.3.4 离群点分析
-
1.4 数据分析与数据挖掘使用技术
-
- 1.4.1 统计学方法
- 1.4.2 机器学习
- 1.4.3 数据库与数据仓库
-
1.5 应用场景及存在的问题
-
2.1 数据的属性
-
- 2.1.1 数据对象
- 2.1.2 属性
- 2.1.3 属性类型
-
2.2 数据的基本统计描述
-
- 2.2.1 中心趋势度量
- 2.2.2 数据的分散度量
- 2.2.3 数据的图形显示
-
-
2.3 数据间的相似程度与差异性
-
2.3.1 数据表与差异表
-
2.3.2 数值特征之间的差异性
-
2.3.3 序数特征的邻近程度计算
-
2.3.4 向量间的余弦相似度
-
3.1 数据存在的问题
-
3.2 数据清理
-
- 3.2.1 空缺值处理
- 3.2.2 噪声处理
-
-
3.3 数据融合
-
3.4 数据缩减
-
3.5 数据转换与属性生成
- 3.5.1 属性概括
- 3.5.2 标准化转换
- 3.5.3 特征生成转换
- 3.5.4 类别划分处理
-
4.1 数据仓库的核心概念
-
4.1.1 对数据仓库的定义及其主要特性
- 4.1.2 数据库架构布局与组织形式
- 对数据库模型的设计与实现原则
- 关于粒度划分的技术要点
-
4.2 数据仓库设计
-
- 4.2.1 概念模型设计
- 4.2.2 逻辑模型设计
-
4.3 数据仓库实现
-
4.4 联机分析处理
-
- 4.4.1 OLAP简介
- 4.4.2 OLAP与OLTP区别
- 4.4.3 典型OLAP操作
-
4.5 元数据模型
-
- 4.5.1 元数据内容
- 4.5.2 元数据类型
- 4.5.3 元数据的作用
-
5.1 回归分析
-
- 5.1.1 回归分析的步骤
-
5.2 一元线性回归
-
- 5.2.1 回归方程
- 5.2.2 求解及模型检验
-
5.3 多元线性回归
-
- 5.3.1 回归方程
-
5.4 多项式回归
-
- 5.4.1 回归方程
- 5.4.2 最小二乘法
- 5.4.3 拟合优度检验
- 5.4.4 显著性检验
-
6.1 频繁模式概述
-
- 6.1.1 相关概念
- 6.1.2 关联规则
- 6.1.3 先验原理
-
6.2 Apriori算法
-
- 6.2.1 关联规则挖掘的方法
- 6.2.2 Apriori算法
-
6.3 FP-growth算法
-
- 6.3.1 FP-growth算法步骤
- 6.3.2 FP-growth算法代码
-
6.4 压缩频繁项集
-
- 6.4.1 挖掘闭模式
- 6.4.2 枝剪的策略
-
6.5 关联模式评估
-
- 6.5.1 支持度与置信度框架
- 6.5.2 相关性分析
- 6.5.3 模式评估度量
-
7.1 分类概述
-
7.2 决策树
-
- 7.2.1 决策树上
- 7.2.2 决策树中
- 7.2.3 决策树下
-
7.3 朴素贝叶斯分类
-
7.4 惰性学习法
-
- 7.4.1 惰性学习法的概念
- 7.4.2 K近邻算法
-
7.5 神经网络
-
- 7.5.1 神经网络基本概念
- 7.5.2 BP神经网络算法
-
7.6 分类模型的评估
-
- 7.6.1 准确率
- 7.6.2 召回率
- 7.6.3 灵敏度、特效率
- 7.6.4 F值
- 7.6.5 交叉验证
-
8.1 聚类概述
-
8.2 基于划分的聚类
-
- 8.2.1 K均值算法
- 8.2.2 K-中心点(PAM)算法
-
-
8.3 基于层级的分组策略
- 8.4 划分网格区域的方法
- 9.1 离群点的概念及分类标准
- 9.2 系统化分析流程:离群点检测
-
- 9.2.1 分析离群点分类标准及其影响因素
-
- 9.2.2 系统化识别流程:离群点检测方法
网址:《数据分析与数据挖掘》–天津大学公开课
链接: https://b23.tv/PJkU28
1.1 数据分析与数据挖掘
数据分析涉及运用适当统计分析工具对收集的数据进行特征提取、分类以及关联性分析,并通过直观呈现其内在规律帮助研究者快速掌握信息本质;其结果有助于理解现象、预测趋势以及支持决策制定;数据分析还可以辅助决策者科学判断并为其制定策略提供依据;最后通过图表展示便于理解。数据挖掘则是在海量数据中发现潜在的知识信息
1.1.3 知识发现(KDD)的过程

1.1.4 区别

1.1.5 联系

1.2 分析和挖掘的数据类型
1.2.1 数据库数据
关系数据库
SQL
数据库 比较流行的有:MySQL, Oracle, SqlServer
1.2.2 数据仓库数据
数据仓库是一个以主题为导向的整合性动态变化的数据集合,在支持管理层进行决策方面具有稳定性

1.2.3 事务数据
数据库事务(简称:事务)是数据库管理系统运行过程中一个重要的逻辑单元,由若干特定的操作序列构成。一个数据库事务一般包括一系列对数据库进行读写操作,其存在的主要目的是为了确保数据的一致性和完整性以及提高系统的可靠性和安全性。
为数据库操作序列建立了一种容错机制,在故障发生时能够迅速恢复正常运行状态的同时也能保证系统数据的一致性得以维持;当多个应用程序进行并发访问时可以通过互斥机制避免各程序间的操作干扰以保障系统的稳定运行。
在现实情况下,任务的成功可能性较低。在执行一个数据库事务的过程中,可能会遇到事务操作失败、数据库系统或操作系统故障以及存储介质故障等情况。DBMS需要对发生故障的事务进行恢复操作以将数据库状态恢复到一致状态(即数据的一致性得到保证的状态)。为了实现这一功能目标,DBMS通常需要维护事务日志来追踪所有影响数据库数据的操作。
1.2.4 数据矩阵
1.2.5 图和网状结构数据
例如社交数据,电商数据,搜索引擎
网页排名算法PageRank
1.3 数据分析与数据挖掘方法
1.3.1 频繁模式
关联与相关性
信用卡分析、购物车分析
1.3.2 分类与回归
1.3.3 聚类分析
聚类:
1.3.4 离群点分析
离群点:
信用卡异常消费
1.4 数据分析与数据挖掘使用技术

1.4.1 统计学方法
1.4.2 机器学习
监督学习
无监督学习
半监督学习
1.4.3 数据库与数据仓库
1.5 应用场景及存在的问题
商务智能、信息识别、搜索引擎
2.1 数据的属性
2.1.1 数据对象
2.1.2 属性

2.1.3 属性类型
2.2 数据的基本统计描述

2.2.1 中心趋势度量
截尾均指:
加权算数平均数:
2.2.2 数据的分散度量
极差:
方差:
2.2.3 数据的图形显示
1、箱图
用来描述最大值、最小值、下四位数、中位数和上四位数的五数概括
2.饼图
3、频率直方图
4、散点图
2.3 数据的相似性和相异性
2.3.1 数据矩阵和相异矩阵
近邻性度量
2.3.2 数值属性的相异性
1、欧几里得距离
2、曼哈顿距离
2.3.3 序数属性的近邻性度量
2.3.4 余弦相似性
余弦相似度
3.1 数据存在的问题
数据不一致
数据缺失
噪声数据
缺失值
3.2 数据清理
3.2.1 空缺值处理
3.2.2 噪声处理
3.3 数据集成
1、实体识别过程中的关键挑战
2、数据冗余现象的处理难点
基于数值型数据特征的分析框架中包含两个核心指标:相关系数和协方差
为了系统评估变量间的关联程度而采用的相关性分析方法
在分类变量独立性检验领域具有重要应用价值的卡方检验方法
3.4 数据规约
数据标准化
数据立方体
3.5 数据变换与数据离散化
数据变换:将数据变换成适合数据挖掘的形式
3.5.1 数据泛化
3.5.2 数据规范化
3.5.3 数据变换:属性构造
3.5.4 离散化
分箱法
4.1 数据仓库的基本概念
4.1.1 数据仓库定义和特征
术语:数据仓库(Terminals),其英文缩写通常表示为DW或DWH)。该系统旨在为企业各个层次的决策制定过程提供全面的数据支持战略集合(Composite of data support strategies)。它建立在一个单一的数据存储基础之上(On a sole data storage foundation),以满足分析性和决策支持需求而建立(Established for analytical and decision-making purposes)。特别适用于需要进行业务智能的企业(Especially beneficial for organizations seeking business intelligence),能够指导业务流程改进并监控各项关键指标如时间、成本及质量(Can guide process optimization and monitor key metrics such as time, cost, and quality)
特征:集成的、时变性、非易失的、
4.1.2 数据仓库体系结构

4.1.3 数据模型
4.1.4 粒度
4.2 数据仓库设计
面向主题的、集成的、不可更新的
自顶向下,逐步细化
4.2.1 概念模型设计
多维数据模型、
星型模型
雪花模型

事实星座模型
4.2.2 逻辑模型设计
核心基础

4.3 数据仓库实现
SQL实现工具
实例
4.4 联机分析处理
4.4.1 OLAP简介
在线 aggregating 和 reporting 技术(OLAP)系统是数据仓库系统主要应用之一,
经过精心设计以支持复杂的分析操作,
特别注重为管理层及高阶层用户提供决策支持,
能够根据分析者的具体需求迅速且灵活地执行大规模复杂查询处理任务,
并提供给管理层及高阶层用户直观且易于理解的结果信息,
帮助他们准确把握企业的经营状况、明确业务需求并制定科学合理的决策方案。
数据层。负责对企业操作数据进行抽取、转换、清洗及汇总处理,并生成信息数据库存放在企业级的中心信息数据库中。
应用层面。通过在线分析处理的方式,并非局限于单一的数据挖掘技术的应用,在完成对海量信息数据的解析工作的同时,则能够实现对关键业务指标的数据提取与统计
利用前台分析工具展示查询报表、统计分析、多维联机分析以及数据发掘的结果于用户面前
4.4.2 OLAP与OLTP区别
OLTP与OLAP的介绍
数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
OLTP系统注重数据库内存利用率,在优化方面主要关注各指标的命令频率,并特别重视绑定变量数量以及处理多个并发操作的能力;
而OLAP系统则侧重于数据分析能力,在性能优化上主要关注SQL执行效率、提升磁盘输入输出操作数量以及优化数据分区策略等。

4.4.3 典型OLAP操作
切片
切块
上卷
下钻
旋转
4.5 元数据模型
4.5.1 元数据内容
元数据库
4.5.2 元数据类型
静态元数据
动态元数据
4.5.3 元数据的作用
元数据

5.1 回归分析
回归分析:
一元线性回归
多元线性回归
多项式回归
5.1.1 回归分析的步骤

5.2 一元线性回归
5.2.1 回归方程

5.2.2 求解及模型检验
最小二乘法
拟合优度检验
显著性检验
5.3 多元线性回归
5.3.1 回归方程
方程

5.4 多项式回归
5.4.1 回归方程
方程

5.4.2 最小二乘法
5.4.3 拟合优度检验
5.4.4 显著性检验
6.1 频繁模式概述
6.1.1 相关概念
购物车分析、牛奶面包组合
频繁相集
6.1.2 关联规则
关联规则公式
最小支持度
置信度
最小置信度
强关联规则
6.1.3 先验原理
6.2 Apriori算法
6.2.1 关联规则挖掘的方法
穷举法
6.2.2 Apriori算法
Apriori算法是一种广泛应用于发现数据间关联规则的方法,在数据挖掘领域具有重要地位。该算法的主要功能是识别频繁出现的数据集合,并通过分析这些集合的模式来制定相应的决策策略。例如在超市购物数据分析集或电子商务中的网购数据分析集中若能识别出这些频繁出现的数据集我们可以采取以下措施:对于超市优化其产品布局以提升顾客购物体验;对于电商则可重新排列商品展示位置以提高转化率进而实现降低成本的同时增强盈利能力。

第一步:连接
第二步:剪枝
第三步:计算支持度
本文基于该样例的数据编写Python代码实现Apriori算法。代码需要注意如下两点:
由于Apriori算法假定项集中的项是按字典序排序的,而集合本身是无序的,所以我们在必要时需要进行set和list的转换;
由于要使用字典(support_data)记录项集的支持度,需要用项集作为key,而可变集合无法作为字典的key,因此在合适时机应将项集转为固定集合frozenset。
// An highlighted block
"""
# Python 2.7
# Filename: apriori.py
# Author: llhthinker
# Email: hangliu56[AT]gmail[DOT]com
# Blog: http://www.cnblogs.com/llhthinker/p/6719779.html
# Date: 2017-04-16
"""
def load_data_set():
"""
Load a sample data set (From Data Mining: Concepts and Techniques, 3th Edition)
Returns:
A data set: A list of transactions. Each transaction contains several items.
"""
data_set = [['l1', 'l2', 'l5'], ['l2', 'l4'], ['l2', 'l3'],
['l1', 'l2', 'l4'], ['l1', 'l3'], ['l2', 'l3'],
['l1', 'l3'], ['l1', 'l2', 'l3', 'l5'], ['l1', 'l2', 'l3']]
return data_set
def create_C1(data_set):
"""
Create frequent candidate 1-itemset C1 by scaning data set.
Args:
data_set: A list of transactions. Each transaction contains several items.
Returns:
C1: A set which contains all frequent candidate 1-itemsets
"""
C1 = set()
for t in data_set:
for item in t:
item_set = frozenset([item])
C1.add(item_set)
return C1
def is_apriori(Ck_item, Lksub1):
"""
Judge whether a frequent candidate k-itemset satisfy Apriori property.
Args:
Ck_item: a frequent candidate k-itemset in Ck which contains all frequent
candidate k-itemsets.
Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.
Returns:
True: satisfying Apriori property.
False: Not satisfying Apriori property.
"""
for item in Ck_item:
sub_Ck = Ck_item - frozenset([item])
if sub_Ck not in Lksub1:
return False
return True
def create_Ck(Lksub1, k):
"""
Create Ck, a set which contains all all frequent candidate k-itemsets
by Lk-1's own connection operation.
Args:
Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.
k: the item number of a frequent itemset.
Return:
Ck: a set which contains all all frequent candidate k-itemsets.
"""
Ck = set()
len_Lksub1 = len(Lksub1)
list_Lksub1 = list(Lksub1)
for i in range(len_Lksub1):
for j in range(1, len_Lksub1):
l1 = list(list_Lksub1[i])
l2 = list(list_Lksub1[j])
l1.sort()
l2.sort()
if l1[0:k-2] == l2[0:k-2]:
Ck_item = list_Lksub1[i] | list_Lksub1[j]
# pruning
if is_apriori(Ck_item, Lksub1):
Ck.add(Ck_item)
return Ck
def generate_Lk_by_Ck(data_set, Ck, min_support, support_data):
"""
Generate Lk by executing a delete policy from Ck.
Args:
data_set: A list of transactions. Each transaction contains several items.
Ck: A set which contains all all frequent candidate k-itemsets.
min_support: The minimum support.
support_data: A dictionary. The key is frequent itemset and the value is support.
Returns:
Lk: A set which contains all all frequent k-itemsets.
"""
Lk = set()
item_count = {}
for t in data_set:
for item in Ck:
if item.issubset(t):
if item not in item_count:
item_count[item] = 1
else:
item_count[item] += 1
t_num = float(len(data_set))
for item in item_count:
if (item_count[item] / t_num) >= min_support:
Lk.add(item)
support_data[item] = item_count[item] / t_num
return Lk
def generate_L(data_set, k, min_support):
"""
Generate all frequent itemsets.
Args:
data_set: A list of transactions. Each transaction contains several items.
k: Maximum number of items for all frequent itemsets.
min_support: The minimum support.
Returns:
L: The list of Lk.
support_data: A dictionary. The key is frequent itemset and the value is support.
"""
support_data = {}
C1 = create_C1(data_set)
L1 = generate_Lk_by_Ck(data_set, C1, min_support, support_data)
Lksub1 = L1.copy()
L = []
L.append(Lksub1)
for i in range(2, k+1):
Ci = create_Ck(Lksub1, i)
Li = generate_Lk_by_Ck(data_set, Ci, min_support, support_data)
Lksub1 = Li.copy()
L.append(Lksub1)
return L, support_data
def generate_big_rules(L, support_data, min_conf):
"""
Generate big rules from frequent itemsets.
Args:
L: The list of Lk.
support_data: A dictionary. The key is frequent itemset and the value is support.
min_conf: Minimal confidence.
Returns:
big_rule_list: A list which contains all big rules. Each big rule is represented
as a 3-tuple.
"""
big_rule_list = []
sub_set_list = []
for i in range(0, len(L)):
for freq_set in L[i]:
for sub_set in sub_set_list:
if sub_set.issubset(freq_set):
conf = support_data[freq_set] / support_data[freq_set - sub_set]
big_rule = (freq_set - sub_set, sub_set, conf)
if conf >= min_conf and big_rule not in big_rule_list:
# print freq_set-sub_set, " => ", sub_set, "conf: ", conf
big_rule_list.append(big_rule)
sub_set_list.append(freq_set)
return big_rule_list
if __name__ == "__main__":
"""
Test
"""
data_set = load_data_set()
L, support_data = generate_L(data_set, k=3, min_support=0.2)
big_rules_list = generate_big_rules(L, support_data, min_conf=0.7)
for Lk in L:
print "="*50
print "frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport"
print "="*50
for freq_set in Lk:
print freq_set, support_data[freq_set]
print
print "Big Rules"
for item in big_rules_list:
print item[0], "=>", item[1], "conf: ", item[2]
6.3 FP-growth算法
FP-growth(Frequent Pattern Tree, 频繁模式树)是一种由韩家炜教授提出的用于挖掘频繁项集的方法。该方法通过将数据组织存储在一个称为Frequent Pattern Tree(FPTree)的特定结构中来实现对高频项目及其相关联项目的发现。与Apriori算法相比,FP-growth算法具有更高的效率,在整个求解过程中只需要两次遍历数据集即可完成所有高频项目的识别工作。其基本过程如下:(1)构建FPTree;(2)从FPTree中挖掘高频项目组合
6.3.1 FP-growth算法步骤

FP-growth的过程通常包括以下几个步骤:
第一步:遍历整个数据集以获取基础项集,并设定最低的支持阈值;接着移除所有不满足该阈值的基础项;最后对剩余的数据按照项目的降序进行排序处理。
第二步:在完成第一步后,在数据集中再次扫描以便生成完整的FP树结构及相应的项头表(按降序排列)。
第三步:针对每一个项目,在从下往上处理时查找其条件模式基;并递归地调用子树结构来进一步分析;同时剔除那些仍不符合最低支持阈值的所有分支;最终若子树呈现单一路径,则直接列出所有可能的组合序列;而若子树存在多条分支,则需继续分解直到形成单一路径为止
6.3.2 FP-growth算法代码
- FP树的类定义
// An highlighted block
class treeNode:
def __init__(self, nameValue, numOccur, parentNode):
self.name = nameValue #节点名字
self.count = numOccur #节点计数值
self.nodeLink = None #用于链接相似的元素项
self.parent = parentNode #needs to be updated
self.children = {} #子节点
def inc(self, numOccur):
'''
对count变量增加给定值
'''
self.count += numOccur
def disp(self, ind=1):
'''
将树以文本形式展示
'''
print (' '*ind, self.name, ' ', self.count)
for child in self.children.values():
child.disp(ind+1)
2、FP树构建函数
// An highlighted block
def createTree(dataSet, minSup=1):
'''
创建FP树
'''
headerTable = {}
#第一次扫描数据集
for trans in dataSet:#计算item出现频数
for item in trans:
headerTable[item] = headerTable.get(item, 0) + dataSet[trans]
headerTable = {k:v for k,v in headerTable.items() if v >= minSup}
freqItemSet = set(headerTable.keys())
#print ('freqItemSet: ',freqItemSet)
if len(freqItemSet) == 0: return None, None #如果没有元素项满足要求,则退出
for k in headerTable:
headerTable[k] = [headerTable[k], None] #初始化headerTable
#print ('headerTable: ',headerTable)
#第二次扫描数据集
retTree = treeNode('Null Set', 1, None) #创建树
for tranSet, count in dataSet.items():
localD = {}
for item in tranSet: #put transaction items in order
if item in freqItemSet:
localD[item] = headerTable[item][0]
if len(localD) > 0:
orderedItems = [v[0] for v in sorted(localD.items(), key=lambda p: p[1], reverse=True)]
updateTree(orderedItems, retTree, headerTable, count)#将排序后的item集合填充的树中
return retTree, headerTable #返回树型结构和头指针表
def updateTree(items, inTree, headerTable, count):
if items[0] in inTree.children:#检查第一个元素项是否作为子节点存在
inTree.children[items[0]].inc(count) #存在,更新计数
else: #不存在,创建一个新的treeNode,将其作为一个新的子节点加入其中
inTree.children[items[0]] = treeNode(items[0], count, inTree)
if headerTable[items[0]][1] == None: #更新头指针表
headerTable[items[0]][1] = inTree.children[items[0]]
else:
updateHeader(headerTable[items[0]][1], inTree.children[items[0]])
if len(items) > 1:#不断迭代调用自身,每次调用都会删掉列表中的第一个元素
updateTree(items[1::], inTree.children[items[0]], headerTable, count)
def updateHeader(nodeToTest, targetNode):
'''
this version does not use recursion
Do not use recursion to traverse a linked list!
更新头指针表,确保节点链接指向树中该元素项的每一个实例
'''
while (nodeToTest.nodeLink != None):
nodeToTest = nodeToTest.nodeLink
nodeToTest.nodeLink = targetNode
3、抽取条件模式基
// An highlighted block
def ascendTree(leafNode, prefixPath): #迭代上溯整棵树
if leafNode.parent != None:
prefixPath.append(leafNode.name)
ascendTree(leafNode.parent, prefixPath)
def findPrefixPath(basePat, treeNode): #treeNode comes from header table
condPats = {}
while treeNode != None:
prefixPath = []
ascendTree(treeNode, prefixPath)
if len(prefixPath) > 1:
condPats[frozenset(prefixPath[1:])] = treeNode.count
treeNode = treeNode.nodeLink
return condPats
4、递归查找频繁项集
// An highlighted block
def mineTree(inTree, headerTable, minSup, preFix, freqItemList):
bigL = [v[0] for v in sorted(headerTable.items(), key=lambda p: p[1][0])]# 1.排序头指针表
for basePat in bigL: #从头指针表的底端开始
newFreqSet = preFix.copy()
newFreqSet.add(basePat)
print ('finalFrequent Item: ',newFreqSet) #添加的频繁项列表
freqItemList.append(newFreqSet)
condPattBases = findPrefixPath(basePat, headerTable[basePat][1])
print ('condPattBases :',basePat, condPattBases)
# 2.从条件模式基创建条件FP树
myCondTree, myHead = createTree(condPattBases, minSup)
# print ('head from conditional tree: ', myHead)
if myHead != None: # 3.挖掘条件FP树
print ('conditional tree for: ',newFreqSet)
myCondTree.disp(1)
mineTree(myCondTree, myHead, minSup, newFreqSet, freqItemList)
链接: <>
6.4 压缩频繁项集
6.4.1 挖掘闭模式
6.4.2 枝剪的策略
6.5 关联模式评估
6.5.1 支持度与置信度框架
6.5.2 相关性分析
1、提升度
2、杠杆度
3、皮尔森相关系数
4、IS度量
5、确信度
6.5.3 模式评估度量
1、全置信度
2、极大置信度
3、Kulczynski度量
7.1 分类概述
分类:
分类与预测:
7.2 决策树
决策树是一种广泛应用的机器学习算法,在基本思路上非常简单明了。它与我们日常生活中做决定的过程有着相似之处。在决策树结构中存在父子关系的点是相对的概念;实际上是指父点按照某种规则生成子点的过程;随后这些子点又成为新的父点继续进行分裂;直到无法再进行分裂为止;而根点是没有父点存在的初始生成点;叶子点则是没有子点存在的终点位置(如图所示)。

链接: <>
7.2.1 决策树上
基于逻辑分析可知,在组织形式上遵循树状结构安排的决策树模型中包含了根节点、内部节点以及叶节点等基本要素
- 根节点:由数据集中全部数据构成的整体集合。
- 内部节点:每个内部不仅承载着一个判断条件的应用,并且负责整合满足从根到该结点所有条件的数据集合。
- 叶节点:叶则代表着最终分类结果,在这些叶子结点中存储的数据对应的就是相应的分类类别。
简而言之:
简单来说,
决策树是一种基于树状模型进行多类别的分类工具,
它通过递归划分特征空间来实现对未知实例的有效分类。
// An highlighted block
# D = {(x1,y1)、(x2,y2)......(xm,yn)} 是数据集
# A = {a1、a2、a3.} 是划分节点的属性集
# 节点node有两个主要属性:content代表该节点需要分类的训练集,type代表叶节点的决策类型
def generateTree(D,A):
newNode = 空 #生成新的节点
# 如果当前数据集都为一个种类,则设为一个叶节点并返回
if D 中数据皆属于类别 C:
newNode.content = D
newNode.type = C
return
# 如果已经没有属性了或者数据集在剩余属性中表现相同(属性无法区分)
if A = 空集 or D中数据在A中取值相同:
newNode.content = D
newNode.type = D中最多的类
return
#从A中选取最优的属性a
a=selectBestPorperty(A)
#为a的每一个取值生成一个节点,递归进行处理
for a的每一个取值 res[i]:
生成新的分支节点 node[i]
D[i] = D中取值为res[i]的数据
node[i].content = D[i]
if node[i].content == null:
node[i].type = D中最多的类
else:
generateTree(D[i],A - {a})
return
7.2.2 决策树中
ID3算法
7.2.3 决策树下
C4.5算法
7.3 朴素贝叶斯分类
可称为一类基于贝叶斯定理的分类算法,在机器学习领域内这些算法均建立在贝叶斯定理的基础之上
文章链接: 访问该文章的完整链接为
链接: <>
7.4 惰性学习法
被动学习策略通常被称为消极学习策略。在这一策略下,在初始阶段并不会建立基于已有数据的目标函数模型,而是仅仅将训练数据存储起来。等到系统需要处理新的输入数据时才进行分析,并通过比较这些新输入实例与现有训练数据之间的关系来计算出这些新输入实例的目标函数值。
7.4.1 惰性学习法的概念
典型的消极学习算法KNN不主动学习或拟合函数以判断新进入的样本其核心在于单纯存储训练集中所有的样本而无需像决策树那样先进行系统性地训练从而避免了所谓的"训练"过程当需要预测时该方法将从存储的所有训练样本中检索出与新输入样本最接近的一个或多个存储单元即找到最近邻以实现分类或回归任务
7.4.2 K近邻算法
KNN算法基于不同特征值之间的距离计算来实现分类任务。其工作原理是:当一个样本位于特征空间中与之最近的k个邻居(即最邻近)中大多数属于某一特定类别时,则该待分类样例也被归类至此。在KNN算法中使用的邻居仅包含已正确识别的对象。该方法在定类决策过程中仅参考最近邻的一个或多个样例的具体类别信息来确定待判别样例所属的类别。
K近邻算法详解: <>
深入解析k近邻算法:涵盖理论基础与实际案例 <>
7.5 神经网络
深度学习中的500个关键问题:https://github.com/runningreader/DeepLearning-500-questions
7.5.1 神经网络基本概念
神经网络是一门关键的机器学习技术,在当前最热门的研究领域——深度学习中占据核心地位。通过掌握神经网络这一方法论,不仅可以提升你的机器学习能力,还能更深入地理解深度学习机制。
本文采用循序渐进的方式系统讲解神经网络的基本原理与应用方法——特别适合刚开始接触这一领域的学习者。为了更好地帮助大家理解内容,文章对必要的先验知识不做过多假设前提要求。
神经网络是一种模仿人脑结构与功能的人工智能模型设计——目的是为了实现类似人类智能的机器学习技术。
神经网络——最容易理解且最为直观的一整篇文章内容:<>
7.5.2 BP神经网络算法
1、后向传播
2、算法步骤
神经网络中的BP算法(图形解析BP算法原理及实例解析): <>
7.6 分类模型的评估
用于评估分类性能的方法主要是测定预测值与实际标记值之间匹配程度如何。正确识别正样本(真阳性:TP)或负样本(真阴性:TN)均为真;相反地,在误判情况下则分别被视为假阳性(FP: type I error)或假阴性(FN: type II error)。特别说明的是,在评价预测效果时所指的就是这些结果是否正确(true)或不正确(false);而Positive和Negative仅表示被分类的对象属性类型
分类模型评估: https://www.jianshu.com/p/e8b688f796d8
7.6.1 准确率

7.6.2 召回率

7.6.3 灵敏度、特效率

7.6.4 F值

7.6.5 交叉验证
8.1 聚类概述
聚类属于机器学习的一种方法
它主要涉及将不同数据进行分类的过程
给定一批待分析的数据样本
我们可以通过应用聚类算法对每条记录进行处理后
在每个类别中会生成相应的分类结果
理论上讲
两个被归入同一类别对象应具备较为接近的属性与核心特征
而不同类别之间的样本则在这些指标上存在显著差异
这种方法属于无监督学习范畴
在各个研究领域中都作为一种强大的数据分析工具得到广泛应用
在数据科学领域中,在处理我们的数据时,我们能够应用聚类分析来获取有价值的信息。
在数据科学领域中,在处理我们的数据时,我们能够应用聚类分析来获取有价值的信息。
聚类的目标是通过同一类对象的相似度尽可能大;同时尽量减少不同类对象之间的相似度。
3、聚类和分类的区别
在机器学习领域中将聚类技术视为典型的无监督学习方法更为常见。与有监督的学习不同,在这种情况下我们无需预先定义任何类别标签或分组信息。
Clustering, often referred to as unsupervised learning in machine learning, essentially involves grouping together objects that share similar characteristics. Our goal is to achieve this by evaluating the similarity between objects and organizing them accordingly.
This makes unsupervised learning methods particularly suitable for handling datasets without predefined labels or categories.
On the other hand, Classification tasks rely on the presence of labeled training data. When trained on a labeled dataset, a classifier learns to distinguish between different classes based on input features. The process of providing these training examples is conventionally referred to as supervised learning.
8.2 基于划分的聚类
8.2.1 K均值算法

8.2.2 K-中心点(PAM)算法

8.3 基于层次的聚类
层次聚类方法(Hierarchical Clustering Approach)属于聚类算法的一种类型,在数据挖掘领域具有重要应用价值。层次聚类方法基于数据点间的相似性程度进行评估,并通过递归的方式构建层次结构化的嵌套式分类树状图谱。该分类树的构建过程涉及两个主要步骤:首先从底层节点开始逐步向上构建树体;其次根据预设的划分标准对中间节点进行动态调整以形成最终的分类结构;构建层次分类树的具体策略主要包括自下而上的合并策略和自上而下的分裂策略两种主要方式

// An highlighted block
import numpy as np
import matplotlib.pyplot as plt
'''
AGNES层次聚类,采用自底向上聚合策略的算法。先将数据集的每个样本看做一个初始的聚类簇,然后算法运行的每一步中找出距离最近的两个
类簇进行合并,该过程不断重复,直至达到预设的聚类簇的个数。
'''
#计算两个向量之间的欧式距离
def calDist(X1 , X2 ):
sum = 0
for x1 , x2 in zip(X1 , X2):
sum += (x1 - x2) *
return sum ** 0.5
def updateClusterDis(dataset,distance,sets,cluster_i):
i=0
while i<len(sets):
dis = []
for e in sets[i]:
for ele in sets[cluster_i]:
dis.append(calDist(dataset[e],dataset[ele]))
distance[i,cluster_i]=max(dis)
distance[cluster_i,i]=max(dis)
i+=1
#将每个簇和自身距离设为无穷大
distance[np.diag_indices_from(distance)] = float('inf')
return distance
def agens(dataset,k):
#初始化聚类簇:让每一个点都代表,一个类簇
sets=[]
for i in range(0,len(dataset)):
sets.append({i})
#初始化类簇间距离的矩阵
delta = np.array(dataset[0] - dataset)
for e in dataset[1:, :]:
delta = np.vstack((delta, (e - dataset)))
distance = np.sqrt(np.sum(np.square(delta), axis=1))
distance = np.reshape(distance, (len(dataset), len(dataset)))
distance[np.diag_indices_from(distance)]=float('inf')
####################################################
while len(sets)>k:
locations=np.argwhere(distance==np.min(distance))
#将集合合并,删除被合并的集合
locations=locations[locations[:,0]<locations[:,1]]
cluster_i=locations[0,0]
cluster_j=locations[0,1]
for e in sets[cluster_j]:
sets[cluster_i].add(e)
del sets[cluster_j]
#删除被合并的簇,distance矩阵对应的行和列,并更新距离矩阵
distance=np.delete(distance,cluster_j,axis=0)#删除对应列
distance=np.delete(distance,cluster_j,axis=1)#删除对应行
distance=updateClusterDis(dataset,distance,sets,cluster_i)
print(sets)
return sets
8.4 基于网格的聚类
将数据空间划分为有限个单元(cell)的网格结构中执行处理
9.1 离群点定义和类型
异常值:异常值即指在时间序列中偏离一般水平的异常的大数值与异常的小数值。 链接: <>.
离群点是一个数据对象,在其明显与其他数据对象相异的情况下显得独特,并似乎是通过不同的机制产生的现象。通常将非离群的数据称为"正常数据",而将离群的数据则被称为"异常数据"
与噪声数据相比,在数据分析领域(尤其是离群点分析方面),离群点并不具有吸引力)。通常情况下,在数据分析(包括但不限于离群点分析)中所关注的是那些显著偏离常规模式的数据实例)。例如,在信用卡欺诈检测中, 顾客的行为通常可以用一个统计模型来描述. 一位消费者可能会出现一些看似属于'随机误差'或'方差'范围内的交易行为, 如购买一份较为丰盛的午餐, 或者比平常多消费一杯咖啡. 这些交易不应被视为异常值, 否则金融公司将会因为过多地验证每笔交易而导致高昂的成本. 因此, 在执行异常值检测之前, 应先对数据中的噪音进行清理处理.
离群点检测非常引人入胜,因为它挑战了我们对数据分析常规方法的理解。在进行离群点检测时的关键在于理解为何这些异常数据由特定机制生成。通常的做法是在剩余的数据中建立多种假设模型,并验证发现出来的异常数据明显违背了这些预设条件。
9.2 离群点检测
9.2.1 离群点的类型
一般而言,在数据集中可以将异常数据划分为三类:全局异常、情境(或条件)异常以及群体(或集合)异常。
9.2.2 离群点检测方法
统计学方法 离群点检测的统计学方法基于假定。基于假设数据集中的正常对象由一个随机过程(生成模型)产生。
因而,在该随机模型的概率密度较高区域中出现的对象被视为正常。
即学习一个能够拟合给定数据集生成模型的过程。
其中根据如何指定和如何学习模型的基本原则,
离群点检测的方法可划分为参数型与非参数型两大类:
参数型假设正常的数据对象服从某种预先设定参数化的概率分布,
其概率密度函数给出对象被该分布产生的概率,
其值越低越可能是离群点;
而非参数型则无需事先设定统计分布,
而是通过分析输入数据确定其分布形态,
非参数型的具体实例包括直方图与核密度估计。
参数方法
1、基于正态分布的一元离群点检测
假定数据集由一个正态分布产生,然后,可以由输入数据学习正态分布的参数,并把低概率的点识别为离群点。
在正态分布的假定下,区域包含99.7%的数据,包含95.4%的数据,包含68.3%的数据。视具体情况而定,将其区域外的数据视为离群点。
这种直截了当的统计学离群点检测方法也可以用于可视化。例如盒图方法使用五数概况绘制一元输入数据:最小的非离群点值(Min)、第一个四分位数(Q1)、中位数(Q2)、第三个四分位数(Q3)和最大的非离群点值(Max)。
四分位数极差(IQR)定义为Q3-Q1。比Q1小1.5倍的IQR或者比Q3大1.5倍的IQR的任何对象都视为离群点,因为Q1-1.5 IQR和Q3+1.5 IQR之间的区域包含了99.3%的对象。
2、多元离群点检测
(1)使用马哈拉诺比斯距离检测多元离群点。
对于一个多元数据集,设为均值向量。对于数据集中的对象,从到的马哈拉诺比斯(Mahalanobis)距离为
其中S是协方差矩阵。
是一元数据,可以对它进行离群点检测。如果被确定为离群点,则也被视为离群点。
(2)使用统计量的多元离群点检测。
在正态分布的假设下,统计量可以用来捕获多元离群点。对于对象,统计量是
其中,是在第维上的值,是所有对象在第维上的均值,而是维度。如果对象的统计量很大,则该对象是离群点。
(3)采用混合参数分布
在很多场合中, 假设数据服从正态分布的效果显著. 但当实际数据极为复杂时, 这样的假设显得过于简陋. 在此情形下, 假设数据是由混合参数分布生成的.
其中采用期望最大化(EM)算法来进行参数估计. 具体情况较为复杂, 可参考韩家炜所著的《数据挖掘:概念与技术》一书.
非参数方法
在离群点检测的非参数方法中,“正常数据”的模型基于输入数据进行构建而非预先设定特定分布假设。这些方法通常对数据分布不做严格假设,在适用性方面具有更强的灵活性与适应性。
基于直方图的离群点检测
具体操作包含以下两个步骤:
第一步是生成反映数据分布特征的直方图;
第二步是根据直方图呈现的分布形态判断异常值。
步骤1:制作直方图图表。然而,非参数方法通常不假设任何先验统计模型,并且一般情况下需要用户提供一些参数以便由数据进行学习。例如,在这种情况下,需要指定直方图的类型(比如等宽或等高)以及其他相关设置(例如箱的数量和每个箱子的具体尺寸)。与基于参数的方法不同,在这种情况下,这些设置不涉及对数据分布类型的假设(例如高斯分布)。
步骤2:检测离群点。为了判断一个对象是否为离群点,在最简方法中若该对象落入直方图的一个箱体内,则将其归类为正常数据;否则则判定为异常值。对于更为复杂的检测手段,则可采用一种称为异常度评分的方法对每个对象进行评估。具体而言,在这种情况下给定的数据集中的每一个对象都会被赋予一个异常度评分值:该对象落入的箱体容积的倒数即为此处的评分标准;评分值越低,则该对象被判断为异常值的可能性越大。
使用直方图作为一种非参数模型来检测异常值存在明显的局限性,在选择合适的区间宽度方面存在一定挑战。当区间宽度过窄时,大量的正常数据点会落入空隙或稀疏的区间中并被错误地识别为异常值,从而导致较高的误报率或较低的检测准确率;相反地如果选择过宽的时间间隔则可能导致真正异常的数据点被包含在频繁出现的数据区域中进而造成较高的漏报率或召回率不足的问题。针对上述问题建议采用核密度估计方法来评估数据的概率密度分布。具体参考韩家炜所著《数据挖掘:概念与技术》中的相关内容
该种基于邻近性的技术在特征空间中定义的对象集合上运用距离度量工具来评估各对象间的相似程度。假设离群点与其他最近邻居的关联强度明显不同于数据集中其他对象与其邻居之间的关联强度。
该方法依赖于将数据划分为若干簇的基础
该方法通过分析对象与各簇之间的相互关系来识别潜在的离群点
这一过程引出了三种常见的基于聚类的离群点检测方法
首先判断该对象是否属于任何一个已知的簇
其次评估该对象与最近的簇之间的距离是否显著远于预期
最后检查该对象是否属于小型或稀疏的簇
