1. 程式人生 > >C4.5決策樹演算法(Python實現)

C4.5決策樹演算法(Python實現)

C4.5演算法使用資訊增益率來代替ID3的資訊增益進行特徵的選擇,克服了資訊增益選擇特徵時偏向於特徵值個數較多的不足。資訊增益率的定義如下:
這裡寫圖片描述

# -*- coding: utf-8 -*-


from numpy import *
import math
import copy
import cPickle as pickle


class C45DTree(object):
    def __init__(self):  # 構造方法
        self.tree = {}  # 生成樹
        self.dataSet = []  # 資料集
        self.labels = []  # 標籤集
# 資料匯入函式 def loadDataSet(self, path, labels): recordList = [] fp = open(path, "rb") # 讀取檔案內容 content = fp.read() fp.close() rowList = content.splitlines() # 按行轉換為一維表 recordList = [row.split("\t") for row in rowList if row.strip()] # strip()函式刪除空格、Tab等
self.dataSet = recordList self.labels = labels # 執行決策樹函式 def train(self): labels = copy.deepcopy(self.labels) self.tree = self.buildTree(self.dataSet, labels) # 構件決策樹:穿件決策樹主程式 def buildTree(self, dataSet, lables): cateList = [data[-1] for data in
dataSet] # 抽取源資料集中的決策標籤列 # 程式終止條件1:如果classList只有一種決策標籤,停止劃分,返回這個決策標籤 if cateList.count(cateList[0]) == len(cateList): return cateList[0] # 程式終止條件2:如果資料集的第一個決策標籤只有一個,返回這個標籤 if len(dataSet[0]) == 1: return self.maxCate(cateList) # 核心部分 bestFeat, featValueList= self.getBestFeat(dataSet) # 返回資料集的最優特徵軸 bestFeatLabel = lables[bestFeat] tree = {bestFeatLabel: {}} del (lables[bestFeat]) for value in featValueList: # 決策樹遞迴生長 subLables = lables[:] # 將刪除後的特徵類別集建立子類別集 # 按最優特徵列和值分隔資料集 splitDataset = self.splitDataSet(dataSet, bestFeat, value) subTree = self.buildTree(splitDataset, subLables) # 構建子樹 tree[bestFeatLabel][value] = subTree return tree # 計算出現次數最多的類別標籤 def maxCate(self, cateList): items = dict([(cateList.count(i), i) for i in cateList]) return items[max(items.keys())] # 計算最優特徵 def getBestFeat(self, dataSet): Num_Feats = len(dataSet[0][:-1]) totality = len(dataSet) BaseEntropy = self.computeEntropy(dataSet) ConditionEntropy = [] # 初始化條件熵 slpitInfo = [] # for C4.5,caculate gain ratio allFeatVList = [] for f in xrange(Num_Feats): featList = [example[f] for example in dataSet] [splitI, featureValueList] = self.computeSplitInfo(featList) allFeatVList.append(featureValueList) slpitInfo.append(splitI) resultGain = 0.0 for value in featureValueList: subSet = self.splitDataSet(dataSet, f, value) appearNum = float(len(subSet)) subEntropy = self.computeEntropy(subSet) resultGain += (appearNum/totality)*subEntropy ConditionEntropy.append(resultGain) # 總條件熵 infoGainArray = BaseEntropy*ones(Num_Feats)-array(ConditionEntropy) infoGainRatio = infoGainArray/array(slpitInfo) # C4.5資訊增益的計算 bestFeatureIndex = argsort(-infoGainRatio)[0] return bestFeatureIndex, allFeatVList[bestFeatureIndex] # 計算劃分資訊 def computeSplitInfo(self, featureVList): numEntries = len(featureVList) featureVauleSetList = list(set(featureVList)) valueCounts = [featureVList.count(featVec) for featVec in featureVauleSetList] pList = [float(item)/numEntries for item in valueCounts] lList = [item*math.log(item, 2) for item in pList] splitInfo = -sum(lList) return splitInfo, featureVauleSetList # 計算資訊熵 # @staticmethod def computeEntropy(self, dataSet): dataLen = float(len(dataSet)) cateList = [data[-1] for data in dataSet] # 從資料集中得到類別標籤 # 得到類別為key、 出現次數value的字典 items = dict([(i, cateList.count(i)) for i in cateList]) infoEntropy = 0.0 for key in items: # 夏農熵: = -p*log2(p) --infoEntropy = -prob * log(prob, 2) prob = float(items[key]) / dataLen infoEntropy -= prob * math.log(prob, 2) return infoEntropy # 劃分資料集: 分割資料集; 刪除特徵軸所在的資料列,返回剩餘的資料集 # dataSet : 資料集; axis: 特徵軸; value: 特徵軸的取值 def splitDataSet(self, dataSet, axis, value): rtnList = [] for featVec in dataSet: if featVec[axis] == value: rFeatVec = featVec[:axis] # list操作:提取0~(axis-1)的元素 rFeatVec.extend(featVec[axis + 1:]) # 將特徵軸之後的元素加回 rtnList.append(rFeatVec) return rtnList # 存取樹到檔案 def storetree(self, inputTree, filename): fw = open(filename,'w') pickle.dump(inputTree, fw) fw.close() # 從檔案抓取樹 def grabTree(self, filename): fr = open(filename) return pickle.load(fr)

呼叫程式碼

# -*- coding: utf-8 -*-

from numpy import *
from C45DTree import *

dtree = C45DTree()
dtree.loadDataSet("dataset.dat",["age", "revenue", "student", "credit"])
dtree.train()

dtree.storetree(dtree.tree, "data.tree")
mytree = dtree.grabTree("data.tree")
print mytree

相關推薦

C4.5決策演算法Python實現

C4.5演算法使用資訊增益率來代替ID3的資訊增益進行特徵的選擇,克服了資訊增益選擇特徵時偏向於特徵值個數較多的不足。資訊增益率的定義如下: # -*- coding: utf-8 -*- from numpy import * import ma

決策演算法Python實現—基於金融場景實操

決策樹是最經常使用的資料探勘演算法,本次分享jacky帶你深入淺出,走進決策樹的世界 基本概念 決策樹(Decision Tree) 它通過對訓練樣本的學習,並建立分類規則,然後依據分類規則,對新樣本資料進行分類預測,屬於有監督學習。 優點

ID3和C4.5決策演算法總結

1.決策樹的演算法流程 決策樹的演算法流程主要是: 1.如果當前樣本集全部為同一類別,則返回這一類標籤 2.如果當前屬性集為空集或者D中樣本在屬性集中的取值全部相同,那麼採用多數表決法,返回樣本數最多的類標籤 3.如果不滿足上面三個條件,說明當前結點還可

Thinking in SQL系列之四:資料探勘C4.5決策演算法

原創: 牛超   2017-02-11   Mail:[email protected] C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個數據集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一

Kaggle競賽入門:決策演算法Python實現

本文翻譯自kaggle learn,也就是kaggle官方最快入門kaggle競賽的教程,強調python程式設計實踐和數學思想(而沒有涉及數學細節),筆者在不影響演算法和程式理解的基礎上刪除了一些不必要的廢話,畢竟英文有的時候比較囉嗦。 一.決策樹演算法基本原理 背景:假設你的哥哥是一個投資房地產的大佬,投

Kaggle競賽入門(一):決策演算法Python實現

本文翻譯自kaggle learn,也就是kaggle官方最快入門kaggle競賽的教程,強調python程式設計實踐和數學思想(而沒有涉及數學細節),筆者在不影響演算法和程式理解的基礎上刪除了一些不必要的廢話,畢竟英文有的時候比較囉嗦。 一.決策樹演算法基本原理 背景:假設你的哥哥是一個投資房地產的大佬,投

排序演算法python實現

排序演算法一共有2類:    演算法時間fuzh複雜讀與nlogn比較,大為非線性類,小為線性類;         非線性類比較類排序有:交換排序(冒泡,快速),插入排序(簡單插入,shell),歸併排序(2路歸併,多路歸併),選擇排序(簡單選擇,堆排序);      

基於畫素清晰度的影象融合演算法Python實現

# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt import cv2 from math import log from PIL import Image import d

常用查詢資料結構及演算法Python實現

目錄 一、基本概念 二、無序表查詢 三、有序表查詢 3.1 二分查詢(Binary Search) 3.2 插值查詢 3.3 斐波那契查詢 四、線性索引查詢 4.1 稠密索引 4.2 分塊索引 4.3 倒排索引 五、二叉排序樹 六、 平衡二叉樹 七、多路查詢樹(B樹) 7.1 2-3樹 7.2 2-3-4樹

最小生成樹,普里姆演算法Python實現

December 16, 2015 12:01 PM 1.相關概念 1)生成樹 一個連通圖的生成樹是它的極小連通子圖,在n個頂點的情形下,有n-1條邊。生成樹是對連通圖而言的,是連同圖的極小連通子圖,包含圖中的所有頂點,有且僅有n-1條邊。非連通圖的生成

八皇后問題--遞歸回溯演算法Python實現

前兩天做牛客的時候遇到了一個字串的全排列問題。順便回顧一下八皇后問題。(後附Python程式碼)如何解決八皇后問題?所謂遞歸回溯,本質上是一種列舉法。這種方法從棋盤的第一行開始嘗試擺放第一個皇后,擺放成功後,遞迴一層,再遵循規則在棋盤第二行來擺放第二個皇后。如果當前位置無法擺

對稱加密演算法——DES演算法python實現

一、DES演算法描述         DES演算法總的說來可以兩部分組成: 1、對金鑰的處理。這一部分是把我們用的64位金鑰(實際用的56位,去掉了8個奇偶校驗位)分散成16個48位的子金鑰。 2、對資料的加密。通過第一步生成的子金鑰來加密我們所要加密的資料,最終生成密文。 下面就通過這兩

Python3實現機器學習經典演算法C4.5決策

一、C4.5決策樹概述   C4.5決策樹是ID3決策樹的改進演算法,它解決了ID3決策樹無法處理連續型資料的問題以及ID3決策樹在使用資訊增益劃分資料集的時候傾向於選擇屬性分支更多的屬性的問題。它的大部分流程和ID3決策樹是相同的或者相似的,可以參考我的上一篇部落格:https://www.cnblogs.

R語言-決策演算法C4.5和CART實現

決策樹演算法的實現: 一、C4.5演算法的實現 a、需要的包:sampling、party library(sampling) library(party) sampling用於實現資料分層隨機抽樣,構造訓練集和測試集。 party用於實現決策樹演算法 另外,還可以設定隨

機器學習筆記6——C4.5決策中的剪枝處理和Python實現

1. 為什麼要剪枝 還記得決策樹的構造過程嗎?為了儘可能正確分類訓練樣本,節點的劃分過程會不斷重複直到不能再分,這樣就可能對訓練樣本學習的“太好”了,把訓練樣本的一些特點當做所有資料都具有的一般性質,cong從而導致過擬合。這時就可以通過剪枝處理去掉yi一些分支來降低過擬合

決策學習 -- ID3演算法C4.5演算法C++實現

前言 在學習西瓜書的時候,由於書本講的大多是概念,所以打算用C++實現它的演算法部分(至於python和matlab實現,實現簡單了很多,可以自己基於C++程式碼實現)。至於測試資料,採用了書中關於西瓜的資料集。 什麼是決策樹 首先,決策樹(也叫做分類

機器學習筆記5——C4.5決策中的連續值處理和Python實現

在ID3決策樹演算法中,我們實現了基於離散屬性的決策樹構造。C4.5決策樹在劃分屬性選擇、連續值、缺失值、剪枝等幾方面做了改進,內容較多,今天我們專門討論連續值的處理和Python實現。 1. 連續屬性離散化 C4.5演算法中策略是採用二分法將連續屬性離散化處理:假定

決策演算法ID3,C4.5,CART

ID3,C4.5,CART是是決策樹的核心演算法。它們都由特徵選擇,樹的生成,剪枝組成。但ID3和C4.5用於分類,CART可用於分類與迴歸。 1.ID3演算法 ID3演算法遞迴地構建決策樹,從根節點開始,對所有特徵計算資訊增益,選擇資訊增益最大的特徵作為節點的特徵,由該特徵的不同取值建

【轉】深入淺出理解決策演算法-ID3演算法C4.5演算法

從深入淺出理解決策樹演算法(一)-核心思想 - 知乎專欄文章中,我們已經知道了決策樹最基本也是最核心的思想。那就是其實決策樹就是可以看做一個if-then規則的集合。我們從決策樹的根結點到每一個都葉結點構建一條規則。 並且我們將要預測的例項都可以被一條路徑或者一條規則所覆蓋。 如下例:假設我

基於資訊增益的決策歸納的Python實現【CD4.5演算法

# -*- coding: utf-8 -*- import numpy as np import matplotlib.mlab as mlab import matplotlib.pyplot as plt from copy import copy #載入訓練資料