Day Six——使用pandas寻找关联规则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wnma3mz/article/details/79428377

Day Six——使用pandas寻找关联规则

完整代码及数据地址

第一部分数据data.xls

第二部分数据apriori.txt

第一部分——使用Kmean聚类数据

对应函数programmer_1

步骤:

  1. 读取数据,对类别进行字符化,转换为’A’,’B’,’C’……
  2. 使用Kmeans进行离散化,这里聚类前要将数据离散化as_matrix()
  3. 得到聚类中心、进行分类统计,最后合并为新的DataFrame
  4. 计算边界点(相邻两列的均值),转换NaN为0.0

输出如下:

        1           2           3           4
A     0.0    0.178855    0.258081    0.352043
An  240.0  359.000000  278.000000   53.000000
B     0.0    0.154031    0.306200    0.564697
Bn  342.0  384.000000  194.000000   10.000000
C     0.0    0.202038    0.288739    0.423325
Cn  297.0  392.000000  206.000000   35.000000
D     0.0    0.173544    0.252731    0.359726
Dn  292.0  370.000000  224.000000   44.000000
E     0.0    0.152698    0.257873    0.376062
En  273.0  319.000000  245.000000   93.000000
F     0.0    0.179143    0.261386    0.354643
Fn  200.0  237.000000  265.000000  228.000000

关联规则学习

假设有下面几行数据,每行数据代表一次消费记录,每个字母代表一个物品。

{A, B}
{B, C, D, E}
{A, C, D, F}
{B, A, C, D}
{B, A, C, F}

他们相互之间是存在一定的关系的。一些定义如下:

  1. 数据记录所有项的集合称为总项集。{A, B, C, D, E, F}。
  2. 支持度: X Y N 。即X与Y同时出现在一个记录的次数除以数据记录总数(这里的总数为5)
  3. 置信度: X Y X 。即X与Y同时出现在一个记录的次数除以X出现的次数。

上面的支持度和置信度都是指相对的支持度和置信度。支持度和置信度越高,则关联性越强。

具体算法(Apriori)过程如下:

  1. 找出满足最小支持度的项集(生成频繁项集)。即去除那些不满足最小支持度的项集
  2. 根据上面筛选出来的项集,继续生成满足最小置信度的规则(生成强规则)
  3. 不断重复,直到最后项集只剩下一个为止。

第二部分——使用pandas计算关联规则

对应函数programmer_2

步骤:

  1. 读取数据,转换0-1矩阵,缺失值替换为0
  2. 定义支持度、置信度、连接符号
  3. 搜索关联规则

部分代码的说明



connect_string(x, ms)

list(map(lambda i: sorted(i.split(ms)), x))

x是一个list,里面包含列与列之间的连接关系。比如`['A1', 'A2', 'A3']`、`['A2---B2---C2', 'A2---B2---D2', 'A2---B2---E3', 'A2---B2---F3']`。

提取分割每个元素里面的列名,将其组成一个list。最后x变成一个二维list。`[['A1', 'A2', 'A3']]`、`[['A2', 'B2', 'C2'], ['A2', 'B2', 'D2'], ['A2', 'B2', 'E3'], ['A2', 'B2', 'F3']]`

下面的循环是进行计算排列组合,构成新的集合x。



find_rule(d, support, confidence, ms=u"--")

sf = lambda i: d[i].prod(axis=1, numeric_only=True)

计算每行的乘积,返回一个dataframe。

d_2 = pd.DataFrame( list(map(sf, column)), index=[ms.join(i) for i in column]).T

计算新的支持度。index=[ms.join(i) for i in column]重新连接column中的元素,最后返回转置后的dataframe

计算支持度
support_series_2 = 1.0 * d_2[[ms.join(i) for i in column]].sum() / len(d)

输出如下

result:
                    support  confidence
A3---F4---H4       0.078495    0.879518
C3---F4---H4       0.075269    0.875000
B2---F4---H4       0.062366    0.794521
C2---E3---D2       0.092473    0.754386
D2---F3---H4---A2  0.062366    0.753247

猜你喜欢

转载自blog.csdn.net/wnma3mz/article/details/79428377
Day