决策树是一种经典的机器学习方法,其核心思想是相同(相似)的输入产生相同(相似)的输出。通过树状结果进行决策,其目的是通过对样本不同属性的判断决策,将具有相同属性的样本划分到下一个叶子节点,从而实现分类或者回归。
根据西瓜书的知识,构建决策树的算法如下:
由此可见决策树的构建是一个递归问题,核心在于:
import numpy as np
import math
import matplotlib.pyplot as plt
class_num = 10 # 最大类别数
def compute_entropy(n):
p = 1.0/n # 假设类别等概率分布
entropy_value = 0.0 # 信息熵
for i in range(n):
p_i = p * math.log(p)
entropy_value += p_i
return -entropy_value
entropies = [] # 记录信息熵用于可视化
for i in range(1, class_num+1):
entropy = compute_entropy(i)
entropies.append(entropy)
print('--------可视化--------')
plt.figure('Information Entropy', facecolor='lightgray')
plt.title('Information Entropy', fontsize=18)
plt.xlabel('class_nums', fontsize=18)
plt.ylabel('entropy', fontsize=18)
plt.plot(range(1,11), entropies, c='red', label='entropy')
plt.grid(':')
plt.legend()
plt.show()
import sklearn.datasets as sd
import sklearn.utils as su
import sklearn.tree as st
import sklearn.metrics as sm
boston_data = sd.load_boston() # 加载标准化数据集
print(boston_data.feature_names) # 属性名称
print(boston_data.data.shape) # 数据维度
print(boston_data.target.shape) # 标签维度
random_seed = 1 # 设置随机种子,固定随机值
x, y = su.shuffle(boston_data.data, boston_data.target,
random_state=random_seed)
train_size = int(len(x)*0.8) # 使用数据集中80%用作训练
# 切分数据集为训练集和测试集
train_x = x[:train_size]
test_x = x[train_size:]
train_y = y[:train_size]
test_y = y[train_size:]
# 构建模型
model = st.DecisionTreeRegressor(max_depth=4)
# 训练模型
model.fit(train_x, train_y)
# 预测
pred_test_y = model.predict(test_x)
# 使用R2系数进行回归模型预测评估
print('r2_score'%sm.r2_score(test_y, pred_test_y))
"""
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
'B' 'LSTAT']
(506, 13)
(506,)
r2_score: 0.886405
"""
作为决策树模型训练的副产品,根据每一个特征划分前后信息熵的减少量标志着该特征的重要程度,即为该特征重要性的指标。训练后得到的模型对象提供了属性**feature_importances_**存储每个特征的重要性。事实上,借此指标我们不必让每一个特征都参与划分,而选择相对更重要的特征参与划分。
加入下述代码可视化上述波士顿房价预测中各个属性的重要程度:
import matplotlib.pyplot as plt
import numpy as np
# 属性重要性程度可视化
fi = model.feature_importances_
plt.figure('Feature Importance', figsize=(8,6), facecolor='lightgray')
plt.title('Feature Importance', fontsize=18)
plt.ylabel('Feature Importance', fontsize=18)
plt.xlabel('attributes', fontsize=18)
plt.grid(linestyle=':', axis='x')
sorted_idx = fi.argsort()[::-1]
fi = fi[sorted_idx]
plt.xticks(np.arange(fi.size), boston_data.feature_names[sorted_idx])
plt.bar(np.arange(fi.size), fi, 0.6, color='dodgerblue', label='Feature Importances')
plt.legend()
plt.tight_layout()
plt.show()
集成学习(ensemble learning)通过构建并合并多个模型来完成学习任务,从而获得比单一学习模型更优越的性能。形象来说,集成学习就是利用模型的’集体智慧’,提升预测的准确率。根据单个模型方式,集成学习可以分为两大类:
Boosting时一族可以将弱学习器提升为强学习的算法,工作原理:
# model: 决策树模型(单个模型,基学习器)
model = st.DecisionTreeRegressor(max_depth=4)
# n_estimators:构建400棵不同权重的决策树,训练模型
model = se.AdaBoostRegressor(model, # 单模型
n_estimators=400, # 决策树数量
random_state=7)# 随机种子
import sklearn.ensemble as se
model = se.RandomForestRegressor(
max_depth, # 决策树最大深度
n_estimators, # 决策树数量
min_samples_split)# 节点分裂最小样本数目
import sklearn.datasets as sd # sklearn标准化数据集加载模块
import sklearn.utils as su # sklearn工具模块
import sklearn.tree as st
import sklearn.ensemble as se # sklearn集成学习模块
import sklearn.metrics as sm # sklearn模型评估模块
boston_data = sd.load_boston()
print(boston_data.feature_names)
print(boston_data.data.shape)
print(boston_data.target.shape)
random_seed = 1
x, y = su.shuffle(boston_data.data, boston_data.target, random_state=random_seed)
train_size = int(len(x)*0.8)
train_x = x[:train_size]
train_y = y[:train_size]
test_x = x[train_size:]
test_y = y[train_size:]
# 构建模型
model = se.RandomForestRegressor(max_depth=10, # 树的最大深度
n_estimators=1000, # 树的数量
min_samples_split=2 # 分裂最小样本数
)
# 训练模型
model.fit(train_x, train_y)
# 预测
pred_test_y = model.predict(test_x)
# 利用R2系数评估模型
r2_score = sm.r2_score(test_y, pred_test_y)
# 得到统计数据属性的重要性
fi = model.feature_importances_
print('r2_score', r2_score)
"""
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
'B' 'LSTAT']
(506, 13)
(506,)
r2_score 0.9051329154231126
"""
OK,以上就是关于决策树的一些较为浅显的认知,我想如果可以等到研究生阶段,这些模型如果有需要应该会更深入地探究。