scikit-learn學習之決策樹演算法

Thinkgamer_gyt發表於2016-04-23
======================================================================
本系列部落格主要參考 Scikit-Learn 官方網站上的每一個演算法進行,並進行部分翻譯,如有錯誤,請大家指正   
======================================================================

決策樹的演算法分析與Python程式碼實現請參考之前的一篇部落格:點選閱讀    接下來我主要演示怎麼使用Scikit-Learn完成決策樹演算法的呼叫


iris資料集說明:

點選檢視



決策樹演算法的優點:
1:理解和解釋起來簡單,且決策樹模型可以想象
2:需要準備的資料量不大,而其他的技術往往需要很大的資料集,需要建立虛擬變數,去除不完整的資料,但是該演算法對於丟失的資料不能進行準確的預測
3:決策樹演算法的時間複雜度(即預測資料)是用於訓練決策樹的資料點的對數
4:能夠處理數字和資料的類別(需要做相應的轉變),而其他演算法分析的資料集往往是隻有一種型別的變數
5:能夠處理多輸出的問題
6:使用白盒模型,如果給定的情況是在一個模型中觀察到的,該條件的解釋很容易解釋的布林邏輯,相比之下,在一個黑盒子模型(例如人工神經網路),結果可能更難以解釋
7:可能使用統計檢驗來驗證模型,這是為了驗證模型的可靠性
8:從資料結果來看,它執行的效果很好,雖然它的假設有點違反真實模型



決策樹演算法的缺點:

1:決策樹演算法學習者可以建立複雜的樹,但是沒有推廣依據,這就是所謂的過擬合,為了避免這種問題,出現了剪枝的概念,即設定一個葉子結點所需要的最小數目或者設定樹的最大深度
2:決策樹的結果可能是不穩定的,因為在資料中一個很小的變化可能導致生成一個完全不同的樹,這個問題可以通過使用整合決策樹來解決
3:眾所周知,學習一惡搞最優決策樹的問題是NP——得到幾方面完全的優越性,甚至是一些簡單的概念。因此,實際決策樹學習演算法是基於啟發式演算法,如貪婪演算法,尋求在每個節點上的區域性最優決策。這樣的演算法不能保證返回全域性最優決策樹。這可以減輕訓練多棵樹的合奏學習者,在那裡的功能和樣本隨機抽樣更換。
4:這裡有一些概念是很難的理解的,因為決策樹本身並不難很輕易的表達它們,比如說異或校驗或複用的問題。
5:決策樹學習者很可能在某些類占主導地位時建立有有偏異的樹,因此建議用平衡的資料訓練決策樹



Classification  簡單示例

>>> from sklearn import tree
>>> X = [[0, 0], [1, 1]]
>>> Y = [0, 1]
>>> clf = tree.DecisionTreeClassifier()
>>> clf = clf.fit(X, Y)
>>> clf.predict([[2., 2.]])
array([1])

Regression 簡單示例

>>> from sklearn import tree
>>> X = [[0, 0], [2, 2]]
>>> y = [0.5, 2.5]
>>> clf = tree.DecisionTreeRegressor()
>>> clf = clf.fit(X, y)
>>> clf.predict([[1, 1]])
array([ 0.5])

決策樹演算法使用 示例

資料集如下圖:


程式如下:
<span style="font-size:18px;">#-*- coding: UTF-8 -*- 
'''
Created on 2016/4/23

@author: Administrator
'''
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO

#Read in the csv File and put feature in a list of class label
allElectronicsData = open(r"example.csv","rb")
reader = csv.reader(allElectronicsData)
headers = reader.next()
#print headers

featureList = []  
labelList = []
#存放在兩個元祖中
for row in reader:
    labelList.append(row[len(row)-1])
    rowDic = {}
    for i in range(1,len(row)-1):
        rowDic[headers[i]] = row[i]
    featureList.append(rowDic)
    
# print featureList
# print labelList

# Vector Feature
vec = DictVectorizer()
dummyX = vec.fit_transform(featureList) .toarray()
# print "dummyX:",dummyX
# print vec.get_feature_names()
# print "labelList:"+str(labelList)

lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
#print "dummyY:" + str(dummyY)

#using desicionTree for classfication
clf = tree.DecisionTreeClassifier(criterion="entropy") #建立一個分類器,entropy決定了用ID3演算法
clf = clf.fit(dummyX, dummyY)
print "clf:"+str(clf)

#Visulize model
with open("allEallElectronicInfomationGainori.txt","w") as f:
    f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file = f)

#預測    
oneRowX = dummyX[0,:]
#print "oneRowX:" +str(oneRowX)

newRowX = oneRowX
newRowX[0] = 1
newRowX[2] = 0
print "newRowX:" +str(newRowX)

predictedY = clf.predict(newRowX)
print "predictedY:" + str(predictedY)</span>

使用命令匯出圖形為pdf:dot -T pdf ex.txt -o output.pdf.txt  (windows cmd的命令)


相關文章