机器学习手册学习笔记--树和森林

226 阅读5分钟

仅供自己复习回顾使用,若有侵权可删除

决策树

决策树型模型普及的一个原因是它们的可解释性很强

决策树有一个常见问题,即倾向于紧密地拟合训练数据(过拟合)

from sklearn import datasets
iris = datasets.load_iris()
features = iris.data
target = iris.target

# 创建决策树分类器对象
from sklearn.tree import DecisionTreeClassifier
decisiontree = DecisionTreeClassifier(random_state=0)
#默认使用基尼不纯度 ,可改为criterion='entropy'
# 训练模型
model = decisiontree.fit(features, target)

# 创建决策树回归模型对象
from sklearn.tree import DecisionTreeRegressor
decisiontree = DecisionTreeRegressor(random_state=0)
#使用均方误差(MSE),可改用criterion="mae"平均绝对误差
model = decisiontree.fit(features, target)

可视化决策树模型

需要下载graphviz软件,并加入到环境变量

import pydotplus
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
from IPython.display import Image
from sklearn import tree
# 加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
# 创建决策树分类器对象
decisiontree = DecisionTreeClassifier(random_state=0)
# 训练模型
model = decisiontree.fit(features, target)
# 创建 DOT 数据
dot_data = tree.export_graphviz(decisiontree,
out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names)
# 绘制图形
graph = pydotplus.graph_from_dot_data(dot_data)
# 显示图形
Image(graph.create_png())
# 创建 PDF
graph.write_pdf("iris.pdf")
# 创建 PNG
graph.write_png("iris.png")

随机森林

# 加载库

from sklearn import datasets
iris = datasets.load_iris()
features = iris.data
target = iris.target

# 创建随机森林分类器对象
from sklearn.ensemble import RandomForestClassifier
randomforest = RandomForestClassifier(random_state=0, n_jobs=-1)
# 训练模型
model = randomforest.fit(features, target)
'''
max_features 决定每个节点需要考虑的特征的最大数量,允许输入的变量类型包括整型(特征的数量)、
浮点型(特征的百分比)和 sqrt(特征数量的平方根)。默认情况下,参数 max_features 的值被设
置为 auto(相当于 sqrt);
bootstrap 用于设置在创建树时使用的样本子集,是有放回的抽样(默认值)还是无放回的抽样;
n_estimators 设置森林中包含的决策树的数量
'''

from sklearn import datasets
boston = datasets.load_boston()
features = boston.data[:,0:2]
target = boston.target

# 创建随机森林回归对象
from sklearn.ensemble import RandomForestRegressor
randomforest = RandomForestRegressor(random_state=0, n_jobs=-1)
# 训练模型
model = randomforest.fit(features, target)

识别随机森林中的重要特征

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
iris = datasets.load_iris()
features = iris.data
target = iris.target

# 创建随机森林分类器对象
randomforest = RandomForestClassifier(random_state=0, n_jobs=-1)
model = randomforest.fit(features, target)
# 计算特征的重要性
importances = model.feature_importances_
# 将特征的重要性按降序排列
indices = np.argsort(importances)[::-1]
# 按照特征的重要性对特征名称重新排序
names = [iris.feature_names[i] for i in indices]
# 创建图
plt.figure()
plt.title("Feature Importance")
plt.bar(range(features.shape[1]), importances[indices])
plt.xticks(range(features.shape[1]), names, rotation=90)

选择随机森林中的重要特征

第一,经过 one-hot 编码的 nominal 型分类特征的重要性被稀释到二元特征中; 第二,一对高度相关的特征,其重要性被集中在其中一个特征上,而不是均匀分布在这两个特征上。

from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
from sklearn.feature_selection import SelectFromModel
iris = datasets.load_iris()
features = iris.data
target = iris.target

randomforest = RandomForestClassifier(random_state=0, n_jobs=-1)
# 创建对象,选择重要性大于或等于阈值的特征
selector = SelectFromModel(randomforest, threshold=0.3)
# 使用选择器创建新的特征矩阵
features_important = selector.fit_transform(features, target)
# 使用重要的特征训练随机森林模型
model = randomforest.fit(features_important, target)

处理不均衡的分类

用参数 class_weight="balanced" 训练决策树或随机森林模型

控制决策树的规模

max_depth : 树的最大深度。如果该参数为 None,则树将一直生长,直到所有叶子都为纯节点。 如果提供整数作为该参数的值,这棵树就会被有效“修剪”到这个整数值所表示的 深度。

min_samples_split 在该节点分裂之前,节点上最小的样本数。如果提供整数作为该参数的值,则这个 整数代表最小的样本数 ;如果提供浮点数作为参数值,则最小样本数为总样本数乘 以该浮点数。

min_samples_leaf 叶子节点需要的最小样本数。与 min_samples_split 使用相同的参数格式。

max_leaf_nodes 最大叶子节点数。

min_impurity_split 执行分裂所需的最小不纯度减少量。

我们只会用到 max_depthmin_impurity_split 这两个参数,因为较浅的树(有时称为树桩, stump)结构更简单,并且方差较小。

通过 boosting 提高性能

迭代地训练一系列弱模型(通常是一个浅层决策树,有时称为树桩),每次迭代都会为前一个模型预测错的样本分配更大的权重

from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
iris = datasets.load_iris()
features = iris.data
target = iris.target

# 创建 adaboost 树分类器对象
adaboost = AdaBoostClassifier(random_state=0)
'''
base_estimator 表示训练弱模型的学习算法,决策树(默认值)
n_estimators 需要迭代训练的模型数量
learning_rate 是每个弱模型的权重变化率,默认值为 1。减小这个参数值意味着权重变化的幅度变小,
这会使模型的训练速度变慢(但有时会使模型的性能更好)。
loss 是 AdaBoostRegressor 独有的参数,它设置了在更新权重时所用的损失函数。其默认值为线性
损失函数,但是可以改为平方( square)或指数函数
'''
# 训练模型
model = adaboost.fit(features, target)

使用袋外误差(Out-of-Bag Error)评估随机森林模型

在随机森林中,每个决策树使用自举的样本子集进行训练。这意味着对于每棵树而言,都有未参与训练的样本子集。这些样本被称为袋外(Out-of-Bag, OOB)样本。袋外样本可以用作测试集来评估随机森林的性能。

OOB 分数评估法可以作为交叉验证的替代方案。

设置参数 oob_score = True 可以计算 OOB 分

from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
iris = datasets.load_iris()
features = iris.data
target = iris.target

# 创建随机数分类器对象
randomforest = RandomForestClassifier(random_state=0, n_estimators=1000, 
                                        oob_score=True, n_jobs=-1)
                                        #设置参数 oob_score = True 可以计算 OOB 分
# 训练模型
model = randomforest.fit(features, target)
# 查看袋外误差
randomforest.oob_score_