Python数据挖掘入门与实践–亲和性分析
说明
这段时间时间找了好多关于数据挖掘方向的数据,不过这些书籍大都偏向理论,看起来也比较枯燥乏味,碰巧今天找到了这本《Python数据挖掘入门与实践》,入门级别,刚好适合我这种爱代码不爱理论的人,从今天开始正式学习数据挖掘。
博客中展示的大部分代码都是按照书中的内容编写出来,有些地方会按照自己的思路有一小部分的改动
亲和性分析定义
亲和性分析根据样本个体(物体)之间的相似度,确定他它们关系的亲疏
亲和性分析之商品推荐
这部分内容是通过超市的商品服务的数据集,使得通过商品推荐例子希望得到如下规则:
如果一个人购买了商品X,那么他很有可能购买商品Y
1、在Numpy中加载数据集
import numpy as np
dataset_filename="affinity_dataset.txt"
X=np.loadtxt(dataset_filename)
加载完成后我们可以用如下代码查看
print(X[:5])
运行结果如下,图中1表示顾客购买了该商品,0表示未购买该商品
n_samples,n_features=X.shape # 记录数据范围
features=["bread","milk","cheese","apples","bananas"]
#features 表示的是每列数据表示的商品
2、实现简单的排序规则
首先我们需要了解两个基本概念
支持度:指数据集中规则应验的次数。
置信度:衡量规则的准确率。
规则的优劣有多种衡量方法,常用的是支持度和置信度
如下的代码是展示如何求“如果顾客购买了苹果,他们也会国脉香蕉” 的支持度和可信度
数据中第三列表示是否购买苹果
num_apple_purchases=0
for sample in X:
if sample[3]==1:
num_apple_purchases+=1
print("{0} people bought Apples".format(num_apple_purchases))
运行结果显示26人购买苹果
接下来的代码展示计算所有规则的置信度
from collections import defaultdict
valid_rules=defaultdict(int)
invalid_rules=defaultdict(int)
num_occurances=defaultdict(int)
# 计算过程使用循环结构对样本的每个特征值进行处理
for sample in X:
for premise in range(n_features):
if sample[premise]==0: #判断是否满足条件
continue
num_occurances[premise]+=1
for conclusion in range(n_features): #如果对应的规则应验,键为条件,规则的的元组加一
#反之违反规则加一
if premise==conclusion:
continue
if sample[conclusion]==1:
valid_rules[(premise,conclusion)]+=1
else:
invalid_rules[(premise,conclusion)]+=1
support=valid_rules
confidence=defaultdict(float)
#计算每个规则对应的置信度
for premise,conclusion in valid_rules.keys():
rule=(premise,conclusion)
confidence[rule]=valid_rules[rule]/num_occurances[premise]
这样我们便得到了每个规则所对应的置信度和支持度
打印每个规则所对应的置信度和支持度
def print_rule(premise,conclusion,support,confidence,features):
premise_name=features[premise]
conclusion_name=features[conclusion]
print("Rule: If a person buys {0} they will also buy{1}".format(premise_name,conclusion_name))
print(" - Support: {0}".format(support[(premise,conclusion)]))
print(" - Confidence: {0:.3f}".format(confidence[(premise,conclusion)]))
现在显示如果一个顾客购买苹果,那么他很有可能购买香蕉的置信度和支持度
premise=1
conclusion=3
print_rule(premise,conclusion,support,confidence,features)
结果如下
3、找出最佳的排序规则
为了找到支持度最高的规则,首先对支持度字典进行排序
from operator import itemgetter
sorted_support=sorted(support.items(),key=itemgetter(1),reverse=True)
#按照支持度降序排序
输出支持度最高的前五条规则
for index in range(5):
print("Rule #{0}".format(index+1))
premise,conclusion=sorted_support[index][0]
print_rule(premise,conclusion,support,confidence,features)
结果如下
同理,查找置信度最高的前五条规则
sorted_confidence=sorted(confidence.items(),key=itemgetter(1),reverse=True)
for index in range(5):
print("Rule #{0}".format(index+1))
premise,conclusion=sorted_confidence[index][0]
print_rule(premise,conclusion,support,confidence,features)
如果我是超市的老板的话,那么我肯定会按照以上规则对商品进行排序
写在最后
由于不经常用python语言,导致有时对代码的理解比较困难,也没有见过python那么多的奇技淫巧,呜呼哀哉,好好学习吧