
基本概念
決策樹是分類算法。
數(shù)據(jù)類型:數(shù)值型和標稱型。因為構造算法只適用于標稱型,所以數(shù)值型數(shù)據(jù)必須離散化。
工作原理
利用香濃熵找到信息增益最大的特征,按照信息增益最大的特征劃分數(shù)據(jù),如此反復,讓無序的數(shù)據(jù)變的更加有序。使用ID3算法構建樹結構。當傳入一個新數(shù)據(jù)時,按照數(shù)據(jù)找到對應樹節(jié)點,直到最后沒有葉子節(jié)點時,完成分類。
樣例
不浮出水面是否可以生存? 是否有腳蹼? 是否是魚類?
通過“不浮出水面是否可以生存”和“是否有腳蹼”這兩個特征來判斷是否是魚類。構建一個簡單決策樹,如果得到一個新的生物,可以用此來判斷是否是魚類。
樣例代碼
def createDataSet():
dataSet = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
labels = ['no surfacing','flippers'] return dataSet, labels
香農(nóng)熵公式
如果待分類的事務可能劃分在多個分類之中,則符號Xi的信息定義為:
其中P(Xi)是選擇該分類的概率
為了計算熵,需要計算所有類別所有可能值包含的信息期望值總和,公式為:
其中n是分類的數(shù)目
香農(nóng)熵算法
def calcShannonEnt(dataSet):
# 選擇該分類的概率 就是每個類型/總個數(shù)
# 總數(shù),多少行數(shù)據(jù)
numEntries = len(dataSet)
labelCounts = {} # 取到的每個類型個數(shù)
for featVec in dataSet:
currentLabel = featVec[-1] if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
for key in labelCounts: # 得到選擇該分類的概率
prob = float(labelCounts[key])/numEntries # 按照公式
shannonEnt -= prob * log(prob,2) #log base 2
return shannonEnt
按照香農(nóng)熵劃分數(shù)據(jù)
除了需要測量信息熵,還需要劃分數(shù)據(jù)集,度量花費數(shù)據(jù)集的熵,以便判斷當前是否正確劃分。 循環(huán)計算香濃熵和splitDataSet(),找到最好的特征劃分方式。
def splitDataSet(dataSet, axis, value):
# 這個算法返回axis下標之外的列
retDataSet = [] for featVec in dataSet: if featVec[axis] == value:
reducedFeatVec = featVec[:axis] #chop out axis used for splitting
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec) return retDataSetdef chooseBestFeatureToSplit(dataSet):
# 先取最后一列,用在標簽結果:是魚或不是魚。
numFeatures = len(dataSet[0]) - 1
# 原始香濃熵
baseEntropy = calcShannonEnt(dataSet)
bestInfoGain = 0.0; bestFeature = -1
# 遍歷所有的特征
for i in range(numFeatures): # 創(chuàng)建一個列表包含這個特征的所有值
featList = [example[i] for example in dataSet] # 利用set去重
uniqueVals = set(featList)
newEntropy = 0.0
# 計算該特征所包含類型的香濃熵之和
for value in uniqueVals:
subDataSet = splitDataSet(dataSet, i, value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob * calcShannonEnt(subDataSet) # 得到信息增益
infoGain = baseEntropy - newEntropy # 取最大的信息增益,并記錄下標
if (infoGain > bestInfoGain):
bestInfoGain = infoGain
bestFeature = i # 返回下標
return bestFeature
數(shù)據(jù)集需要滿足一定的要求:
數(shù)據(jù)必須是一種有列表元素組成的列表。(二維數(shù)組)
所有列表元素必須有相同長度。
最后一列必須是當前實例的標簽。
遞歸構建決策樹
多數(shù)表決算法
如果數(shù)據(jù)集已經(jīng)處理了所有屬性,但是類標簽依然不是唯一的,此時需要決定如何定義該葉子節(jié)點,在這種情況下,我們通常會采用多數(shù)表決決定該葉子節(jié)點。
import operator def majorityCnt(classList):
# 排序取出種類最多的
classCount={} for vote in classList: if vote not in classCount.keys(): classCount[vote] = 0
classCount[vote] += 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]
構建樹算法
def createTree(dataSet,labels):
# 取出結果
classList = [example[-1] for example in dataSet] # 如果結果里的第一個元素所代表的數(shù)據(jù)個數(shù)等于結果本身,說明沒有其他分類了
if classList.count(classList[0]) == len(classList):
return classList[0] # 如果沒有更多數(shù)據(jù)了,超過一個才有分類的意義
if len(dataSet[0]) == 1: # 多數(shù)表決,返回出現(xiàn)次數(shù)最多的
return majorityCnt(classList) # 選出最適合用于切分類型的下標
bestFeat = chooseBestFeatureToSplit(dataSet) # 根據(jù)下標取出標簽
bestFeatLabel = labels[bestFeat] # 構建樹
myTree = {bestFeatLabel:{}} # 刪除取出過的標簽,避免重復計算
del(labels[bestFeat])
featValues = [example[bestFeat] for example in dataSet] # 利用set去重
uniqueVals = set(featValues) for value in uniqueVals: # 復制所有的子標簽,因為是引用類型,以避免改變原始標簽數(shù)據(jù)
subLabels = labels[:] # 遞歸的構建樹
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels) return myTree
使用決策樹分類
def classify(inputTree,featLabels,testVec):
firstStr = inputTree.keys()[0]
secondDict = inputTree[firstStr]
featIndex = featLabels.index(firstStr) # print 'featIndex %s' % (featIndex)
key = testVec[featIndex] # print 'key %s' % (key)
valueOfFeat = secondDict[key] if isinstance(valueOfFeat, dict):
classLabel = classify(valueOfFeat, featLabels, testVec) else: classLabel = valueOfFeat return classLabel
dataSet, labels = createDataSet()
mytree = createTree(dataSet, labels[:]) #因為內(nèi)部會刪除labels里的值所以用這樣copy一份 print mytree # {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}print classify(mytree, labels, [0,1])
no
決策樹的存儲
構造決策樹是耗時的任務,即使處理很小的數(shù)據(jù)集。所以我們可以使用構造好的決策樹。
def storeTree(inputTree,filename):
import pickle
fw = open(filename,'w')
pickle.dump(inputTree,fw)
fw.close()def grabTree(filename):
import pickle
fr = open(filename) return pickle.load(fr)
優(yōu)點
計算復雜度不高
輸出結果易于理解
對中間值缺失不敏感
可以處理不相關特偵
缺點
可能產(chǎn)生過度匹配問題
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結構數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結構數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結構數(shù)據(jù)特征價值的專業(yè)核心 表結構數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結構化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據(jù)分析與統(tǒng)計學領域,假設檢驗是驗證研究假設、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結構數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結構數(shù)據(jù)(以 “行 - 列” 存儲的結構化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結構數(shù)據(jù)價值的核心操盤手 表格結構數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據(jù)把關的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10