前言
本节学习决策树
- 非参数学习算法
- 天然可以解决多分类问题
- 也可以解决回归问题
复杂度
- 训练O(nmlogm)
- 预测O(logm)
1、按熵划分的决策树
先直观感受下决策树是这个样子的
以鸢尾花数据集为例
那么决策树的划分依据是什么
主要有信息熵和基尼系数
信息熵就不多做介绍了
这里的决策是划分后使得熵降低
实现如下
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from collections import Counter
from math import log
"""使用信息熵进行划分,构建决策树"""
# 数据
iris = datasets.load_iris()
X = iris.data[:, 2:]
y = iris.target
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()
# 划分函数
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], d] != X[sorted_index[i - 1], d]:
v = (X[sorted_index[i], d] + X[sorted_index[i - 1], d]) / 2
X_l, X_r, y_l, y_r = split(X, y, d, v)
p_l, p_r = len(X_l) / len(X), len(X_r) / len(X)
e = p_l * entropy(y_l) + p_r * entropy(y_r)
if e < best_entropy:
best_entropy, best_d, best_v = e, d, v
return best_entropy, best_d, best_v
best_entropy, best_d, best_v = try_split(X, y)
print("best_entropy =", best_entropy