機器學習算法及代碼實現–決策樹


機器學習算法及代碼實現–決策樹

1、決策樹

決策樹算法的核心在於決策樹的構建,每次選擇讓整體數據香農熵(描述數據的混亂程度)減小最多的特征,使用其特征值對數據進行划分,每次消耗一個特征,不斷迭代分類,直到所有特征消耗完(選擇剩下數據中出現次數最多的類別作為這堆數據的類別),或剩下的數據全為同一類別,不必繼續划分,至此決策樹構建完成,之后我們依照這顆決策樹對新進數據進行分類。

這里寫圖片描述

2、信息熵

一條信息的信息量大小和它的不確定性有直接的關系,要搞清楚一件非常非常不確定的事情,或者是我們一無所知的事情,需要了解大量信息==>信息量的度量就等於不確定性的多少
例子:猜世界杯冠軍,假如一無所知,猜多少次?實際中每個隊奪冠的幾率不是相等的,如果我們對其有足夠了解,是否猜中的概率會增大?
信息熵用比特(bit)來衡量信息的多少,變量的不確定性越大,熵也就越大。
公式:
這里寫圖片描述

3、決策樹算法(ID3)

我們以一個例子來講述決策樹的算法(判斷該用戶是否買電腦)
這里寫圖片描述
每次選擇信息獲取量最大的特征對其進行划分
Gain(A) = Info(D) - Infor_A(D) (原來的信息熵減去用A之后的信息熵=》獲取的信息量)

計算過程:
這里寫圖片描述

類似,Gain(income) = 0.029, Gain(student) = 0.151, Gain(credit_rating)=0.048
所以,選擇age作為第一個根節點
分類結果:
這里寫圖片描述

算法注意點:
1)根節點開始,樣本在同一個類則為樹葉,標記類號
2)選擇信息獲取量最大的進行划分
3)屬性為離散值連續則必須離散化
4)根據屬性划分分支,分支的子節點不用再考慮該屬性
停止條件
1)所有節點屬於同一類
2)沒有可划分的屬性了: 以當中的大多數來確定類
3)屬性下沒節點:以父節點中的多少類作為類

4、其它決策樹算法

C4.5、CART

5、對於過擬合的處理方法

先剪枝:一定深度不再分
后剪枝:先生成,后按規則減

6、優缺點

優點:直觀、易理解、小規模數據有效
缺點:處理連續變量不好,值域不好划分
類別多時,錯誤增加快
可規模性一般,大量數據時復雜性大

算法實現

#-*- coding: utf-8 -*-
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO

data = open('jueceshu.csv', 'rb')
reader = csv.reader(data)
headers = reader.next()
print headers

featureList = []  # 特征集
labelList = []  # 標簽集
for row in reader:
    # 最后一列是標簽,構造標簽集
    labelList.append(row[len(row)-1])
    # 構造特征集
    rowDict = {}
    for i in range(1, len(row)-1):
        # header里面是屬性名,用來作鍵值
        rowDict[headers[i]] = row[i]
    featureList.append(rowDict)

print featureList

vec = DictVectorizer()
# 將特征轉化為向量
dummyX = vec.fit_transform(featureList).toarray()

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)

# 利用tree中的分類器來創建決策樹
clf = tree.DecisionTreeClassifier(criterion='entropy')  # 用ID3的算法  信息熵
clf = clf.fit(dummyX, dummyY)
print 'clf:' + str(clf)

# 畫決策樹
with open('jueceshu.dot', 'w') as f:
    # 把feature_name返回
    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)

 



 


免責聲明!

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



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