機器學習-決策樹(decision tree)
- 機器學習中分類和預測演算法的評估:
- 準確率
- 速度
- 強壯性(演算法中當有噪音和某些值缺失時,演算法能否依然很好)
- 可規模性
- 可解釋性(能否很好的解釋模型)
一、什麼是決策樹?
1、判定樹(決策樹)是一個類似於流程圖的樹結構,其中,每個內部節點表示在一個屬性上的測試,每一個分支代表一個屬性輸出,而每個樹葉結點代表類或類分佈。樹的最頂層是根結點。 2.決策樹是機器學習中分類方法中的一個重要演算法 3.熵(entropy)概念: 資訊和抽象如何度量? 1948年,夏農提出了“資訊熵(entropy)”的概念。 一條資訊的資訊量大小和它的不確定性有直接的關係,要搞清楚一件非常非常不確定的事情,或者是我們一無所知的事情,需要了解大量資訊==》資訊量的度量等於不確定性的多少。 位元(bit)來衡量資訊的多少。 資訊熵計算公式:
二、決策樹歸納演算法(ID3)
選擇屬性判斷結點 資訊獲取量/資訊增益(Information Gain): Gain(A) = Info(D) - Infor_A(D) 通過A來作為結點分類獲取了多少資訊,下圖是根據年齡、收入、是否為學生、信用度來判斷一個人是否要購買電腦 類似,Gain(income) = 0.029 Gain(student) = 0.151 Gain(credit_rating) = 0.048 所以,由於age屬性的資訊增益最大,選擇age作為第一個根結點。 重複此過程。。。 下面是直接呼叫sklearn包的程式碼:
from sklearn.feature_extraction import DictVectorizer#sklearn對資料輸入格式有要求,不能是型別的資料,必是整形的資料,所以需要轉換 import csv#原始資料存在於csv檔案裡 from sklearn import preprocessing from sklearn import tree from sklearn.externals.six import StringIO #讀取csv檔案 allElectronicsData = open(r'D:\data\decisiontree.csv','rt') reader = csv.reader(allElectronicsData) #headers = reader.next()#headers指的是特徵 headers = next(reader)#headers是csv檔案的第一行資料 print(headers) featureList = []#featureList是特徵值,例如年齡、信用度等 labelList = []#labellist是標籤值,也就是結果是否買電腦 for row in reader: labelList.append(row[len(row) - 1]) rowDict = {} for i in range(1,len(row) - 1): rowDict[headers[i]] = row[i] featureList.append(rowDict) print(featureList) #利用python進行轉化 vec = DictVectorizer() dummyX = vec.fit_transform(featureList).toarray()#特徵值的列表,是0,1的列表 print("dummyX:"+str(dummyX)) print(vec.get_feature_names()) print("labellist:"+str(labelList)) lb = preprocessing.LabelBinarizer() dummyY = lb.fit_transform(labelList) print("dummyY:"+str(dummyY)) clf = tree.DecisionTreeClassifier(criterion = 'entropy')#不帶引數預設是基尼係數 #criterion = ‘entrropy’使用ID3方法 clf = clf.fit(dummyX,dummyY) print("clf:"+str(clf)) #生成一個dot樹,可用dot命令生成pdf檔案 with open("allElectronicInformationGainOri.dot",'w') as f: f = tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file = f) #oneRowX是拷貝出一條資料,修改一些特徵值,來進行測試 oneRowX = dummyX[0,:].reshape(1,-1) print("oneRowX:"+str(oneRowX)) newRowX = oneRowX newRowX[0][0] = 1 newRowX[0][2] = 0 print("newRowX:"+str(newRowX)) predictedY = clf.predict(newRowX) print("predictedY:"+str(predictedY))
下面是decisiontree.csv的內容: 執行結果為: 執行cmd,生成的allElectronicInformationGainOri.dot檔案可以用dot生成pdf檔案(實現需要安裝Graphviz:(http://www.graphviz.org),然後需要配置環境變數,在path中新增) 命令:dot -Tpdf allElectronicInformationGainOri.dot -o test.pdf 結果為: