数据挖掘是啥:
简单来说,就是对数据进行挖掘,找到数据中的知识或者模式。数据挖掘的工作就是对数据进行自动或半自动的分析,以提出数据中的模式或知识,例如:数据的分类(聚类分析)、数据异常记录(异常检测)、数据间的关系(关联式规则挖掘)。
工具介绍:安装Jupyter Notebook(点此到官网指南):可用命令行安装 或 直接下载图形化界面(Jupyter Navigator)
「安装完后在命令行 或 cmd输入「jupyter notebook」就可以运行啦,如下」
Jupyter Notebook 有点介于IDE跟编辑器之间,可以做到逐行运行,并且实时展示运行结果(尤其是数据的可视化),并且可以把结果输出成html5 进行分享或者嵌入网页。
不过初学者直接使用Notebook的话,要注意代码逻辑之类的,避免养成东一块西一块的习惯。
$jupyter notebook安装scikit-learn(点此前往官网指南)「需要提前安装
- scikit-learn 是个机器学习的库,包括许多用来做机器学习的算法、数据集、部件、框架,反正就是蛮适合新手上路的,try it。
- NumPy是个扩展库,核心就是支持多维的矩阵运算(ndarray)。
- SciPy是个算法库,也是个数学工具包。
PS:这三个库会成为我们这段日子最忠实的伙伴。
结合性分析(affinity analyse):举个小栗子:一个顾客在买某件商品的时候,通常也会买另一件商品。那么我们就可以通过结合性分析来展示这种关联关系。「ps:这种结合性分析展示的是数据上的关联关系(correlation)而不是因果关系(causation),我们资讯管理的教授就经常强调,数据上的关联不代表因果的推导,谨记,谨记」
接下来跑跑程式,看看这种结合性分析是咋样的。我们假设:客户在超市买产品X时,很大程度上也会买产品Y。我们的数据在这里(affinity_dataset.txt),建议先保存到本地,然后在Jupyter上用numpy来加载数据集。
import numpy as np
#把路径改为你数据集的路径
dataset_filename = "/Users/vincentyau/DataMining/withPython/affinity_dataset.txt"
#读取txt文件,但要求每一行数据格式相同
x = np.loadtxt(dataset_filename)来查看一下数据集的前5行数据长什么样子。「当然最好还是要事先了解数据集的结构」其中每一行数据都代表一次交易购买的产品。如第一行[ 0. 0. 1. 1. 1.],分别代表是bread、milk、cheese、apples和bananas(1代表有购买此商品,0代表没有)
print(x[:5])这个数据集有100个样本和5个特征(features),我们可以通过ndarray的shape方法来将值赋给n_samples, n_features:
n_samples, n_features = x.shape现在将真实的features保存到一个list中:
features = ["bread", "milk", "cheese", "apple", "bananas"]接下来我们要实现一个排序方法,来根据顾客购买的X产品,推测最有可能买的Y产品。这里先讲几个个概念:支持度(support)、置信度(confidence)、前提索引(premise)与结论索引(conclusion)。
支持度:某种情况(称之为:规则X => Y)在数据集中出现的次数。例如:同时购买bread 与 milk的情况有多少次P(XUY)。(就是某种情况出现的次数有多少)
置信度:某种情在数据集中出现的次数与规则中某一部分单独出现次数的比值。例如:(同时购买bread与mik的次数)/(只购买bread而不购买mik的次数)。
前提索引:规则的前提,这里的bread就被称为前提索引。
结论索引:规则的结论,这里的milk就被称为结论索引。
我们可以将数据集中的规则都计算出来,看客户购买商品之间的关联:
from collections import defaultdict
#設置一些字典來存結果,valid_rules存放有效的規則,num_occurences存放premise出現的次數
#valid_rules{鍵(前提,結論),值(字典)}
valid_rules = defaultdict(int)
invalid_rules = defaultdict(int)
#{鍵(前提),值(字典)}
num_occurences = defaultdict(int)
#對於x中的每一行中的每一個元素(features)
for sample in x:
for premise in range(n_features):
if sample[premise] == 0:
continue #如果這個产品没有被购买的话,则前提不存在,跳出循环
num_occurences[premise] += 1.0 #出现一次前提条件 +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字典{鍵(前提,結論),值(字典)}
confidence = defaultdict(float)
#必须循环每一对rule, 然后构建confidence
for premise, conclusion in valid_rules.keys():
rule = (premise, conclusion)
confidence[rule] = valid_rules[rule] / num_occurences[premise]
#用可阅读的方式把规则打印出来
for premise, conclusion in confidence:
premise_name = features[premise]
conclusion_name = features[conclusion]
print("规则: 如果一个顾客买了{0},他也会买{1}".format(premise_name, conclusion_name))
print("- Confidence:{0:.3f}".format(confidence[(premise, conclusion)]))
print("- Support:{0}".format(support[(premise, conclusion)]))
print("")我们可以把打印规则写成一个函数,之后直接调用:
#把打印的方式写成函数
def print_rule(premise, conclusion, confidence, support, features):
premise_name = features[premise]
conclusion_name = features[conclusion]
print("规则: 如果一个顾客买了{0},他也会买{1}".format(premise_name, conclusion_name))
print("- Confidence: {0:.3f}".format(confidence[(premise, conclusion)]))
print("- Support: {0}".format(support[(premise, conclusion)]))
print("")把规则都计算完之后,我们来排个序,把最有关联的情况打印出来:
#对规则进行排序,即同时对support与confidence进行排序,求最好
#字典默认没有顺序,因此可以用item()把字典的的数据转成list,然后用itemgetter来排序
from operator import itemgetter
sorted_support = sorted(support.items(), key = itemgetter(1), reverse = True)
sorted_confidence = sorted(confidence.items(), key = itemgetter(1), reverse = True)
#打印top5个数据
for index in range(5):
print("Rule #{0}".format(index + 1))
premise, conclusion = sorted_confidence[index][0]
print_rule(premise, conclusion, confidence, support, features)当然也可以用matplotlib把数据结果直接可视化,jupyter对数据可视化的支持贼好:
jupyter#可视化数据结果
from matplotlib import pyplot as plt
plt.plot([confidence[rule[0]] for rule in sorted_confidence])
plt.show()
参考资料:Robert Layton. (2017). Learning Data Mining with Python, (2nd ed). Birmingham, UK: Packt Publishing Ltd.