閱讀目錄
決策樹在商品購買能力預測案例中的算法實現
作者:白寧超
2016年12月24日22:05:42
摘要:隨着機器學習和深度學習的熱潮,各種圖書層出不窮。然而多數是基礎理論知識介紹,缺乏實現的深入理解。本系列文章是作者結合視頻學習和書籍基礎的筆記所得。本系列文章將采用理論結合實踐方式編寫。首先介紹機器學習和深度學習的范疇,然后介紹關於訓練集、測試集等介紹。接着分別介紹機器學習常用算法,分別是監督學習之分類(決策樹、臨近取樣、支持向量機、神經網絡算法)監督學習之回歸(線性回歸、非線性回歸)非監督學習(K-means聚類、Hierarchical聚類)。本文采用各個算法理論知識介紹,然后結合python具體實現源碼和案例分析的方式( 本文原創編著,轉載注明出處:決策樹在商品購買力能力預測案例中的算法實現(3))
目錄
- 【Machine Learning】Python開發工具:Anaconda+Sublime(1)
- 【Machine Learning】機器學習及其基礎概念簡介(2)
- 【Machine Learning】決策樹在商品購買力能力預測案例中的算法實現(3)
- 【Machine Learning】KNN算法虹膜圖片識別實戰(4)
1 決策樹/判定樹(decision tree)
1 決策樹(Dicision Tree)是機器學習有監督算法中分類算法的一種,有關機器學習中分類和預測算法的評估主要體現在:
- 准確率:預測的准確與否是本算法的核心問題,其在征信系統,商品購買預測等都有應用。
- 速度:一個好的算法不僅要求具備准確性,其運行速度也是衡量重要標准之一。
- 強壯行:具備容錯等功能和擴展性等。
- 可規模性:能夠應對現實生活中的實際案例
- 可解釋性:運行結果能夠說明其含義。
2 構造決策樹的基本算法:判定顧客對商品購買能力
2.1 算法結果圖:

根據決策樹分析如下客戶數據,判定新客戶購買力。其中
客戶年齡age:青年、中年、老年
客戶收入income:低、中、高
客戶身份student:是學生,不是學生
客戶信用credit_rating:信用一般,信用好
是否購買電腦buy_computer:購買、不購買


詳解:
信息獲取量/信息增益(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
- 樹以代表訓練樣本的單個結點開始(步驟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)
3 基於python代碼的決策樹算法實現:預測顧客購買商品的能力
3.1 機器學習的庫:scikit-learnPython
scikit-learnPython,其特性簡單高效的數據挖掘和機器學習分析,簡單高效的數據挖掘和機器學習分析,對所有用戶開放,根據不同需求高度可重用性,基於Numpy, SciPy和matplotlib,開源,商用級別:獲得 BSD許可。scikit-learn覆蓋分類(classification), 回歸(regression), 聚類(clustering), 降維(dimensionality reduction),模型選擇(model selection), 預處理(preprocessing)等領域。
- 安裝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系統
商品購買例子:

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
i
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 完整項目下載
完整項目共享
擴展:銀行信用自動評估系統