分類與預測
餐飲企業經常會碰到下面的問題:
- 如何預測未來一段時間內,哪些顧客會流失,哪些顧客最有可能成為VIP客戶?
- 如何預測一種心產品的銷售量,以及在哪種類型的客戶中會較受歡迎?
除此之外,餐廳經理需要通過數據分析來了解具有某些特征的顧客的消費習慣/這些都是分類與預測的例子。
常見的分類預測算法
貝葉斯
貝葉斯(Bayes)分類算法是一類利用概率統計知識進行分類的算法,如樸素貝葉斯(Naive Bayes)算法。這些算法主要利用Bayes定理來預測一個未知類別的樣本屬于各個類別的可能性,選擇其中可能性最大的一個類別作為該樣本的最終類別。
決策樹
決策樹是用于分類和預測的主要技術之一,決策樹學習是以實例為基礎的歸納學習算法,它著眼于從一組無次序、無規則的實例中推理出以決策樹表示的分類規則。
人工神經網絡
人工神經網絡(Artificial Neural Networks,ANN)是一種應用類似于大腦神經突觸聯接的結構進行信息處理的數學模型。在這種模型中,大量的節點(或稱”神經元”,或”單元”)之間相互聯接構成網絡,即”神經網絡”,以達到處理信息的目的。
支持向量機
支持向量機(SVM,Support Vector Machine)是Vapnik根據統計學習理論提出的一種新的學習方法[43] ,它的最大特點是根據結構風險最小化準則,以最大化分類間隔構造最優分類超平面來提高學習機的泛化能力,較好地解決了非線性、高維數、局部極小點等問題。
決策樹簡介
決策樹(Decision Tree)是一個預測模型,他代表的是對象屬性與對象值之間的一種映射關系。樹中每個節點表示某個對象,而每個分叉路徑則代表的某個可能的屬性值,而每個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的對象的值。決策樹僅有單一輸出,若欲有復數輸出,可以建立獨立的決策樹以處理不同輸出。 數據挖掘中決策樹是一種經常要用到的技術,可以用于分析數據,同樣也可以用來作預測。
示例
記錄
根據上述數據構造出如下決策樹
信息熵、條件熵和信息增益
信息熵
信息熵也稱為香農熵,是隨機變量的期望。度量信息的不確定程度。信息的熵越大,信息就越不容易搞清楚。處理信息就是為了把信息搞清楚,就是熵減少的過程。決定信息的不確定性或者說復雜程度主要因素是概率。
我們要獲得隨機變量 D 的取值結果至少要進行1次試驗,試驗次數與隨機變量 D 可能的取值數量(2種)的對數函數Log有聯系。Log2=1(以2為底)。因此熵的計算公式是:
條件熵
條件熵是通過獲得更多的信息來消除一元模型中的不確定性。也就是通過二元或多元模型來降低一元模型的熵。我們知道的信息越多,信息的不確定性越小。例如,只使用一元模型時我們無法根據用戶歷史數據中的購買頻率來判斷這個用戶本次是否也會購買。因為不確定性太大。在加入了促銷活動,商品價格等信息后,在二元模型中我們可以發現用戶購買與促銷活動,或者商品價格變化之間的聯系。并通過購買與促銷活動一起出現的概率,和不同促銷活動時購買出現的概率來降低不確定性。以下公式為屬性A的信息條件熵。
用屬性A出現的概率乘以屬性A確定的情況下,相應分類的信息熵。
信息增益
信息增益用來衡量信息之間相關性的指標。用于度量屬性A降低樣本集合X熵的貢獻大小。信息增益越大,不確定性越小,越適于對X分類。具體的計算方法就熵與條件熵之間的差。公式如下:
ID3 算法原理
奧卡姆剃刀(Occam's Razor, Ockham's Razor),又稱“奧坎的剃刀”,是由14世紀邏輯學家、圣方濟各會修士奧卡姆的威廉(William of Occam,約1285年至1349年)提出,他在《箴言書注》2卷15題說“切勿浪費較多東西,去做‘用較少的東西,同樣可以做好的事情’。簡單點說,便是:be simple。
ID3算法(Iterative Dichotomiser 3 迭代二叉樹3代)是一個由Ross Quinlan發明的用于決策樹的算法。這個算法便是建立在上述所介紹的奧卡姆剃刀的基礎上:越是小型的決策樹越優于大的決策樹(be simple 簡單理論)。盡管如此,該算法也不是總是生成最小的樹形結構,而是一個啟發式算法。
OK,從信息論知識中我們知道,期望信息越小,信息增益越大,從而純度越高。ID3算法的核心思想就是以信息增益度量屬性選擇,選擇分裂后信息增益(很快,由下文你就會知道信息增益又是怎么一回事)最大的屬性進行分裂。該算法采用自頂向下的貪婪搜索遍歷可能的決策樹空間。
算法流程:
- 對當前樣本集合計算所有屬性的信息增益;
- 選擇信息增益最大的屬性作為測試屬性,把測試屬性取值相同的樣本劃為同一個子樣本集;
- 若子樣本集的類別屬性只含有單個屬性,則分支為葉子節點,判斷其屬性之并標上相應的符號,然后返回調用處;否則對子樣本集遞歸調用本算法。
缺點
由于ID3決策樹算法采用信息增益作為選擇測試屬性的標準,會偏向于選擇取值較多的,即所謂的高度分支屬性,而這類屬性并不一定是最優屬性。并且其只能處理離散屬性,對于連續類型屬性需要對其進行離散化。為了解決傾向于選擇高度分支屬性的問題,采用信息增益率作為選擇測試屬性的標準,這樣便有了C4.5決策樹算法。常用的還有 CART,SLIQ,SPRINT,PUBLIC等。
決策樹實例
這是一家高爾夫球俱樂部的歷史數據,里面記錄了不同天氣狀況用戶來打高爾夫球的歷史記錄。我們要做的是通過構建決策樹來預測用戶是否會來打高爾夫球。這里用戶是否來打球是一個一元模型,具有不確定性,熵值很高。我們無法僅通過Yes和No的頻率來判斷用戶明天是否會來。因此,需要借助天氣的信息來減少不確定性。下面分別記錄到了4種天氣情況,我們通過計算條件熵和互信息來開始構建決策樹的第一步:構建根決策點。
構建根決策節點
構建根決策點的方法就是尋找4種天氣情況中與打高爾夫球相關性最高的一個。首先我們來看Play Golf這個一元模型的熵,來看看這件事的不確定性有多高.
一元模型的熵即信息熵
在一元模型中,僅通過歷史數據的概率來看預測Play Golf是一件非常不確定的事情,在14條歷史數據中,打球的概率為64%,不打球的概率為36%。熵值達到了0.940。這與之前拋硬幣的例子很像。在無法改變歷史數據的概率時,我們需要借助更多的信息來降低不確定性。也就是計算條件熵。
二元模型條件熵
計算二元模型的條件熵需要知道Play Golf與4種天氣情況一起出現的概率,以及在不同天氣情況下Play Golf出現的條件概率。下面我們分別來計算這兩類概率。
出現概率
條件概率
條件熵
信息增益
在已知Play Golf的一元模型熵和不同天氣條件下的二元模型熵后。我們就可以通過信息增益來度量哪種天氣與Play Golf的相關性最高了。
構建根節點
在整個決策樹中,Outlook因為與Play Golf的相關性最高,所以作為決策樹的根節點。以Outlook作為根節點后,決策樹出現了三個分支,分別是Outlook的三個不同的取值Sunny,Overcast和Rainy。其中Overcast所對應的Play Golf都是Yes,因此這個分支的葉子節點為Yes。
構建分支節點
另外兩個分支我們將使用和前面一樣的方法,通過計算熵,條件熵和信息增益來挑選下一個分支的決策節點。
通過將決策樹中每個決策點還原為原始數據表可以發現,每一個決策點都對應了一張數據表。從根決策節點開始,我們通過計算熵尋找與Play Golf最相關的天氣信息,來建立決策點及分支,并反復迭代這一過程。直到最終構建完整的決策樹。
使用決策樹進行預測
文章開始的時候我們說過,決策樹是用來進行分類和預測的。具體過程如下。當我們構建好決策樹后,當有新的信息發送時,我們利用已有的決策樹邏輯對新的信息結構進行判斷。當信息的內容與決策樹一致時,就進入下一分支進行判斷,并通過葉子節點獲得分類的結果。例如,當新的一天開始時,我們就可以通過4個天氣特征來判斷用戶是否會來打高爾夫球。以下是具體預測流程的示意圖,首先尋找新信息中的根決策節點Outlook,根據Outlook的取值進入到Sunny分支,在Sunny分支中繼續判斷下一決策點Windy的取值,新的信息中Windy的取值為FALSE,根據決策樹中的邏輯返回Yes。因此在新信息中通過對天氣情況的判斷預測用戶會來打高爾夫球。
隨機森林
決策樹是建立在已知的歷史數據及概率上的,一課決策樹的預測可能會不太準確,提高準確率最好的方法是構建隨機森林(Random Forest)。所謂隨機森林就是通過隨機抽樣的方式從歷史數據表中生成多張抽樣的歷史表,對每個抽樣的歷史表生成一棵決策樹。由于每次生成抽樣表后數據都會放回到總表中,因此每一棵決策樹之間都是獨立的沒有關聯。將多顆決策樹組成一個隨機森林。當有一條新的數據產生時,讓森林里的每一顆決策樹分別進行判斷,以投票最多的結果作為最終的判斷結果。以此來提高正確的概率。
使用 Mahout 進行 Random Forests 實現
數據集示例:
1,1.52101,13.64,4.49,1.10,71.78,0.06,8.75,0.00,0.00,1
2,1.51761,13.89,3.60,1.36,72.73,0.48,7.83,0.00,0.00,1
3,1.51618,13.53,3.55,1.54,72.99,0.39,7.78,0.00,0.00,1
4,1.51766,13.21,3.69,1.29,72.61,0.57,8.22,0.00,0.00,1
5,1.51742,13.27,3.62,1.24,73.08,0.55,8.07,0.00,0.00,1
6,1.51596,12.79,3.61,1.62,72.97,0.64,8.07,0.00,0.26,1
7,1.51743,13.30,3.60,1.14,73.09,0.58,8.17,0.00,0.00,1
8,1.51756,13.15,3.61,1.05,73.24,0.57,8.24,0.00,0.00,1
9,1.51918,14.04,3.58,1.37,72.08,0.56,8.30,0.00,0.00,1
10,1.51755,13.00,3.60,1.36,72.99,0.57,8.40,0.00,0.11,1
...
//上傳數據集
$ hadoop fs -put glass.txt /user/ubuntu/glass.txt
//生成描述文件
ubuntu@master:~/algorithm$ mahout describe -p /user/ubuntu/glass.txt -f glass.info -d I 9 N L
MAHOUT_LOCAL is not set; adding HADOOP_CONF_DIR to classpath.
Running on hadoop, using /home/ubuntu/cloud/hadoop-2.7.2/bin/hadoop and HADOOP_CONF_DIR=/home/ubuntu/cloud/hadoop-2.7.2/etc/hadoop
MAHOUT-JOB: /home/ubuntu/cloud/mahout-0.10.1/mahout-examples-0.10.1-job.jar
17/01/14 02:53:49 WARN MahoutDriver: No describe.props found on classpath, will use command-line arguments only
17/01/14 02:53:49 INFO Describe: Generating the descriptor...
17/01/14 02:53:50 INFO Describe: generating the dataset...
17/01/14 02:53:51 INFO Describe: storing the dataset description
17/01/14 02:53:51 INFO MahoutDriver: Program took 1584 ms (Minutes: 0.0264)
// 生成隨機森林
$ mahout buildforest -d /user/ubuntu/glass.txt -ds glass.info -sl 3 -ms 3 -p -t 5 -o output
....
17/01/14 03:05:50 INFO HadoopUtil: Deleting hdfs://master:9000/user/ubuntu/output
17/01/14 03:05:50 INFO BuildForest: Build Time: 0h 0m 15s 86
17/01/14 03:05:50 INFO BuildForest: Forest num Nodes: 203
17/01/14 03:05:50 INFO BuildForest: Forest mean num Nodes: 40
17/01/14 03:05:50 INFO BuildForest: Forest mean max Depth: 9
17/01/14 03:05:50 INFO BuildForest: Storing the forest in: output/forest.seq
17/01/14 03:05:50 INFO MahoutDriver: Program took 16124 ms (Minutes: 0.2687333333333333)
// 對隨機森林進行評估
$ mahout testforest -i /user/ubuntu/glass.txt -ds glass.info -m output -mr -a -o test
...
17/01/14 03:09:48 INFO TestForest:
=======================================================
Summary
-------------------------------------------------------
Correctly Classified Instances : 191 89.2523%
Incorrectly Classified Instances : 23 10.7477%
Total Classified Instances : 214
=======================================================
Confusion Matrix
-------------------------------------------------------
a b c d e f <--Classified as
68 1 1 0 0 0 | 70 a = 1
6 68 1 0 0 1 | 76 b = 2
5 1 11 0 0 0 | 17 c = 3
0 0 0 10 0 3 | 13 d = 5
0 0 0 0 8 1 | 9 e = 6
1 1 1 0 0 26 | 29 f = 7
=======================================================
Statistics
-------------------------------------------------------
Kappa 0.7707
Accuracy 89.2523%
Reliability 72.3985%
Reliability (standard deviation) 0.3365
Weighted precision 0.897
Weighted recall 0.8925
Weighted F1 score 0.8914
17/01/14 03:09:48 INFO MahoutDriver: Program took 18829 ms (Minutes: 0.3138166666666667)
參考文章
張良均等.Hadoop大數據分析與挖掘實戰.機械工業出版社.2016.10
決策樹分類和預測算法的原理及實現
數據挖掘之決策樹
算法雜貨鋪——分類算法之決策樹
了解信息增益和決策樹