決策樹的實現


樣本選自周志華老師的西瓜書

樣本:

將上面的樣本制作成為一個CSV文件,保存的編碼為utf8,文中保存在/home/jsj/datetest/下名字wm20.csv

需要導入的文件:

import csv#導入csv
from sklearn.feature_extraction import DictVectorizer#轉換工具,將list轉換成為一個數組
from sklearn import preprocessing
from sklearn import tree #創建決策樹
import numpy as np

1)導入文件:

#csv的讀取
file = csv.reader((open("/home/jsj/datatest/wm20.csv","rt")))#注意保存utf8
print(file)#獲取文件信息
#file.decode("utf8","ignore")
headers = next(file)#獲取並打印頭信息
print(headers)

這段代碼的運行結果:

  <_csv.reader object at 0x7fa77d171198>
  ['編號', '色澤', '根蒂', '敲聲', '紋理', '臍部', '觸感', '好瓜'])

2)分離標簽和特征值

#將行信息轉變成為listDict
featurelist = []#創建一個特征列表
labellist = []#創建一個標簽列表
for row in file:
  labellist.append(row[len(row) -1])#每一次獲取最后一行值,添加到標簽列表中
  rowDict = {}#每一次都創建一個字典接受列值
  for i in range(1,len(row)-1):#從第二位置開始添加
    rowDict[headers[i]] = row[i]#添加字典的對應特征值
  featurelist.append(rowDict)#每次添加一行
print(labellist)#獲取到的標簽值
print(featurelist)#獲取到的每一行的特征值,每一個字典相當於一個元素

這段代碼的運行結果:

  ['是', '是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否']
  [{'色澤': '青綠', '根蒂': '蜷縮', '敲聲': '濁響', '紋理': '清晰', '臍部': '凹陷', '觸感': '硬滑'}, {'色澤': '烏黑', '根蒂': '蜷縮', '敲聲': '沉悶', '紋理': '清晰', '臍部': '凹陷', '觸感': '硬滑'}, {'色澤': '烏黑', '根蒂': '蜷縮', '敲聲': '濁響', '紋理': '清晰', '臍部': '凹陷', '觸感': '硬滑'}, {'色澤': '青綠', '根蒂': '蜷縮', '敲聲': '沉悶', '紋理': '清晰', '臍部': '凹陷', '觸感': '硬滑'}, {'色澤': '淺白', '根蒂': '蜷縮', '敲聲': '濁響', '紋理': '清晰', '臍部': '凹陷', '觸感': '硬滑'}, {'色澤': '青綠', '根蒂': '稍蜷', '敲聲': '濁響', '紋理': '清晰', '臍部': '稍凹', '觸感': '軟粘'}, {'色澤': '烏黑', '根蒂': '稍蜷', '敲聲': '濁響', '紋理': '稍糊', '臍部': '稍凹', '觸感': '軟粘'}, {'色澤': '烏黑', '根蒂': '稍蜷', '敲聲': '濁響', '紋理': '清晰', '臍部': '稍凹', '觸感': '硬滑'}, {'色澤': '烏黑', '根蒂': '稍蜷', '敲聲': '沉悶', '紋理': '稍糊', '臍部': '稍凹', '觸感': '硬滑'}, {'色澤': '青綠', '根蒂': '硬挺', '敲聲': '清脆', '紋理': '清晰', '臍部': '平坦', '觸感': '軟粘'}, {'色澤': '淺白', '根蒂': '硬挺', '敲聲': '清脆', '紋理': '模糊', '臍部': '平坦', '觸感': '硬滑'}, {'色澤': '淺白', '根蒂': '蜷縮', '敲聲': '濁響', '紋理': '模糊', '臍部': '平坦', '觸感': '軟粘'}, {'色澤': '青綠', '根蒂': '稍蜷', '敲聲': '濁響', '紋理': '稍糊', '臍部': '凹陷', '觸感': '硬滑'}, {'色澤': '淺白', '根蒂': '稍蜷', '敲聲': '沉悶', '紋理': '稍糊', '臍部': '凹陷', '觸感': '硬滑'}, {'色澤': '烏黑', '根蒂': '稍蜷', '敲聲': '濁響', '紋理': '清晰', '臍部': '稍凹', '觸感': '軟粘'}, {'色澤': '淺白', '根蒂': '蜷縮', '敲聲': '濁響', '紋理': '模糊', '臍部': '平坦', '觸感': '硬滑'}, {'色澤': '青綠', '根蒂': '蜷縮', '敲聲': '沉悶', '紋理': '稍糊', '臍部': '稍凹', '觸感': '硬滑'}]

3)將特征值轉換成為0、1數組

#將獲得特征值字典轉變成為數組
vec = DictVectorizer()#獲取轉換對象
dummyX = vec.fit_transform(featurelist).toarray()#將特征值的list轉變成為一個數組
print("dummyX:" + str(dummyX))
print(vec.get_feature_names())#獲取特征所有的取值

這段代碼的運行結果:

dummyX:[[0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 1. 1. 0.]
 [1. 0. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0.]
 [0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0.]
 [1. 0. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 1. 1. 0.]
 [0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 1. 0. 1. 0.]
 [0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 1.]
 [0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 1. 0. 0. 0. 1.]
 [0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 1. 0. 0. 1. 0.]
 [1. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 1. 0. 0. 1. 0.]
 [0. 0. 1. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 1.]
 [0. 0. 1. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 1. 0.]
 [0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1.]
 [0. 1. 0. 0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 0. 1. 1. 0.]
 [1. 0. 0. 0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 1. 0.]
 [0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 1.]
 [0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 0. 1. 0. 1. 0.]
 [1. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 1. 1. 0.]]
['敲聲=沉悶', '敲聲=濁響', '敲聲=清脆', '根蒂=硬挺', '根蒂=稍蜷', '根蒂=蜷縮', '紋理=模糊', '紋理=清晰', '紋理=稍糊', '臍部=凹陷', '臍部=平坦', '臍部=稍凹', '色澤=烏黑', '色澤=淺白', '色澤=青綠', '觸感=硬滑', '觸感=軟粘']
4)轉換標簽為0、1數組 

#將獲取的標簽list轉變
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labellist)
print("dummyY" + str(dummyY))
 

這段代碼結果為:

dummyY[[1]
 [1]
 [1]
 [1]
 [1]
 [1]
 [1]
 [1]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]]

5)使用id3建立決策樹

#創建分類器
clf = tree.DecisionTreeClassifier(criterion= "entropy")#使用Id3
clf = clf.fit(dummyX,dummyY)
print("clf:"+str(clf))

這段代碼結果為:

clf:DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,
            max_features=None, max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, presort=False, random_state=None,
            splitter='best')

6)創建出文件

with open("/home/jsj/datatest/wm20.dot","w") as f:
f = tree.export_graphviz(clf,feature_names = vec.get_feature_names(),out_file= f)#使用export_graphviz

這段代碼結果為:

   會產生一個wm20.dot的文件

  

文件打開之后形式如下:

  

上面是使用export_graphviz建立好的決策樹,可以使用graphviz產生圖片,詳情見https://blog.csdn.net/adaptiver/article/details/53701015

使用命令:dot -Tpng wm20.dot -o wm20.png產生下列圖:

7)預測

#預測新的數據如:'淺白', '蜷縮', '濁響', '清晰', '稍凹', '硬滑'
newRowX = oneRowX;
#修改數據不同的地方
#將青綠轉變成為淺白
newRowX[2] = 0
newRowX[0] = 1
#將凹陷轉變成為稍凹
newRowX[14] = 0
newRowX[13] = 1
"""由於在新版的sklearn中,
所有的數據都應該是二維矩陣,哪怕它只是單獨一行或一列(
比如前面做預測時,僅僅只用了一個樣本數據),
所以需要使用.reshape(1,-1)進行轉換,具體操作如下"""
newRowX = np.array(newRowX).reshape(1, -1)
print("newRowX :" + str(newRowX))
pY = clf.predict(newRowX)
print("pY :" + str(pY))

這段代碼結果為:

[0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 1. 1. 0.]
newRowX :[[1. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 1. 0. 1. 0.]]
pY :[1]

--可以看到這里是好瓜


免責聲明!

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



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