數據挖掘模型

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

1.分類與預測

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

1.1 實現過程

(1)分類併發

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

  分類模型,創建在已有類標記的數據集上,所以,屬於「有監督學習」dom

(2)預測ide

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

(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()
相關文章
相關標籤/搜索