【Machine Learning】決策樹案例:基於python的商品購買能力預測系統


閱讀目錄

 

決策樹在商品購買能力預測案例中的算法實現

作者:白寧超

2016年12月24日22:05:42

摘要:隨着機器學習和深度學習的熱潮,各種圖書層出不窮。然而多數是基礎理論知識介紹,缺乏實現的深入理解。本系列文章是作者結合視頻學習和書籍基礎的筆記所得。本系列文章將采用理論結合實踐方式編寫。首先介紹機器學習和深度學習的范疇,然后介紹關於訓練集、測試集等介紹。接着分別介紹機器學習常用算法,分別是監督學習之分類(決策樹、臨近取樣、支持向量機、神經網絡算法)監督學習之回歸(線性回歸、非線性回歸)非監督學習(K-means聚類、Hierarchical聚類)。本文采用各個算法理論知識介紹,然后結合python具體實現源碼和案例分析的方式( 本文原創編著,轉載注明出處:決策樹在商品購買力能力預測案例中的算法實現(3))
 

目錄


  1. 【Machine Learning】Python開發工具:Anaconda+Sublime(1)
  2. 【Machine Learning】機器學習及其基礎概念簡介(2)
  3. 【Machine Learning】決策樹在商品購買力能力預測案例中的算法實現(3)
  4. 【Machine Learning】KNN算法虹膜圖片識別實戰(4)
 

1 決策樹/判定樹(decision tree)


決策樹(Dicision Tree)是機器學習有監督算法中分類算法的一種,有關機器學習中分類和預測算法的評估主要體現在:

  1. 准確率:預測的准確與否是本算法的核心問題,其在征信系統,商品購買預測等都有應用。
  2. 速度:一個好的算法不僅要求具備准確性,其運行速度也是衡量重要標准之一。
  3. 強壯行:具備容錯等功能和擴展性等。
  4. 可規模性:能夠應對現實生活中的實際案例
  5. 可解釋性:運行結果能夠說明其含義。
判定樹是一個類似於流程圖的樹結構:其中,每個內部結點表示在一個屬性上的測試,每個分支代表一個屬性輸出,而每個樹葉結點代表類或類分布。樹的最頂層是根結點。

 

如上案例判斷是否去打球?根節點顯示14天中9天適合打球,其中5天不適合打球。這里面沒有全部一致的情況,說明還需要細分:
1 晴天:晴天中有2天適合打球,3天不適合打球,還需細分①濕度小於等於70時候有2天都適合打球,停止划分;②濕度大於70有3天都不適合打球,停止划分。
2 陰天:共4天都適合打球,停止划分。
3 雨天:3天適合打球,2天不適合打球,繼續划分。①沒有風的有3天且都適合打球,停止划分;②有風的2天且都不適合打球,停止划分。
注意:有的時候不易太細的划分,特征過多過細的話反而會影響預測的准確率。把大多數歸為一類,極少數的可以歸到大多數之中。
案例:如上決策樹,如果某天是:晴天,濕度90 判定是否適合打球,可以由圖知是不適合打球的。
3 官方文檔: http://scikit-learn.org/stable/modules/tree.html
 

2 構造決策樹的基本算法:判定顧客對商品購買能力


2.1 算法結果圖:

根據決策樹分析如下客戶數據,判定新客戶購買力。其中

客戶年齡age:青年、中年、老年

客戶收入income:低、中、高

客戶身份student:是學生,不是學生

客戶信用credit_rating:信用一般,信用好

是否購買電腦buy_computer:購買、不購買

2.2 在介紹決策樹算法之前,我們引入熵的概念。熵的(entropy)概念:信息和抽象,如何度量?
1948年,香農提出了 ”信息熵(entropy)“的概念,一條信息的信息量大小和它的不確定性有直接的關系,要搞清楚一件非常非常不確定的事情,或者是我們一無所知的事情,需要了解大量信息==>信息量的度量就等於不確定性的多少。
例子:猜世界杯冠軍,假如一無所知,猜多少次?每個隊奪冠的幾率不是相等的,比特(bit)來衡量信息的多少。
采用如下方式求信息熵:
1 當每個球隊奪冠概率相等時候,32支參加世界杯奪冠球隊的信息熵是5,計算是2^5=32,也就是你5次可以猜對那支球隊奪冠。
2 當球隊奪冠概率不相等,比如巴西、德國、荷蘭是強隊概率較大,信息熵就小於5,也就是你用不到5次就可以猜出哪個球隊奪冠。
注:變量的不確定性越大,熵也就越大
2.3 決策樹歸納算法 (ID3)
1970-1980, J.Ross. Quinlan首先提出ID3算法,第一步是選擇屬性判斷結點,我們采用信息熵的比較。第二步是信息獲取量(Information Gain):Gain(A) = Info(D) - Infor_A(D)通過A來作為節點分類獲取了多少信息
詳解
信息獲取量/信息增益(Information Gain):Gain(A) = Info(D) - Infor_A(D),例如age的信息增益,Gain(age) = Info(buys_computer) - Infor_age(buys_computer)。
Info(buys_computer)是這14個記錄中,購買的概率9/14,不購買的5/14,帶入到信息熵公式。
Infor_age(buys_computer)是age屬性中,青年5/14購買概率是2/5,不購買3/5;中年4/14購買概率是1,不購買概率是0,老年5/14購買概率3/5,不購買概率是2/5.分別代入信息熵公式
Info(buys_computer)與Infor_age(buys_computer)做差,即是age的信息增益,具體如下:

類似,Gain(income) = 0.029, Gain(student) = 0.151, Gain(credit_rating)=0.048

所以,選擇信息增益最大的作為根節點即age作為第一個根節點

 

重復計算即可
2.4 決策樹算法
決策樹算法的形式化描述如下:
  • 樹以代表訓練樣本的單個結點開始(步驟1)。
  • 如果樣本都在同一個類,則該結點成為樹葉,並用該類標號(步驟2 和3)。
  • 否則,算法使用稱為信息增益的基於熵的度量作為啟發信息,選擇能夠最好地將樣本分類的屬性(步驟6)。該屬性成為該結點的“測試”或“判定”屬性(步驟7)。在算法的該版本中,
  • 所有的屬性都是分類的,即離散值。連續屬性必須離散化。
  • 對測試屬性的每個已知的值,創建一個分枝,並據此划分樣本(步驟8-10)。
  • 算法使用同樣的過程,遞歸地形成每個划分上的樣本判定樹。一旦一個屬性出現在一個結點上,就不必該結點的任何后代上考慮它(步驟13)。
  • 遞歸划分步驟僅當下列條件之一成立停止:
  • (a) 給定結點的所有樣本屬於同一類(步驟2 和3)。
  • (b) 沒有剩余屬性可以用來進一步划分樣本(步驟4)。在此情況下,使用多數表決(步驟5)。
  • 這涉及將給定的結點轉換成樹葉,並用樣本中的多數所在的類標記它。替換地,可以存放結
  • 點樣本的類分布。
  • (c) 分枝
  • test_attribute = a i 沒有樣本(步驟11)。在這種情況下,以 samples 中的多數類
  • 創建一個樹葉(步驟12)

在決策樹ID3基礎上,又進行了算法改進,衍生出 其他算法如:C4.5: (Quinlan) 和Classification and Regression Trees (CART): (L. Breiman, J. Friedman, R. Olshen, C. Stone)。這些算法

共同點:都是貪心算法,自上而下(Top-down approach)

 

區別:屬性選擇度量方法不同: C4.5 (gain ratio,增益比), CART(gini index,基尼指數), ID3 (Information Gain,信息增益)
 
 
 
2.5 如何處理連續性變量的屬性? 
 
 
 
有些數據是連續性的,其不像如上實驗數據可以離散化表示。諸如根據天氣情況預測打球案例中,其濕度是一個連續值,我們的做法是將濕度70作為一個分界點,這里就是連續變量離散化的體現。
 
2.6 補充知識
樹剪枝葉 (避免overfitting):為了避免擬合問題,我們可以對歸於繁瑣的樹進行剪枝(就是降低樹的高度),可以分為先剪枝和后剪枝。
決策樹的優點:直觀,便於理解, 小規模數據集有效     
決策樹的缺點:處理連續變量不好、類別較多時,錯誤增加的比較快、可規模性一般
 
 

3 基於python代碼的決策樹算法實現:預測顧客購買商品的能力


3.1 機器學習的庫:scikit-learnPython

scikit-learnPython,其特性簡單高效的數據挖掘和機器學習分析,簡單高效的數據挖掘和機器學習分析,對所有用戶開放,根據不同需求高度可重用性,基於Numpy, SciPy和matplotlib,開源,商用級別:獲得 BSD許可。scikit-learn覆蓋分類(classification), 回歸(regression), 聚類(clustering), 降維(dimensionality reduction),模型選擇(model selection), 預處理(preprocessing)等領域。

3.2 scikit-learn的使用:Anaconda集成了如下包,不需要安裝即可使用
  • 安裝scikit-learn: pip, easy_install, windows installer,安裝必要package:numpy, SciPy和matplotlib, 可使用Anaconda (包含numpy, scipy等科學計算常用package)
  • 安裝注意問題:Python解釋器版本(2.7 or 3.4?), 32-bit or 64-bit系統

商品購買例子:

轉化為csv文件如下:

3.3 運行效果如下:

其中,datafile存放模型訓練數據集和測試數據集,TarFile是算法生成文本形式的dot文件和轉化后的pdf圖像文件,兩個py文件,一個是訓練算法一個是測試訓練結果。右側預測值【0 1 1】代表三條測試數據,其中后兩條具備購買能力。具體算法和細節下節詳解。

3.4 具體算法和細節

python中導入決策樹相關包文件,然后通過對csv格式轉化為sklearn工具包中可以識別的數據格式,再調用決策樹算法,最后將模型訓練的結果以圖形形式展示。

包的導入:
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import tree
from sklearn import preprocessing
from sklearn.externals.six import StringIO
1
讀取csv文件,將其特征值存儲在列表featureList中,將預測的目標值存儲在labelList中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
'' '
Description:python調用機器學習庫scikit-learn的決策樹算法,實現商品購買力的預測,並轉化為pdf圖像顯示
Author:Bai Ningchao
DateTime:2016年12月24日14:08:11
Blog URL:http: //www.cnblogs.com/baiboy/
'' '
def trainDicisionTree(csvfileurl):
     '讀取csv文件,將其特征值存儲在列表featureList中,將預測的目標值存儲在labelList中'
 
     featureList = []
     labelList = []
 
     #讀取商品信息
     allElectronicsData=open(csvfileurl)
     reader = csv.reader(allElectronicsData)                  #逐行讀取信息
     headers=str(allElectronicsData.readline()).split( ',' )    #讀取信息頭文件
     print(headers)

  運行結果:

存儲特征數列和目標數列

1
2
3
4
5
6
7
8
9
10
'存儲特征數列和目標數列'
for  row  in  reader:
     labelList.append(row[len(row)-1])  #讀取最后一列的目標數據
     rowDict = {}                       #存放特征值的字典
     for  in  range(1, len(row)-1):
         rowDict[headers[i]] = row[i]
         # print("rowDict:",rowDict)
     featureList.append(rowDict)
print(featureList)
print(labelList)

  運行結果:

1
將特征值數值化
1
2
3
4
5
6
7
8
9
10
11
12
13
'Vetorize features:將特征值數值化'
     vec = DictVectorizer()    #整形數字轉化
     dummyX = vec.fit_transform(featureList) .toarray()   #特征值轉化是整形數據
 
     print( "dummyX: "  + str(dummyX))
     print(vec.get_feature_names())
 
     print( "labelList: "  + str(labelList))
 
     # vectorize class labels
     lb = preprocessing.LabelBinarizer()
     dummyY = lb.fit_transform(labelList)
     print( "dummyY: \n"  + str(dummyY))

  運行結果:

1
如上算法就是將商品信息轉化為機器學習決策樹庫文件可以識別的形式,即如下形式:
1
使用決策樹進行分類預測處理
1
2
3
4
5
6
7
8
9
10
'使用決策樹進行分類預測處理'
# clf = tree.DecisionTreeClassifier()
#自定義采用信息熵的方式確定根節點
clf = tree.DecisionTreeClassifier(criterion= 'entropy' )
clf = clf.fit(dummyX, dummyY)
print( "clf: "  + str(clf))
 
# Visualize model
with open( "../Tarfile/allElectronicInformationGainOri.dot" 'w' as  f:
     f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)

  運行結果:

將其轉化為圖像形式展示,需要下載插件:安裝 下載Graphviz:

 

一路安裝下來,然后打開cmd進入dos環境下,並進入../Tarfile/Tname.dot路徑下;#2 輸入dot -Tname.dot -o name.pdf命令,將dos轉化為pdf格式

 

打開文件可見:

 

4 完整項目下載


完整項目共享

擴展:銀行信用自動評估系統

 

 

 

 

http://www.cnblogs.com/baiboy
 
分類: Machine learning


免責聲明!

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



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