id3決策樹Python版

2021-06-22 14:27:46 字數 3874 閱讀 2113

一直都是用r,sas這樣的工具完成機器學習演算法。但是面對大資料集的時候,這些工具往往顯得很弱,基本上在讀入檔案的時候就能讓電腦的記憶體爆掉。能用程式實現這些機器學習演算法是很重要的。因為自己如果能實現這些演算法,你就可以很靈活,比如說在文字挖掘過程中往往是稀疏矩陣,雖然r也有提供稀疏矩陣的操作,但是不一定滿足自己的需求。所以我選擇了從《機器學習實戰》這本書中來學習用python實現機器學習的演算法。

下面直接貼上**,這**完全是仿照書上寫的。用這個思路我還實現了c++版的id3演算法,會稍後貼出。

import math

dataset = [

("青年", "否", "否", "一般", "否")

,("青年", "否", "否", "好", "否")

,("青年", "是", "否", "好", "是")

,("青年", "是", "是", "一般", "是")

,("青年", "否", "否", "一般", "否")

,("中年", "否", "否", "一般", "否")

,("中年", "否", "否", "好", "否")

,("中年", "是", "是", "好", "是")

,("中年", "否", "是", "非常好", "是")

,("中年", "否", "是", "非常好", "是")

,("老年", "否", "是", "非常好", "是")

,("老年", "否", "是", "好", "是")

,("老年", "是", "否", "好", "是")

,("老年", "是", "否", "非常好", "是")

,("老年", "否", "否", "一般", "否")

]labels=['var1','var2','var3','var4']

data=[[1,1,'yes'],

[1,1,'yes'],

[1,0,'no'],

[0,1,'no'],

[0,1,'no']]

la=['no su***cing','flippes']

#計算資訊熵,target為分類標籤的位置

def entropy(dataset,target=-1):

instance_num=len(dataset)

tar_num={}

entro=0.0

for t in dataset:

tar_num[t[target]]=tar_num.setdefault(t[target],0)+1

pl=[n/instance_num for n in tar_num.values()]

for p in pl:

entro-=p*math.log2(p)

return(entro)

###拆分資料集

def split_dataset(dataset,f_index,value):

sub_set=

for row in dataset:

row=list(row)

if row[f_index]==value:

row.remove(row[f_index])

return(sub_set)

###計算資訊增益

def info_gain(dataset,feature_index):

entropy_d=entropy(dataset)

long_dataset=len(dataset)

feature_count={}

sub_entropy=0.0

for row in dataset:

feature_count[row[feature_index]]=feature_count.setdefault(row[feature_index],0)+1

feature_p=0.0

for k,v in feature_count.items():

feature_p=v/long_dataset

subset=split_dataset(dataset,feature_index,k)

sub_entropy+=feature_p*entropy(subset)

ig=entropy_d-sub_entropy

#print(ig)

return(ig)

##尋找最大資訊增益的特徵

def find_bestfeature(dataset,label):

max_ig=0.0

for la in label:

label_index=label.index(la)

ig=info_gain(dataset,label_index)

if ig>max_ig:

max_ig=ig

baset_feature=la

return(baset_feature,label_index)

###返回數量做多的value

def max_count(dataset):

if dataset[0]==1:

for row in dataset:

class_count[row[0]]=class_count.setdefault(row[0],0)+1

sorted_count=sorted(class_count.items(),reverse=true)

return(sorted_count[0][0])

else:

return(none)

###create_tree

def create_tree(dataset,label):

class_list=[x[-1] for x in dataset]

if class_list.count(class_list[0])==len(dataset):

return(class_list[0])

if len(dataset)==1:

return(max_count(dataset))

best_feature,index=find_bestfeature(dataset,label)

tree=}

feature_list=set(x[index] for x in dataset)

label.remove(best_feature)

for ft in feature_list:

sublabel=label[:]

subset=split_dataset(dataset,index,ft)

tree[best_feature][ft]=create_tree(subset,sublabel)

return(tree)

def classfy(inputtree,featlabels,testvec):

firststr=list(inputtree.keys())[0]

seconddict=inputtree[firststr]

featindex=featlabels.index(firststr)

for key in seconddict.keys():

if testvec[featindex]==key:

if type(seconddict[key]).__name__=='dict':

classlabel=classfy(seconddict[key],featlabels,testvec)

else:

classlabel=seconddict[key]

return classlabel

mytree=create_tree(data,la)

test=classfy(mytree,['no su***cing','flippes'],[0,1])

print(test)

決策樹 ID3構建決策樹

coding utf 8 from math import log import operator 建立訓練資料集 defcreatedataset dataset 1,1,yes 1,1,yes 1,0,no 0,1,no 0,1,no 資料集的最後乙個元素作為該資料的標籤,是否是魚 labels...

決策樹之 ID3

id3 是一種用來構建決策樹的演算法,它根據資訊增益來進行屬性選擇。關於決策樹,請參見 此處主要介紹 id3 演算法如何利用資訊增益選擇屬性。資訊熵,簡稱 熵 假定訓練集中目標屬性為 c c的取值為 c1 c2,cm 每個取值佔的比例為p1 p2,pm 則資訊熵的定義為 en trop y s en...

決策樹 ID3演算法

id3演算法通過計算每個屬性的資訊增益,認為資訊增益越大屬性越優,每次劃分選取資訊增益最大的屬性為劃分標準,重複這個過程,直到構成一棵決策樹。資訊熵是描述事件給我們的驚訝程度,如果所有事件的概率均等,那熵值大,驚訝程度低。如果有一事件的概率極高而其他極低,熵值便低,驚訝程度大。其計算公式如下 資訊增...