python—Apriori アルゴリズムを実装するための pandas データ分析 (テーブル処理) ツール

pandas は NumPy をベースにしたツールで、名前がとてもかわいらしく、ソースは「Panel data」(計量経済用語のパネルデータ)という 2 つの単語で構成されています。Pandas には、多数のライブラリといくつかの標準データ モデルが組み込まれており、大規模なデータセットを効率的に操作するために必要なツールが提供されます。主に大規模なデータセットを処理するために使用されます。データ処理速度が最大の特徴で、あとはPython版Excelです。

API ドキュメント: http://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html

データ構造:

シリーズ: NumPy の配列によく似た 1 次元配列。実際、Series は基本的に NumPy の配列オブジェクトに基づいています。NumPy の配列とは異なり、Series はデータのラベル、つまりインデックス (インデックス) をカスタマイズし、インデックスを通じて配列内のデータにアクセスできます。

DataFrame: 2 次元の表形式のデータ構造。多くの関数は R の data.frame に似ています。DataFrame は Series のコンテナーとして理解できます。

パネル: DataFrame コンテナーとして理解できる 3 次元配列。

例えば:

import numpy as np 
import pandas as pd

datafile='.\opt\list.csv'
outfile='.\opt\output.csv'
df = pd.DataFrame(pd.read_csv(datafile,encoding="utf_8"))#导入文件
print(df.shape)#输入维度
print(df.head())#输出默认前10行
df.pop('video')#删除列
print(df['type'])#输出列
df['type'].replace('科技','科学',inplace = True)#列替换
df.to_csv(outfile,encoding="utf_8")#输出文件

リスト.csv:

出力.csv:

 

 

Apriori アルゴリズムを以下に紹介します。

Apriori アルゴリズムは、データ関連付けルールのマイニングに一般的に使用されるアルゴリズムです。このアルゴリズムの目標は、最大の K 項目頻度セットを見つけることです。最初に反復手法を使用して、候補 1 項目セットとその対応するサポートを検索します。支持度の 1 項目セットに基づいて、頻度の高い 1 項目セットが得られます。次に、残りの頻出 1 項目セットを結合して頻出 2 項目セットの候補を取得し、サポート度よりも低い頻出 2 項目セットの候補を除外して、実際の頻出 2 項セットを取得する、というように、得られなくなるまで繰り返します。頻度の高い k+1 項目セットが見つかるまで、対応する頻度の高い k 項目セットのセットがアルゴリズムの出力となります。

アルゴリズムの流れ:

1) データセット全体をスキャンして、頻出 1 項目セットの候補として現れたすべてのデータを取得します。k=1 の場合、頻出 0 項目集合は空集合です。

2) 頻繁な k 項目セットのマイニング

    a) データをスキャンして、頻度の高い k 項目セットの候補のサポートを計算します。

    b) 頻出k項目集合候補から支持度が閾値より低いデータ集合を除去し、頻出k項目集合を得る。取得した頻出 k-項目集合が空の場合は、頻出 k-1 項目集合の集合をそのままアルゴリズム結果として返し、アルゴリズムを終了する。取得した頻出k項目集合の項目が1つだけの場合には、頻出k項目集合の集合をそのままアルゴリズム結果として返し、アルゴリズムを終了する。

    c) 頻出の k 項目セットに基づいて、接続して候補の頻出 k+1 項目セットを生成します。

3) k=k+1 として、ステップ 2 に進みます。

参考コードhttps://spaces.ac.cn/archives/3380


#-*- coding: utf-8 -*-
from __future__ import print_function
import pandas as pd

d = pd.read_csv('./opt/test.csv',header=None, dtype = object)

print(u'\n转换原始数据至0-1矩阵...')
import time
start = time.clock()
ct = lambda x : pd.Series(1, index = x)
b = map(ct, d.values)
d = pd.DataFrame(list(b)).fillna(0)
d = (d==1)
end = time.clock()
print(u'\n转换完毕,用时:%0.2f秒' %(end-start))
print(u'\n开始搜索关联规则...')
del b

support = 0.06 #最小支持度
confidence = 0.75 #最小置信度
ms = '--' #连接符,用来区分不同元素,如A--B。需要保证原始表格中不含有该字符

#自定义连接函数,用于实现L_{k-1}到C_k的连接
def connect_string(x, ms):
    x = list(map(lambda i:sorted(i.split(ms)), x))
    l = len(x[0])
    r = []
    for i in range(len(x)):
        for j in range(i,len(x)):
            if x[i][:l-1] == x[j][:l-1] and x[i][l-1] != x[j][l-1]:
                r.append(x[i][:l-1]+sorted([x[j][l-1],x[i][l-1]]))
    return r

#寻找关联规则的函数
def find_rule(d, support, confidence):
    import time
    start = time.clock()
    result = pd.DataFrame(index=['support', 'confidence']) #定义输出结果

    support_series = 1.0*d.sum()/len(d) #支持度序列
    column = list(support_series[support_series > support].index) #初步根据支持度筛选
    k = 0

    while len(column) > 1:
        k = k+1
        print(u'\n正在进行第%s次搜索...' %k)
        column = connect_string(column, ms)
        print(u'数目:%s...' %len(column))
        sf = lambda i: d[i].prod(axis=1, numeric_only = True) #新一批支持度的计算函数

        #创建连接数据,这一步耗时、耗内存最严重。当数据集较大时,可以考虑并行运算优化。
        d_2 = pd.DataFrame(list(map(sf,column)), index = [ms.join(i) for i in column]).T

        support_series_2 = 1.0*d_2[[ms.join(i) for i in column]].sum()/len(d) #计算连接后的支持度
        column = list(support_series_2[support_series_2 > support].index) #新一轮支持度筛选
        support_series = support_series.append(support_series_2)
        column2 = []
        
        for i in column: #遍历可能的推理,如{A,B,C}究竟是A+B-->C还是B+C-->A还是C+A-->B?
            i = i.split(ms)
            for j in range(len(i)):
                column2.append(i[:j]+i[j+1:]+i[j:j+1])
        
        cofidence_series = pd.Series(index=[ms.join(i) for i in column2]) #定义置信度序列
        
        for i in column2: #计算置信度序列
            cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))]/support_series[ms.join(i[:len(i)-1])]
        
        for i in cofidence_series[cofidence_series > confidence].index: #置信度筛选
            result[i] = 0.0
            result[i]['confidence'] = cofidence_series[i]
            result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))]

    result = result.T.sort_values(['confidence','support'], ascending = False) #结果整理,输出
    end = time.clock()
    print(u'\n搜索完成,用时:%0.2f秒' %(end-start))
    print(u'\n结果为:')
    print(result)
    
    return result

find_rule(d, support, confidence).to_csv('./opt/out.csv')

テストテキスト: https://spaces.ac.cn/usr/uploads/2015/07/3424358296.txt

おすすめの参考ブログ:

https://www.jianshu.com/p/a77b0bc736f2

https://www.cnblogs.com/pinard/p/6293298.html

https://spaces.ac.cn/archives/3380

 

 

 

 

 

おすすめ

転載: blog.csdn.net/sm9sun/article/details/87916197