數據挖掘模型


挖掘建模根據挖掘目標和數據形式可建立:分類與預測、聚類分析、關聯規則、時序模式、偏差檢測等模型

1.分類與預測

分類與預測是預測問題的兩種主要類型,分類主要是:預測分類標號(離散屬性);預測主要是:建立連續值函數模型,預測給定自變量對應的因變量的值。

1.1 實現過程

(1)分類

  分類是構造一個分類模型,輸入樣本屬性值,輸出對應類別,將每個樣本映射到預先定義好的類別。

  分類模型,建立在已有類標記的數據集上,因此,屬於“有監督學習”

(2)預測

  預測,指建立兩種或兩種以上變量間相互依賴的函數模型,進行預測或控制

(3)實現過程

  分類算法:

  a:學習步,通過歸納分析訓練樣本集建立分類模型得到分類規則;

  b:分類步,先用已知的測試樣本集,評估分類規則的准確率

  預測模型:

  a:通過訓練集建立預測屬性的函數模型

  b:在模型通過檢驗后進行預測或控制

1.2 常用分類與預測算法   

算法名稱 算法描述
回歸分析 回歸分析,確定預測屬性與其他變量間相互依賴的定量關系。包括:線性回歸、非線性回歸、Logistic回歸、嶺回歸、主成分回歸、偏最小二乘回歸等模型
決策樹 決策樹采用自頂向下的遞歸方式,在內部節點進行屬性值比較,並根據不同的屬性值從該節點向下分支,最終得到的葉節點是學習划分的類
人工神經網絡 人工神經網絡是一種模仿大腦神經網絡結構和功能而建立的信息處理系統,表示神經網絡的輸入與輸出變量之間關系的模型
貝葉斯網絡 貝葉斯網絡又稱信度網絡,是Bayes方法的擴展,是目前不確定知識表達和推理領域最有效的理論模型之一
支持向量機 支持向量機是一種通過某種非線性映射,把低維的非線性可分轉化為高維的線性可分,在高維空間進行線性分析的算法

 

1.3 回歸分析

回歸模型名稱 適用條件 算法描述
線性回歸 因變量與自變量是線性關系 對一個或多個自變量和因變量間的線性關系進行建模,可用最小二乘法求解模型系數
非線性回歸 因變量與自變量間不都是線性關系 對一個或多個自變量和因變量間的非線性關系進行建模。若非線性關系可通過簡單的函數變換轉化成線性關系,用線性回歸的思想求解,若不能轉化,用非線性最小二乘法求解
Logistic回歸 因變量一般有1和0(是、否)兩種取值 廣義線性回歸模型的特例,利用Logistic函數將因變量的取值范圍控制在0、1之間,表示取值為1的概率
嶺回歸 參與建模的自變量間具有多重共線性 是一種改進最小二乘估計的方法
主成分回歸 參與建模的自變量間具有多重共線性 主成分回歸是根據主成分分析的思想提出的,是對最小二乘法的改進,它是參數估計的一種有偏估計。可消除自變量間的多重共線性

 

Logistic回歸建模步驟:

(1)根據分析目的設置指標變量(因變量和自變量),收集數據,根據收集到的數據,對特征(y,x1,x2....xp)進行篩選

(2)y=1時,概率p=P(y=1|X);y=0,概率為1-p。用In(p/(1-p))和自變量列出線性回歸方程:In(p/(1-p))=β01x1+.....+βpxp

(3)估計回歸系數

(4)進行模型檢驗

(5)模型應用:輸入自變量的取值,得到預測變量的值或根據得到預測變量的值取控制自變量的取值

 

利用Scikit-Learn邏輯回歸分析步驟:

首先,進行特征篩選,

特征篩選方法:

  a:通過F檢驗給出各個特征的F值和p值,篩選變量(選擇F值大或p值小的特征);

  b:遞歸特征消除:主要思想是反復構建模型,選出最好的(最差的)特征(可根據系數來選),將選出的特征放在一邊,在剩余的特征里重復這個過程,直至遍歷所有特征。

     該過程中特征被消除的次序即是:特征的排序。因此,也是一種尋找最優特征子集的貪心算法。

  c:穩定性:一種基於二次抽樣和選擇算法相結合較新的方法,主要思想是:在不同的數據子集和特征的子集上運行特征選擇算法,不斷重復,最終匯總特征選擇結果。

然后,利用篩選后的特征建立邏輯回歸模型,輸出平均正確率

#-*- coding: utf-8 -*-
#邏輯回歸 自動建模
import pandas as pd

#參數初始化
filename = '../data/bankloan.xls'
data = pd.read_excel(filename)
x = data.iloc[:,:8].as_matrix()
y = data.iloc[:,8].as_matrix()

from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR 
rlr = RLR() #建立隨機邏輯回歸模型,篩選變量
rlr.fit(x, y) #訓練模型
rlr.get_support() #獲取特征篩選結果,也可以通過.scores_方法獲取各個特征的分數
print(u'通過隨機邏輯回歸模型篩選特征結束。')
print(u'有效特征為:%s' % ','.join(data.columns[rlr.get_support()]))
x = data[data.columns[rlr.get_support()]].as_matrix() #篩選好特征

lr = LR() #建立邏輯貨櫃模型
lr.fit(x, y) #用篩選后的特征數據來訓練模型
print(u'邏輯回歸模型訓練結束。')
print(u'模型的平均正確率為:%s' % lr.score(x, y)) #給出模型的平均正確率,本例為81.4%

 

1.4 決策樹

決策樹是一種樹狀結構,它的每一個葉節點對應着一個分類,非葉節點對應着在某個屬性上的划分,根據樣本在該屬性不同取值將其划分為若干個子集。

決策樹構造的核心問題:在每一步如何選擇適當的屬性對樣本做拆分。

決策樹處理過程:對分類問題,應從已知類標記的訓練樣本中學習並構造出決策樹,自上而下,分開進行解決。

決策樹算法 算法描述
ID3算法 核心:在決策樹的各級節點上,使用信息增益方法作為屬性的選擇標准,來幫助確定生成每個節點時所應采用的合適屬性。
C4.5算法 C4.5決策樹生成算法相對於ID3算法的重要改進:使用信息增益率來選擇節點屬性。C4.5可客服ID3算法的不足:ID3算法只適用於離散的描述屬性,而C4.5算法既能處理離散的描述屬性,也可處理連續的描述屬性
CART算法 CART決策樹是一種非參數分類和回歸方法,通過構建樹、修剪樹、評估樹來構造一個二叉樹。當終結點是連續變量時,該樹為回歸樹;當終結點是分類變量,該樹為分類樹

ID3算法原理:

ID3算法流程:

(1)對當前樣本集合,計算所有屬性的信息增益;

(2)選擇信息增益最大的屬性作為測試屬性,把測試屬性取值相同的樣本划分為同一個子樣本集;

(3)若子樣本集的類別屬性只含有單個屬性,則分支為葉子節點,判斷其屬性值並標上相應的符號,然后返回調用處;否則對子樣本集遞歸調用本算法。 

#-*- coding: utf-8 -*-
#使用ID3決策樹算法預測銷量高低
import pandas as pd

#參數初始化
inputfile = '../data/sales_data.xls'
data = pd.read_excel(inputfile, index_col = u'序號') #導入數據

#數據是類別標簽,要將它轉換為數據
#用1來表示“好”、“是”、“高”這三個屬性,用-1來表示“壞”、“否”、“低”
data[data == u''] = 1
data[data == u''] = 1
data[data == u''] = 1
data[data != 1] = -1
x = data.iloc[:,:3].as_matrix().astype(int)
y = data.iloc[:,3].as_matrix().astype(int)

from sklearn.tree import DecisionTreeClassifier as DTC
dtc = DTC(criterion='entropy') #建立決策樹模型,基於信息熵
dtc.fit(x, y) #訓練模型

#導入相關函數,可視化決策樹。
#導出的結果是一個dot文件,需要安裝Graphviz才能將它轉換為pdf或png等格式。
from sklearn.tree import export_graphviz
x = pd.DataFrame(x)
from sklearn.externals.six import StringIO
x = pd.DataFrame(x)
with open("tree.dot", 'w') as f:
  f = export_graphviz(dtc, feature_names = x.columns, out_file = f)

 

 

 

1.5 人工神經網絡

人工神經網絡:模擬生物神經網絡進行信息處理的一種數學模型。

人工神經網絡的學習也稱為訓練,指的是:神經網絡在受到外部環境的刺激下調整神經網絡的參數,使神經網絡以一種新的方式對外部環境做出反應的一個過程。

分類預測時,人工神經網絡主要使用有指導的學習方式,即根據給定的訓練樣本調整人工神經網絡參數使網絡輸出接近於已知的樣本類標記或其他形式的因變量。

分類預測時,常用的算法是:誤差校正學習算法

誤差校正算法,根據神經網絡的輸出誤差對神經元的連接強度進行修正,屬於有指導學習。

設神經網絡中神經元i作為輸入,神經元j為輸出神經元,它們的連接權值為wij,則對權值的修正為△wij=ηδjYi,其中η為學習率,δj=Tj-Yj為j的偏差,即輸出神經元j的實際輸出和教師信號之差。

神經網絡訓練是否完成通過誤差函數E衡量。當誤差函數小於某個設定值時,停止神經網絡訓練。

誤差函數計算:

,N為訓練樣本個數。

人工神經網絡算法

算法名稱 算法描述
BP神經網絡 一種按誤差逆傳播算法訓練的多層前饋網絡,學習算法是:誤差校正學習算法
LM神經網絡 基於梯度下降法和牛頓法結合的多層前饋網絡,特點 :迭代次數少,收斂速度快,精確度高
RBF徑向基神經網絡 RBF網絡能以任何精度逼近任意連續函數,從輸入層到隱含層的變換是非線性的,而從隱含層到輸出層的變換是線性的,適用於解決分類問題
FNN模糊神經網絡 FNN是具有模糊權系數或輸入信號是模糊量的神經網絡
GMDH神經網絡 GMDH是前饋神經網絡中常用的一種用於預測的神經網絡。它的特點:網絡結構不固定,在訓練中不斷改變
ANFIS自適應神經網絡 神經網絡嵌在一個全部模糊的結構中,不知不覺中向訓練數據學習,自動產生、修正並高度概括出最佳的輸入與輸出變量的隸屬函數及模糊規則

 

BP算法

BP算法的學習過程由:信號的正向傳播及誤差的逆向傳播組成。

正向傳播時,輸入信號經過隱層的處理,傳向輸出層。

若輸出層節點未能得到期望的輸出,則轉入誤差的逆向傳播。

逆向傳播時,將輸出誤差按某種子形式,通過隱層向輸出層返回,並分攤給隱層的節點與輸入層節點,獲得各層單元的參考誤差,作為修改各單元權值的依據。

信號正向及逆向傳播周而復始,不斷修改權值,即神經網絡的訓練過程。

算法開始時,給定學習次數上限,初始化學習次數為0,對權值和闕值賦予小的隨機數,一般在[-1,1]。

輸入樣本數據,網絡正向傳播,得到中間層與輸出層的值,比較輸出層的值與教師信號的誤差,用誤差函數判斷誤差是否小於誤差上限。

若不小於誤差上限,則對中間層和輸出層權值和闕值進行更新

更新權值和闕值后,再次將樣本數據作為輸入,重復計算誤差E。

算法結束兩條依據:達到學習次數貨誤差達到預期

#-*- coding: utf-8 -*-
#使用神經網絡算法預測銷量高低

import pandas as pd

#參數初始化
inputfile = '../data/sales_data.xls'
data = pd.read_excel(inputfile, index_col = u'序號') #導入數據

#數據是類別標簽,要將它轉換為數據
#用1來表示“好”、“是”、“高”這三個屬性,用0來表示“壞”、“否”、“低”
data[data == u''] = 1
data[data == u''] = 1
data[data == u''] = 1
data[data != 1] = 0
x = data.iloc[:,:3].as_matrix().astype(int)
y = data.iloc[:,3].as_matrix().astype(int)

from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential() #建立模型
model.add(Dense(input_dim = 3, output_dim = 10))
model.add(Activation('relu')) #用relu函數作為激活函數,能夠大幅提供准確度
model.add(Dense(input_dim = 10, output_dim = 1))
model.add(Activation('sigmoid')) #由於是0-1輸出,用sigmoid函數作為激活函數

model.compile(loss = 'binary_crossentropy', optimizer = 'adam', class_mode = 'binary')
#編譯模型。由於我們做的是二元分類,所以我們指定損失函數為binary_crossentropy,以及模式為binary
#另外常見的損失函數還有mean_squared_error、categorical_crossentropy等,請閱讀幫助文件。
#求解方法我們指定用adam,還有sgd、rmsprop等可選

model.fit(x, y, nb_epoch = 1000, batch_size = 10) #訓練模型,學習一千次
yp = model.predict_classes(x).reshape(len(y)) #分類預測

from cm_plot import * #導入自行編寫的混淆矩陣可視化函數
cm_plot(y,yp).show() #顯示混淆矩陣可視化結果

 

1.6 分類與預測算法評價

分類與預測模型對訓練集進行預測,得到的准確率,不能很好的反映預測模型未來的性能

為有效判斷一個預測模型的性能表現,需一組沒有參與預測模型建立的數據集,並在該數據集上評價預測模型的准確率,這組獨立的數據集叫測試集。

模型預測效果評價指標:

(1)絕對誤差E與相對誤差e  

(2)平均絕對誤差MAE

(3)均方誤差MSE

(4)均方根誤差RMSE

(5)平均絕對百分誤差MAPE(一般認為MAPE小於10時,預測精度較高)

(6)Kappa統計

    Kappa統計是比較兩個或多個觀測者對同一事物,或觀測者對同一事物的兩次或多次觀測結果是否一致。Kappa統計量和加權Kappa統計量不僅可以用於無序和有序分類變量資料的一致性,重現性檢驗。

    Kappa取值在[-1,+1]間時:

    Kappa=+1,說明兩次判斷結果完全一致;

    Kappa=-1,說明兩次判斷結果完全不一致

    Kappa<0,說明一致程度比機遇造成的還差,兩次結果很不一致,在實際應用中毫無意義

    Kappa>0,說明有意義,Kappa越大,說明一致性越好

     Kappa≥0.75,說明已經取得相當滿意的一致程度

     Kappa<0,說明一致程度不夠 

(7)識別准確度Accuracy

    Accuracy=(TP+FN)/(TP+TN+FP+FN)

   TP為正確的肯定表示正確肯定的分類數,TN為正確的否定表示正確否定的分類數;

   FP為錯誤的肯定表示錯誤肯定的分類數,FN為錯誤的否定表示錯誤否定的分類數。

(8)識別精確率Precision

    Precision=TP/(TP+FP)

(9)反饋率Recall

    Recall=TP/(TP+TN)

(10)ROC曲線

(11)混淆矩陣

 

1.7 Python分類與預測模型特點

模型 模型特點 位置
邏輯回歸 較基礎的線性分類模型 sklearn.linear_model
SVM 可用來回歸、預測、分類等,根據選取不同的核函數。模型可以是線性的/非線性的 sklearn.svm
決策樹 基於“分類討論、逐步細化”思想的分類模型,模型直觀 sklearn.tree
隨機森林 思想跟決策樹類似,精度通常比決策樹要高,缺點是由於其隨機性,喪失了決策樹的可解釋性 sklearn.ensemble
朴素貝葉斯 基於概率思想的簡單有效的分類模型,能給出容易理解的概率解釋 sklearn.naive_bayes
神經網絡 具有強大的擬合能力,可用於擬合、分類等,它有很多個增強版本 Keras

 

2.聚類分析

2.1 常用聚類分析算法

聚類分析是在沒有給定划分類別的情況下,根據數據相似度進行樣本分組的一種方法。

聚類模型建立在無類標記的數據上,是一種非監督的學習算法。

聚類的輸入是一組未被標記的樣本,聚類根據數據自身的距離或相似度將其划分為若干組,划分原則是:組內距離最小化而組間距離最大化。

常用聚類方法:

類別 包括的主要算法
划分(分裂)方法 K-Means算法(K-平均)、K-MEDOIDS算法(K-中心點)、CLARANS算法(基於選擇的算法)
層次分析方法 BIRCH算法(平衡迭代規約和聚類)、CURE算法(代表點聚類)、CHAMELEON算法(動態模型)
基於密度的方法 DBSCAN算法(基於高密度連接區域)、DENCLUE算法(密度分布函數)、OPTICS算法(對象排序識別)
基於網格的方法 STING算法(統計信息網絡)、CLIOUE算法(聚類高維空間)、WAVE-CLUSTER算法(小波變換)
基於模型的方法 統計學方法、神經網絡方法

 

常用聚類算法:

算法名稱 算法描述
K-Means K-均值聚類(快速聚類發),在最小化誤差函數的基礎上將數據划分為預定的類數K。該算法原理簡單便於處理大量數據。
K-中心點 K-均值算法對孤立點的敏感性,K-中心點算法不采用簇中對象的平均值作為簇中心,選用簇中離平均值最近的對象作為簇中心。
系統聚類 系統聚類也稱多層次聚類,分類的單位由高到低呈樹形結構,且處位置越低,其包含的對象就越少,但這些對象間的共同特征越多。該聚類方法只適合小數量的時使用,數據量大時速度會非常慢。

 

2.2 K-Means聚類算法

  http://blog.csdn.net/qq_36663613/article/details/72784444

  K-Means算法是典型的基於距離的非層次聚類算法,在最小化誤差函數的基礎上將數據划分為預定的類數K,采用距離作為相似性評價指標,即認為兩個對象的距離越近,其相似度越大。

(1)算法過程

  a:從N個樣本數據中隨機選取K個對象作為初始的聚類中心;

  b:分別計算每個樣本到各個聚類中心的距離,將對象分配到距離最近的聚類中;

  c:所有對象分類完成后,重新計算K個聚類的中心;

  d:與前一次計算得到的K個聚類中心比較,若聚類中心發生變化,轉過程2,否則,轉過程5;

  e:當質心不發生變化時,停止並輸出聚類結果。

(2)數據類型與相似性變量

  連續屬性,先對各屬性值進行零——均值規范,再進行距離計算。K-Means算法,一般需先度量樣本間(歐幾里得距離、曼哈頓距離、閔可夫斯距離) ,樣本與簇間(樣本到簇中心的距離)及簇與簇間距離(簇中心距離 )。

  文檔數據,使用余弦相似性度量,先將文檔數據整理成文檔——詞矩陣格式,再計算相似性

(3)目標函數

  使用誤差平方和SSE作為度量聚類質量的目標函數,對兩種不同的聚類結果,選擇誤差平方和較小的分類結果。

  連續屬性的SSE

  文檔數據的SSE

  簇Ei的聚類中心ei

#-*- coding: utf-8 -*-
#使用K-Means算法聚類消費行為特征數據

import pandas as pd

#參數初始化
inputfile = '../data/consumption_data.xls' #銷量及其他屬性數據
outputfile = '../tmp/data_type.xls' #保存結果的文件名
k = 3 #聚類的類別
iteration = 500 #聚類最大循環次數
data = pd.read_excel(inputfile, index_col = 'Id') #讀取數據
data_zs = 1.0*(data - data.mean())/data.std() #數據標准化

from sklearn.cluster import KMeans
model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分為k類,並發數4
model.fit(data_zs) #開始聚類

#簡單打印結果
r1 = pd.Series(model.labels_).value_counts() #統計各個類別的數目
r2 = pd.DataFrame(model.cluster_centers_) #找出聚類中心
r = pd.concat([r2, r1], axis = 1) #橫向連接(0是縱向),得到聚類中心對應的類別下的數目
r.columns = list(data.columns) + [u'類別數目'] #重命名表頭
print(r)

#詳細輸出原始數據及其類別
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)  #詳細輸出每個樣本對應的類別
r.columns = list(data.columns) + [u'聚類類別'] #重命名表頭
r.to_excel(outputfile) #保存結果


def density_plot(data): #自定義作圖函數
  import matplotlib.pyplot as plt
  plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽
  plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號
  p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)
  [p[i].set_ylabel(u'密度') for i in range(k)]
  plt.legend()
  return plt

pic_output = '../tmp/pd_' #概率密度圖文件名前綴
for i in range(k):
  density_plot(data[r[u'聚類類別']==i]).savefig(u'%s%s.png' %(pic_output, i))

2.3 聚類分析算法評價

 聚類分析:根據樣本數據本身將樣本分組。

聚類目標:實現組內對象相互間是相似的結果。

聚類評價:組內相似性越大,組間差別越大,聚類效果越好。

評價方法:

(1)purity評價法【計算正確聚類數占總數的比例】

    

    xk表示第k個聚類的組合,x是聚類的集合,y表示需要被聚類的集合,yi表示第i個對象,n表示被聚類集合對象總數。

(2)RI評價法【排列組合原理對聚類進行評價】

    

    R表示應該被聚在一類的兩個對象被正確分類,W表示不應該被聚在一類的兩個對象被正確分類,M表示不應該聚在一類的對象被錯誤歸在一類,D表示不應該分開對象被錯誤分開

(3)F值評價法【RI方法衍生】

2.4 Python主要聚類分析算法

對象名 函數功能 所屬工具箱
K-Means K均值聚類 sklearn.cluster
AffinityPropagation 吸引力傳播聚類(運行效率較低) sklearn.cluster
MeanShift 均值漂移聚類算法 sklearn.cluster
SpectralClustering 譜聚類(效果比K均值好,速度比K均值快) sklearn.cluster
AgglomerativeClusering 層次聚類 sklearn.cluster
DBSCAN 具有噪聲的基於密度的聚類方法 sklearn.cluster
BIRCH 綜合層次聚類算法,適用於大規模數據聚類 sklearn.cluster

TSNE:聚類結果可視化工具

#-*- coding: utf-8 -*-
#接k_means.py
from sklearn.manifold import TSNE

tsne = TSNE()
tsne.fit_transform(data_zs) #進行數據降維
tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #轉換數據格式

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號

#不同類別用不同顏色和樣式繪圖
d = tsne[r[u'聚類類別'] == 0]
plt.plot(d[0], d[1], 'r.')
d = tsne[r[u'聚類類別'] == 1]
plt.plot(d[0], d[1], 'go')
d = tsne[r[u'聚類類別'] == 2]
plt.plot(d[0], d[1], 'b*')
plt.show()  

3.關聯規則

關聯規則目的:在一個數據集中,找出各項之間的關聯關系。

3.1 常用關聯規則算法

算法名稱 算法描述
Aprior 關聯規則是最常用的挖掘頻繁項集的算法,核心是通過連接產生候選項及其支持度然后通過剪枝生成頻繁項集
FP-Tree 針對Aprior算法的固有的多次掃描事務數據集的缺陷,提出不產生候選頻繁項集的方法。Aprior和FP-Tree都是尋找頻繁項集的算法。
Eclat算法 Eclat算法是一種深度優先算法,采用垂直數據表示形式,在概念格理論基礎上利用基於前綴的等價關系將搜索空間划分為較小的子空間
灰色關聯法 分析和確定各因素間影響程度或是若干個子因素(子序列)對主因素(母序列)的貢獻度而進行的一種分析方法

 

3.2 Apriori算法

(1)關聯規則和頻繁項集

A:關聯規則的一般形式:

項集A、B同時發生的概率稱為關聯規則的支持度

項集A發生,則項集B發生的概率為關聯規則的置信度

B:最小支持度和最小置信度

最小支持度:衡量支持度的一個闕值,表示項目集在統計意義上的最低重要性

最小置信度:衡量置信度的一個闕值,表示關聯規則的最低可靠性

同時滿足最小支持度闕值和最小置信度闕值的規則稱為強規則

C:項集

項集是項的集合。包括k個項的項集稱為k項集

項集的出現頻率是所有包含項集的事務個數

若項集I的相對支持度滿足預定義的最小支持度闕值,則I是頻繁項集

D:支持度計數

項集A的支持度計數是事務數據集中包含項集A的事務個數,簡稱為項集的頻率或計數

已知項集的支持度計數,則規則A→B的支持度和置信度易從所有事務計數、項集A和項集A U B的支持度計數推出

相關博客:http://blog.csdn.net/wo334499/article/details/51698810

     

    

(2)Aprior算法

 Aprior算法主要思想是:找出存在於事務數據集中的最大的頻繁項集,在利用得到的最大頻繁項集與預先設定的最小置信度闕值生成強關聯規則

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

#自定義連接函數,用於實現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, ms = u'--'):
  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(['confidence','support'], ascending = False) #結果整理,輸出
  print(u'\n結果為:')
  print(result)
  
  return result

 

4.時序模式

4.1 時間序列算法

模型名稱 描述
平滑法 平滑法用於趨勢分析和預測,利用修勻技術,削弱短期隨機波動對序列的的影響,使序列平滑化。
趨勢擬合法 趨勢擬合法把時間作為自變量,相變的序列觀察值作為因變量,建立回歸模型。根據序列特征,可具體分為線性擬合和曲線擬合
組合模擬

時間序列變化主要受長期趨勢(T)、季節變動(S)、周期變動(C)和不規則變動(e)影響。根據序列特點,可構建:【加法模型:xt=Tt+St+Ctt】【乘法模型:xt=Tt*St*Ctt

AR模型  
MA模型  
ARMA模型  
ARIMA模型  
ARCH模型  
GARCH模型及衍生模型  

 

4.2 時間序列預處理

序列預處理:觀察值序列的純隨機性和平穩性檢驗稱為序列預處理

 

純隨機序列(白噪聲序列):序列各項間沒有任何相關關系,序列在進行完全無序的隨機波動,可終止對該序列的分析。白噪聲序列是沒有信息可提取的平穩序列。

平穩非白噪聲序列:通常是建立一個線性模型來擬合該序列的發展,借此提取該序列額有用信息。常用的模型是:ARMA(平穩序列擬合模型)。

非平穩序列:均值、方差不穩定,處理方法,將其轉變為平穩序列,再進行分析。

(1)平穩性檢驗

    a:平穩時間序列定義

         單個隨機變量X,可計算其均值(數學期望)μ、方差σ2

    兩個隨機變量X、Y,可計算X、Y的協方差cov(X,Y)、相關系數ρ(X,Y)

    若時間序列再某一個常數附近波動且波動范圍有限,即有常數均值和常數方差。延遲k期的序列變量的自協方差和自相關系數相等,則該時間序列是平穩序列。

     b:平穩性檢驗

    時序圖檢驗

    自相關圖檢驗

    單位根檢驗

(2)純隨機性檢驗

     若一個序列是純隨機序列,那么它的序列值之間應沒有 任何關系,即滿足y(k)=0,k!=0,實際上純隨機序列樣本自相關系數很接近0,並在0附近隨機波動。

     純隨機性檢驗,一般是構造檢驗統計量來檢驗序列的純隨機性。常用的檢驗統計量有Q統計量、LB統計量

     由樣本各延遲期數的自相關系數可計算得到檢驗統計量,然后計算出對應的P值,若P值顯著大於顯著性水平a,則表示該序列不能拒絕純隨機的原假設,可停止對該序列的分析。 

4.3 平穩時間序列分析

(1)AR模型

(2)MA模型

(3)ARMA模型

(4)平穩時間序列建模

    A:計算ACF和PACF。先計算非平穩白噪聲序列的自相關系數(ACF)和偏自相關系數(PACF)

    B:ARMA模型識別(模型定階)。由AR(p)模型、MA(q)、ARMA(p、q)的自相關系數和偏自相關的性質,選擇合適的模型

    C:估計模型未知參數的值並進行參數檢驗

    D:模型檢驗

    E:模型優化

    F:模型應用,短期預測

(5)ARMA模型識別原則

模型 自相關系數(ACF) 偏自相關系數(PACF)
AR(p) 拖尾 p階截尾
MA(q) q階截尾 拖尾
ARMA(p,q) p階截尾 q階拖尾

4.4 非平穩時間序列分析

(1)差分運算(具有較強的確定性信息提取能力)

    p階差分:相距一期的兩個序列值之間的減法運算稱為 1階差分運算

    k步差分:相距k期的兩個序列值之間的減法運算稱為k步差分運算

(2)ARIMA模型

    差分平穩時間序列模型建模步驟

#-*- coding: utf-8 -*-
#arima時序模型實現代碼

import pandas as pd

#參數初始化
discfile = '../data/arima_data.xls'
forecastnum = 5

#讀取數據,指定日期列為指標,Pandas自動將“日期”列識別為Datetime格式
data = pd.read_excel(discfile, index_col = u'日期')

#時序圖
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號
data.plot()
plt.show()

#自相關圖
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data).show()

#平穩性檢測
from statsmodels.tsa.stattools import adfuller as ADF
print(u'原始序列的ADF檢驗結果為:', ADF(data[u'銷量']))
#返回值依次為adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

#差分后的結果
D_data = data.diff().dropna()
D_data.columns = [u'銷量差分']
D_data.plot() #時序圖
plt.show()
plot_acf(D_data).show() #自相關圖
from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(D_data).show() #偏自相關圖
print(u'差分序列的ADF檢驗結果為:', ADF(D_data[u'銷量差分'])) #平穩性檢測

#白噪聲檢驗
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪聲檢驗結果為:', acorr_ljungbox(D_data, lags=1)) #返回統計量和p值

from statsmodels.tsa.arima_model import ARIMA

data[u'銷量'] = data[u'銷量'].astype(float)
#定階
pmax = int(len(D_data)/10) #一般階數不超過length/10
qmax = int(len(D_data)/10) #一般階數不超過length/10
bic_matrix = [] #bic矩陣
for p in range(pmax+1):
  tmp = []
  for q in range(qmax+1):
    try: #存在部分報錯,所以用try來跳過報錯。
      tmp.append(ARIMA(data, (p,1,q)).fit().bic)
    except:
      tmp.append(None)
  bic_matrix.append(tmp)

bic_matrix = pd.DataFrame(bic_matrix) #從中可以找出最小值

p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC最小的p值和q值為:%s、%s' %(p,q)) 
model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型
model.summary2() #給出一份模型報告
model.forecast(5) #作為期5天的預測,返回預測結果、標准誤差、置信區間。

 

 

4.5 Python主要時序模式算法

函數名 函數功能 所屬工具箱 使用格式 備注
acf() 計算自相關系數 statsmodels.tsa.stattools autocorr=acf(data,unbiased=False,nlags=40,qstat=False,fft=False,alpha=None) data為觀測值序列(時間序列,可以是DataFrame或Series),返回參數autocorr為觀測值序列自相關函數,其余的均為可選參數
plot_acf() 畫自相關系數圖 statsmodels.graphics.tsaplots p=plot_acf(data)  
pacf() 計算偏相關系數 statsmodels.tsa.stattools autocorr=pacf(data,unbiased=False,nlags=40,qstat=False,fft=False,alpha=None)  
plot_pacf() 畫偏相關系數圖 statsmodels.graphics.tsaplots p=plot_pacf(data)  
adfuller() 對觀測值序列進行單位根檢驗 statsmodels.tsa.stattools h=adffuller(Series,maxlag=None,regression='c',autolag='AIC',store=Fals,regresults=False) 輸入參數Series為一維觀測值序列,返回值依次為:adf、pvalue、usedlag、nobs、critical、values、icbest、regresults、resstore
diff() 對觀測值序列進行差分計算 Pandas對象自帶的方法 D.diff() D為Pandas的DataFrame或Series
ARIMA() 創建一個ARIMA時序模型 statsmodels.tsa.arima_model arima=ARIMA(data,(p,1,q)).fit() data參數為輸入的時間序列,p、q為對應的階,d為差分次數
summary()或summaty2 給出一份ARIMA模型的報告 ARIMA模型對象自帶的方法 arima.summary()/arima.summary2() arima為已建立好的ARIMA模型,返回一份格式化的模型報告,包含模型的系數、標准誤差、p值、AIC、BIC等指標
aic\bic\hqic 計算ARIMA模型的AIC\BIC\HQIC指標值 ARIMA模型對象自帶的變量 arima.aic/arima.bic/arima.hqic arima為已建立好的ARIMA模型,返回值是Model時序模型得到的AIC、BIC、HQIC指標值
forecast() 應用構建的時序模型進行預測 ARIMA模型對象自帶的方法 a,b,c=arima.forecast(num) 輸入參數num為要預測的天數,arima為已建立好的ARIMA模型,a為返回的預測值,b為預測的誤差,c為預測置信區間
acorr_ljungbox() Ljung-Box檢驗,檢驗是否為白噪聲 statsmodels.tsa.diagnostic acorr_ljungbox(data,lags=1) 輸入參數data為時間序列數據,lags為滯后數,返回統計量和p值

5.離群點檢測

  離群點成因:數據來源於不同的類、自然變異、數據測量、收集誤差

  離群點分類:

分類標准 分類名稱
從數據范圍 全局離群點和局部離群點
從數據類型 數值型離群點和分類型離群點
從屬性個數 一維離群點和多維離群點

5.1 離群點檢測方法

離群點檢測方法 方法描述 方法評估
基於統計 大部分基於統計的離群點檢測方法是:構建一個概率分布模型,並計算對象符合該模型的概率,將具有低概率的對象視為離群點 前提是:知道數據服從何種分布,對高維數據,檢驗效果很差
基於鄰近度 通常可在數據對象間定義鄰近性度量,把遠離大部分點的對象視為離群點

二維、三維的數據可做散點圖觀察,大數據不適用,對參數選擇敏感,具有全局闕值,不能處理具有不同密度區域的數據集

基於密度 考慮數據集可能存在不同密度區域,離群點是在低密度區域中的對象 給出對象是離群點的定量度量,即使數據具有不同的區域很好處理,大數據集不適用,參數選擇比較難
基於聚類 一種利用聚類檢測離群點的方法是:丟棄遠離其他簇的小簇。首先聚類所有對象,然后評估對象屬於簇的程度 基於聚類技術來發現離群點可能死高度有效的,聚類算法產生的簇的質量對該算法產生的離群點的質量影響非常大

 

5.2 基於模型的離群點檢測方法

5.3 基於聚類的離群點檢測方法

  (1)丟棄遠離其他簇的小簇,該過程可簡化為丟棄小於某個最小闕值的所有簇。

  (2)基於原型的聚類,該過程首先聚類所有對象,然后評估對象屬於簇的程度,可用對象到它的簇中心的距離來度量屬於簇的程度。

      對於基於原型的聚類,有兩種方法評估對象屬於簇的程度(離群點得分)

      a:度量對象到簇原型的距離,並用它作為該對象的離群點得分

      b:考慮到簇具有不同的密度,可以度量簇到原型的相對距離,相對距離是點到質心的距離與簇中所有點到質心的距離的中位數之比。

#-*- coding: utf-8 -*-
#使用K-Means算法聚類消費行為特征數據

import numpy as np
import pandas as pd

#參數初始化
inputfile = '../data/consumption_data.xls' #銷量及其他屬性數據
k = 3 #聚類的類別
threshold = 2 #離散點閾值
iteration = 500 #聚類最大循環次數
data = pd.read_excel(inputfile, index_col = 'Id') #讀取數據
data_zs = 1.0*(data - data.mean())/data.std() #數據標准化

from sklearn.cluster import KMeans
model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分為k類,並發數4
model.fit(data_zs) #開始聚類

#標准化數據及其類別
r = pd.concat([data_zs, pd.Series(model.labels_, index = data.index)], axis = 1)  #每個樣本對應的類別
r.columns = list(data.columns) + [u'聚類類別'] #重命名表頭

norm = []
for i in range(k): #逐一處理
  norm_tmp = r[['R', 'F', 'M']][r[u'聚類類別'] == i]-model.cluster_centers_[i]
  norm_tmp = norm_tmp.apply(np.linalg.norm, axis = 1) #求出絕對距離
  norm.append(norm_tmp/norm_tmp.median()) #求相對距離並添加

norm = pd.concat(norm) #合並

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號
norm[norm <= threshold].plot(style = 'go') #正常點

discrete_points = norm[norm > threshold] #離群點
discrete_points.plot(style = 'ro')

for i in range(len(discrete_points)): #離群點做標記
  id = discrete_points.index[i]
  n = discrete_points.iloc[i]
  plt.annotate('(%s, %0.2f)'%(id, n), xy = (id, n), xytext = (id, n))

plt.xlabel(u'編號')
plt.ylabel(u'相對距離')
plt.show()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM