1. 程式人生 > >決策樹的入門級操作,傻瓜式註釋

決策樹的入門級操作,傻瓜式註釋

  決策樹(decision tree)

工具:pycharm +anancoda+視覺化graphvizs 

資料表:


程式碼如下:

from sklearn.feature_extraction import DictVectorizer   #將dict型別的list資料,轉換成numpy array
import csv  #讀取CSV檔案
from sklearn import tree  #匯入決策樹演算法
from sklearn import preprocessing  #資料預處理
# 讀入資料
allOriginalData=open(r'F:\好好學習\01DTree\AllElectronics.csv'
) reader=csv.reader (allOriginalData) #用reader來代表所有資料 header=next(reader) #header是指資料的第一行,就是資料的特徵 print (header) #因為SK包的資料輸入是有一定的要求的,他的輸入不能是類別。只能是 0,1。所以要先將資料轉化成DICT型別 #然後用DictVextorizer的函式進行轉換 featurelist=[]#定義一個存放特徵的列表 labellist=[]#定義一個存放標籤的列表 for row in reader:#以行遍歷所有資料 labellist.append(row[-1])#取出最後一個值,這個值是每條資料的標籤
rowDict={}#定義一個字典型別 for i in range(1,len(row)-1): rowDict[header[i]]=row[i]#把每條資料的 特徵:屬性 插入字典 featurelist.append(rowDict)#把字典插入列表 #print(labellist) #print(featurelist) vec=DictVectorizer()#例項化 dummx=vec.fit_transform(featurelist).toarray()#使用例項內的方法對資料進行轉換 print(vec.get_feature_names())#打印出轉換後的資料的表頭
print("dummx"+str(dummx))#打印出轉換後的資料的表值 la=preprocessing.LabelBinarizer()#例項化 dummy=la.fit_transform(labellist)#資料的轉換 print("label"+str(labellist)) print("dummy"+str(dummy)) #上面的過程就是把資料都轉換成符合格式的資料了 #可以呼叫sk包中的決策樹演算法進行分類 clf=tree.DecisionTreeClassifier(criterion='entropy')#使用資訊增益的方法 clf=clf.fit(dummx,dummy)#構建決策樹 print("clf: " + str(clf))#列印 #輸出到TD3.DOT檔案中 with open("IDTree.dot", 'w') as f: f = tree.export_graphviz(clf, out_file=f)#要安裝視覺化工具graphviz #預測資料 oneRow=dummx[0,:]#取出一條資料進行修改 newRow=oneRow oneRow[0]=0 oneRow[2]=1 #進行預測 print("newRow"+str(newRow)) predictY=clf.predict(newRow) print("predictY"+str(predictY))
執行結果:




 轉化dot檔案至pdf視覺化決策樹(cmd):dot -Tpdf 路徑檔案.dot

 -o =路徑文字.pdf

接下來做一個決策樹經典例題

小王是一家著名高爾夫俱樂部的經理。但是他被僱員數量問題搞得心情十分不好。某些天好像所有人都來玩高爾夫,以至於所有員工都忙的團團轉還是應付不過來,而有些天不知道什麼原因卻一個人也不來,俱樂部為僱員數量浪費了不少資金。

小王的目的是通過下週天氣預報尋找什麼時候人們會打高爾夫,以適時調整僱員數量。因此首先他必須瞭解人們決定是否打球的原因。

在2周時間內我們得到以下記錄:

天氣狀況有晴,雲和雨;氣溫用華氏溫度表示;相對溼度用百分比;還有有無風。當然還有顧客是不是在這些日子光顧俱樂部。最終他得到了14列5行的資料表格



程式碼如下:

from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import tree
from sklearn import preprocessing
alldata=open(r'F:\Python\example1.csv','r',encoding='utf-8')
reader=csv.reader(alldata)
headers=next(reader)
print(headers)
label=[]
feature=[]
for row in reader:
    label.append(row[-1])
    rowDict={}
    for i in range(1,len(row)-1 ):
        if row[i].isdigit() and i>1:#對那些連續的屬性值做一個簡單的離散化
row[i]= int(int(row[i])/10)
        rowDict[headers[i]]=row[i]

    feature.append(rowDict)
print(feature)
vec=DictVectorizer()
dummX=vec.fit_transform(feature).toarray()
print(str(dummX))
lb=preprocessing.LabelBinarizer()
dummY=lb.fit_transform(label)
print(str(dummY))
clf=tree.DecisionTreeClassifier(criterion='gini')
clf=clf.fit(dummX,dummY)
with open("F:\\Python\\example.dot", 'w') as f:
    f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)
結果圖:
關於決策樹的理論知識,請大家閱讀《機器學習》。剪枝,連續與缺失值,GINI係數。更多知識