常见的机器学习算法:
机器学习算法(一)—决策树
机器学习算法(二)—支持向量机SVM
机器学习算法(三)—K近邻
机器学习算法(四)—集成算法
基于XGBoost的集成学习算法
基于LightGBM的集成学习算法
机器学习算法(五)—聚类
机器学习算法(六)—逻辑回归
机器学习算法(七)—Apriori 关联分析
机器学习算法(八)—朴素贝叶斯
九种降维方法汇总
一、关联分析
关联分析:用于发现隐藏在大型数据集中有意义的联系,所发现的联系可以用关联规则或频繁项集的形式表示。零售商可以使用这类规则,帮助发现新的交叉销售商机。
关联分析的基本概念:
事务:一个样本(行)称为一个“事务”。
项集:每个事务由多个属性(列)来确定,这里的属性称为项,数据集中一个或多个项目集合撑项集。如:{牛奶},{啤酒}都是1-项集;{牛奶,果冻}是2-项集。
X===> Y的含义:x和y是项集,x称为规则前项,y称为规则后项。
支持度:一个项集或者规则在所有事务中出现的频率,是一种重要度量。如:100个顾客购买物品,有30个顾客同时购买了啤酒和尿布,那么支持度就是30%。(支持度很低的规则可能只是偶尔出现,支持度通常用来删除那些无意义的规则)
置信度:x发生时y发生的概率。如:购买薯片的顾客中有50%的人购买了可乐,则置信度为50%
提升度:物品集x的出现对物品集y的出现概率发生了多大的变化。lift(A==>B)=confidence(A==>B)/support(B)=p(B|A)/p(B)
if lift=1,X与Y独立,X对Y出现的可能性没有提升作用,其值越大(lif>1),则表明X对Y的提升程度越大,也表明关联性越强。
1.1 关联规则发现
- 给定事务的集合T,关联规则发现是指找出支持度大于等于minsup(支持度阈值)并且置信度大于等于minconf(置信度阈值)的所有规则。大多数关联规则挖掘算法通常采用的一种策略是,将关联规则挖掘任务分解为两个子任务:频繁项集产生,规则的产生。
频繁项集产生:目标是发现满足最小支持度阈值的所有项集,这些项集称作频繁项集。
规则的产生:目标是从上一步发现的频繁项集中提取所有高置信度的规则,这些规则称为强规则。
1.2 频繁项集
格结构常常被用来枚举所有可能的项集。一般来说,一个包含 k 个项的数据集可能产生2的k次方-1个频繁项集,不包括空集在内。
发现频繁项集的一种原始方法是确定格结构中每个候选项集的支持度计数。
1.3 先验原理
如果一个项集是频繁的,则它的所有子集一定也是频繁的。相反,如果一个项集是非频繁的,则它的所有超级也一定是非频繁的。
1.4 Apriori算法的频繁项集产生
Apriori算法发现频繁项集,算法的两个输入参数分别是最小支持度和数据集,该算法首先会生成所有单个物品的项集列表。接着扫描交易记录来查看哪些项集满足最小支持度要求,那些不满足最小支持度的集合会被去掉,然后,对剩下来的集合进行组合以生成包含两个元素的项集。接下来,再重新扫描交易记录,去掉不满足最小支持度的项集。该过程重复进行直到所有项集都被去掉。
#!pip install mlxtend
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
# 数据
data = {
"ID": [1, 2, 3, 4, 5, 6],
"onion": [1, 0, 0, 1, 1, 1],
"potato": [1, 1, 0, 1, 1, 1],
"Burger": [1, 1, 0, 0, 1, 1],
"cabbage": [0, 1, 1, 1, 0, 1],
"carrot": [0, 0, 1, 0, 1, 0]
}
# 转为DataFrame
df = pd.DataFrame(data)
# 提取物品列
df_items = df[["onion", "potato", "Burger", "cabbage", "carrot"]].astype(bool)
# 生成频繁项集
frequent_itemsets = apriori(df_items, min_support=0.5, use_colnames=True)
# 生成关联规则
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1,num_itemsets=10)
# 打印结果
rules
rules[(rules['lift']>1.125)&(rules['confidence']>0.8)]
(onion和potato)、(Burger和potato)可以搭配着来卖。如果Burger, onion都在购物篮中,顾客买potato的可能性也比较高,如果他篮子里面没有,可以推荐一下
1.5 案例
movies=pd.read_csv("./ml/movies.csv")
movies
#第一步:转换one-hot
movies_one_hot=movies.drop('genres',axis=1).join(movies['genres'].str.get_dummies())
pd.options.display.max_colwidth=100
movies_one_hot.head()
movies_one_hot.set_index(['movieId','title'],inplace=True)
frequent_itemsets=apriori(movies_one_hot,min_support=0.025,use_colnames=True)
frequent_itemsets.sort_values(by='support', ascending=False)
rules=association_rules(frequent_itemsets,metric="lift",min_threshold=1.25,num_itemsets=100)
sorted_rules = rules[rules['lift'] > 4].sort_values(by='lift', ascending=False)
sorted_rules
movies[(movies.genres.str.contains('Children')) & (movies.genres.str.contains('Animation'))]
二、关联分析:高级概念
2.1 处理分类属性
许多应用包含对称二元属性和标称属性,对称二元属性如:性别、家庭计算机、网上聊天、网上购物和关注隐私;标称属性如:文化程度和州。使用关联分析,可能发现关于用户特征的有趣信息如:{网上购物=是}—>{关注隐私=是}
为了提取这样的模式,首先将分类属性和对称二元属性转换成“项”,目的是使用已有的关联规则挖掘算法。这种类型的变换可以通过为每个不同的属性-值对创建一个新的项来实现。例如,标称属性文化程度可以用三个二元项取代:文化程度=大学,文化程度=研究生,文化程度=高中。对称二元属性性别可以转换成一对二元项:男和女。
将关联分析用于二元化后的数据时,需要考虑如下问题:
- (1)有些属性值可能不够频繁,如州名,可以将相关的属性值分组,形成少数类别。例如,每个州名都可以用对应的地理区域如:中西部、西南部等,将不太频繁的属性值聚合成一个其他类别。
- (2)某些属性值的频率可能比其他属性高很多。该规则冗余,删除这样的项。
2.2 处理连续属性
挖掘连续属性可能揭示数据的内在连续,如“年收入超过120k的用户属于45~60年龄组”,包含连续属性的关联规则通常称作量化关联规则。连续数据进行关联规则常用的两种方法:基于离散化的方法和基于统计学的方法。
(1)基于离散化方法
- 离散化是处理连续属性最常用的方法。这种方法将连续属性的近邻值分组,形成有限个区间,例如:年龄∈[12,16),年龄∈[16,20)
(2)基于统计学方法
- 量化关联规则可以用来推断总体的统计性质,例如,上述数据基于统计学的方法,可以提取如下形式的量化关联规则:
{年收入>100k,网上购物=是}—>年龄:均值=38。该规则表明年收入超过100k并且定期在网上购物的用户平均年龄为38岁。
1)规则产生
为了产生基于统计学的量化关联规则,必须指定用于刻画有趣总体段特性的目标属性,然后,使用已有的算法,如Apriori算法或FP增长,从二元化数据中提取频繁项集,每个频繁项集确定一个有趣总体段。使用如均值、中位数、方差或者绝对偏差等统计量。可以对目标属性在每个段内的分布汇总。{年收入>100k,网上购物=是}—>年龄:均值=38就是通过对支持频繁项集的用户的年龄求平均值得到的。
2)规则确认
某个量化关联规则是有趣的,仅当由规则覆盖的事务计算的统计量不同于由未被发现规则覆盖的事务计算的统计量。例如,{年收入>100k,网上购物=是}—>年龄:均值=38这个规则仅当不支持频繁集{年收入>100k,网上购物=是}的用户平均年龄显著大于或小于38岁。为了确定该平均年龄差是否具有统计意义,应当使用统计假设检验方法进行检验。