樣本選自周志華老師的西瓜書
樣本:
將上面的樣本制作成為一個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)分離標簽和特征值
#將行信息轉變成為list和Dict
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]
--可以看到這里是好瓜