這是最近找機器學(xué)習(xí)實習(xí)的一個筆試題:
看到這個題的時候第一想法就是用關(guān)聯(lián)規(guī)則(Apriori算法)來實現(xiàn)。
關(guān)聯(lián)規(guī)則最重要的就是支持度Support和置信度Confidence。
支持度的計算方法:
#下面式中X∩Y表示X和Y同時發(fā)生的次數(shù),N表示總事物數(shù)
support(X->Y) = X∩Y/N
置信度的計算方法:
confidence(X->Y) = support(X->Y) / support(X)
知道支持度和置信度的計算方法之后就可以實現(xiàn)上面算法了,首先本題給的數(shù)據(jù)集比較大,有六百多個項,因此直接對數(shù)據(jù)進行循環(huán)操作的話時間復(fù)雜度太高,我們先根據(jù)支持度對數(shù)據(jù)進行基本篩選。
已知:若A->Z不滿足支持度,則AB->Z亦不滿足支持度。
因此我們先找出規(guī)則左邊只有一項且滿足支持度的數(shù)據(jù),即初步剔除不滿足支持度的數(shù)據(jù),代碼如下:
import pandas as pd
import numpy as np
#讀取數(shù)據(jù)
path = r"Test2_Data.csv"
df = pd.read_csv(path,engine='python')
#sup支持度大于等于0.1
sup = 0.1
#N為事務(wù)數(shù)目
N = df.shape[0]
#初步篩選頻繁1項集,將df更新,其中列Label為數(shù)據(jù)的最后一列
data = df[df['Label']==1]
df = df[data.sum()[(data.sum()>=N*sup)].index]
然后根據(jù)通過雙層循環(huán)來選取滿足置信度條件的規(guī)則,其中在左邊有兩項的規(guī)則中需要加入支持度條件,代碼如下:
#con置信度大于等于0.7
con = 0.7
#定義變量apriori存放符合要求的關(guān)聯(lián)規(guī)則X->Y
apriori = []
for i in range(df.shape[1]-1):
#X->Y的置信度等于XY同時出現(xiàn)的次數(shù)除以X出現(xiàn)的次數(shù)
#選取左邊只有一項的規(guī)則
XY = df[(df['Label']==1)&(df.ix[:,i]==1)].shape[0]
Y = df[df.ix[:,i]==1].shape[0]
if(Y!=0 and XY/Y>=con):
apriori.append(df.columns[i] + '->' + 'Label')
elif(i == df.shape[1]-1):
break
for j in range(i+1,df.shape[1]-1):
# 選取左邊有兩項的規(guī)則
XY = df[(df['Label']==1)&(df.ix[:,i]==1)&(df.ix[:,j]==1)].shape[0]
Y = df[(df.ix[:,i]==1)&(df.ix[:,j]==1)].shape[0]
if(Y!=0 and XY/Y>=con and XY>=N*sup):
apriori.append(df.columns[i]+ df.columns[j] + '->' + 'Label')
到這里就完成了這個機器學(xué)習(xí)的筆試題。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
