Python3入门机器学习 - 决策树
2018-03-17 本文已影响30人
c6ad47dbfc82
信息熵
左式的信息熵较高,代表左式的不确定性更强,左式即指数据有三个类别,每个类别占1/3
右式的信息熵为0,是信息熵可以达到的最小值,代表数据的不确定性最低,即最确定
绘制决策树的决策边界
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:,2:]
y = iris.target
from sklearn.tree import DecisionTreeClassifier
#criterion="entropy"代表使用信息熵进行划分
dt_clf = DecisionTreeClassifier(max_depth=2, criterion="entropy")
dt_clf.fit(X,y)
plot_decision_boundary(dt_clf,axis=[0.5,7.5,0,3])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.scatter(X[y==2,0],X[y==2,1])
plt.show()
使用信息熵寻找最优划分
from collections import Counter
from math import log
def split(X,y,d,value):
index_a = (X[:,d]<=value)
index_b = (X[:,d]>value)
return X[index_a],X[index_b],y[index_a],y[index_b]
def entropy(y):
counter = Counter(y)
res = 0.0
for num in counter.values():
p = num/len(y)
res += -p*log(p)
return res
def try_split(X,y):
best_entropy = float('inf')
best_d,best_v = -1,-1
for d in range(X.shape[1]):
sorted_index = np.argsort(X[:,d])
for i in range(1,len(X)):
if(X[sorted_index[i-1],d]!=X[sorted_index[i],d]):
v = (X[sorted_index[i-1],d]+X[sorted_index[i],d])/2
X_l,X_r,y_l,y_r = split(X,y,d,v)
e = entropy(y_l)+entropy(y_r)
if e<best_entropy:
best_entropy,best_d,best_v = e,d,v
return best_entropy,best_d,best_v
try_split(X,y)
>>> (0.6931471805599453, 0, 2.45) #对于第一次划分,得到的信息熵为0.36,是在第0个维度上的2.45处划分的结果
best_entropy,best_d,best_v = try_split(X,y)
X_l,X_r,y_l,y_r = split(X,y,best_d,best_v)
entropy(y_l) #划分结果的y_l信息熵为0,不能继续划分,但我们可以对y_r继续划分
>>> 0.0
try_split(X_r,y_r)
>>> (0.4132278899361904, 1, 1.75)
使用基尼系数进行划分
基尼系数的划分整体和信息熵是一样的,只是使用计算的公式不同
基尼系数计算公式
def entropy(y):
counter = Counter(y)
res = 1.0
for num in counter.values():
p = num/len(y)
res -= p**2
return res
#try_split逻辑和信息熵划分完全一样
决策树的超参数
#在创建对象的时候,如果不传参数,那么默认会划分到所有分类的基尼系数都为0
dec_clf = DecisionTreeClassifier()
dec_clf.fit(X,y)
plot_decision_boundary(dec_clf,[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()
过拟合
- max_depth #最大深度
- min_samples_split #对于节点来说至少有多少个样本数据
- min_samples_leaf #对于叶子节点至少要几个样本
- max_leaf_nodes #最多有多少个叶子节点
决策树解决回归问题
决策树解决回归问题的思路是,将每个叶子节点内所有样本数据的平均值作为预测结果。