随机森林
说明
随机森林是对决策树集合的特有名称。
随机森林里我们有多个决策树(所以叫"森林")。
传统决策树很容易受到个别异常数据的影响构造出奇怪的树,为了避免这种情况,我们假设有100条数据,其中有2条数据异常。
生成决策树:
- 如果训练集中有 N 种类别,则有重复地随机选取 N 个样本。这些样本将组成培养决策树的训练集。
- 如果有 M 个特征变量,那么选取数
m << M
,从而在每个节点上随机选取 m 个特征变量来分割该节点。m 在整个森林养成中保持不变。 - 每个决策树都最大程度上进行分割,没有剪枝。
- 对于分类问题:每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。对于这2条数据异常所在的决策树会给出错误结果,正常数据会给出正确的结果,少数服从多数,最终分类正确。
- 对于回归问题:每一个决策树都会给出一个结果,随机森林对不同树取平均。对于这2条数据异常所在的决策树会给出偏差较大的结果,正常数据会给出偏差较小的结果,取平均之后,最终偏差较小。
from sklearn.ensemble import RandomForestClassifier
import numpy as np
# 创建一些示例数据
X = np.array([[1, 2], [2, 3], [2, 5], [3, 2], [3, 3], [4, 5]]) # 特征
y = np.array([0, 0, 1, 0, 1, 1]) # 目标标签
# 创建随机森林分类器
'''
一般来说,深度越大,拟合效果越好,速度越慢,常用的可以取值10到100之间。
'''
n_estimators = 100 # 设置随机森林中的树的数量
model = RandomForestClassifier(n_estimators=n_estimators)
# 拟合模型
model.fit(X, y)
# 预测新数据点
new_data_point = np.array([[3, 4]]) # 要预测的新数据点
predicted_class = model.predict(new_data_point)
print("预测类别:", predicted_class)
示例
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.ensemble import RandomForestClassifier
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import log_loss
# 随机数种子设为0,前面有讲过,这样可以保证每次运行结果都一样
np.random.seed(0)
# 随机生成1000个样本,每个样本包含2个特征,共4个簇
X, y = make_blobs(n_samples=1000, random_state=42, cluster_std=5.0)
# 用前800个样本作为训练集,并且这800个样本中,前600个样本作为训练集,后200个样本用来矫正
X_train, y_train = X[:600], y[:600]
X_valid, y_valid = X[600:800], y[600:800]
# 直接选取前800个样本作为训练集
X_train_valid, y_train_valid = X[:800], y[:800]
# 用前800个样本作为训练+验证集,剩下的200个样本作为测试集
X_test, y_test = X[800:], y[800:]
# 树的数量为25
clf = RandomForestClassifier(n_estimators=25)
# 直接使用前80%的数据训练模型
clf.fit(X_train_valid, y_train_valid)
# 后20%的数据测试,
clf_probs = clf.predict_proba(X_test)
# 用log_loss来评估模型
score = log_loss(y_test, clf_probs)
print(" %.3f " % score)
# 这个分类器对所有800个训练数据点都进行了训练,那么它对它的预测过于自信,导致了过拟合
# 接下来需要矫正这个分类器,让它对自己的预测不那么自信
# 修正前的误差达到了1.3 修正后的数据误差降到了 0.534
优化
假设100个数据训练的决策树准确率不高,将100组数据分出10组训练10组决策树,将10组决策树组合成一个森林,将新数据放入其中算出10组结果,若是回归问题,则将10组数据的值进行求平均值;若是分类问题,则将10组结果计算哪种结果的概率高,则就是该结果。
残差方法:
训练好一个随机森林模型,将一部分模型特征数据获取一个值,将这个值与原本真实的值有一个误差,用这个误差与原本的模型特征数据进行训练一个新的随机森林。将新数据放入这个残差随机森林与原本的随机森林求出这两个部分的值进行相加。得到一个误差很小的值。