原标题:决策树的基本原理与Python实现
1、决策树长啥样?
决策树其实就是一个多层的if then结构,如下图所示(这里就不画了,引用百度图片)
2、决策树中的节点如何确定?
a、熵的具体含义
熵代表着信息的混乱情况,熵越小,代表信息越纯,相应事件的发生概率越大,反之,熵越大,代表信息越混乱,相应事件的发生概率越小,具体公式如下所示:
b、什么是条件熵
条件熵是指在x的随机条件下对于y的不确定性表述,其计算公式如下所示:
c、信息增益
信息增益=熵-条件熵
g(y,x)=H(y)-H(y|x)
信息增益是指通过决策树分支对于信息混乱减少的程度;
d、信息增益率
g_r(y|x)=g(y,x)/h(x)
为了防止当特征的取值较多时,通过信息增益比较容易划分到纯度较高的子集,导致节点更偏向于取值较多的特征,因此常用信息增益率作为分支标准。
e、Gini指数
c、d、e不同的分支标准在决策树中分别对应着ID3、C4.5、CART算法;
3、Python实现
这里仅实现ID3方法且没使用递归,仅用来理解如何使用编程语言来表达数学公式,如下所示
#__Author__:随心
importpandas aspd
importnumpy asnp
importmath
data =pd.read_excel ("d:决策树示例.xlsx")
defH_Y(data ):
labelcount ={}
h =0.0
foreachAct indata :
ifeachAct [-1]inlabelcount :
labelcount [eachAct [-1]]+=1
else:
labelcount [eachAct [-1]]=1
forkey_index inlabelcount :
h +=-float(labelcount [key_index ])/len(data )*math.log (float(labelcount [key_index ])/len(data ), 2)
returnh
defH_X(data,index,value ):
x_count ={}
forline indata :
ifline [index ]inx_count :
x_count [line [index ]]+=1
else:
x_count [line [index ]]=1
h =0
forx_key inx_count :
y_label ={}
foreachAct indata :
ifeachAct [-1]==value andeachAct [index ]==x_key :
ifvalue iny_label :
y_label [value ]+=1
else:
y_label [value ]=1
try:
y_label [value ]
except:
y_label [value ]=0.00001
h +=x_count [x_key ]/len(data )*((-y_label [value ]/(x_count [x_key ]))*math.log ((y_label [value ])/(x_count [x_key ]), 2)-((x_count [x_key ]-y_label [value ])/(x_count [x_key ]))*math.log ((x_count [x_key ]-y_label [value ]+0.00001)/(x_count [x_key ]), 2))
returnh
#根节点
g_max =[]
data1 =data.as_matrix ()
feature_index =["年龄", "有无工作", "有无房子", "信用情况"]
fori inrange(data1.shape [1]-1):
g_max.append (H_Y (data1 )-H_X (data1,i, "是"))
print("根节点为%s"%feature_index [np.argmax (np.array (g_max ))])
#第二层节点
g_max2 =[]
data2 =data [(data [feature_index [np.argmax (np.array (g_max ))]]!='有')].as_matrix ()
data_2 =data2 [:, [0, 1, 3, 4]]
feature_index1 =["年龄", "有无工作", "信用情况"]
forj inrange(data_2.shape [1]-1):
g_max2.append (H_Y (data_2 )-H_X (data_2, j, "是"))
print("第二层节点为%s"%feature_index1 [np.argmax (np.array (g_max2 ))])
欢迎加群一起讨论学习~
www.vbafans.com返回搜狐,查看更多
责任编辑: