声明:本文是站在回归分析角度讲的,分类的理解可能跟这有点不一样。
1.前言
随机森林也是集成方法的一种,是对Bagging算法的改进。
随机森林主要有两步组成:
1)有放回的随机抽取样本数据,形成新的样本集。这部分和Bagging算法一样,但是有两点需要注意:
a)新的样本集的大小和原始样本集的大小是一样的。假如原始样本有1000个数据,那么新样本集也要包括1000个数据,只是新样本集里面会含有部分重复的数据,这样可以避免过度拟合的问题。
b)每生成一个决策树,都需要重新对原始数据进行取样。假如进行k次训练(即生成k课树),那么就需要重复k次这个动作
2)无放回的随机抽取属性列。假如有12个属性(即12列),从这12个属性列中随机抽取无重复的n列(一般建议是总属性的1/3)进行运算。每次训练都需要重新抽取
2.算法实现思路
该算法的核心就是如何实现上述两个步骤,过程如下:
1)有放回的随机抽取样本数据
a)定义一个需要抽取的数据的索引列表
b)使用随机函数随机生成和数据集同样大小的数值填充到索引列表中
c)对数据索引列表排序
d)抽取包含在索引列表中的数据重新组成样本集,并抽取对应的标签值组成标签集
2)无放回的随机抽取属性列
a)定义一个需要抽取的属性的索引列表
b)使用随机函数随机生成和属性数量同样大小的数值填充到索引列表中
c)对属性索引列表排序
d)抽取包含在属性索引列表中的属性重新组成属性集
3)从新的样本集中按照新的属性集抽取样本数据集及标签值,然后进行分析
3.实现过程
实验数据还是使用分析红酒口感时使用的数据。原始数据来源
1)划分数据。
把数据划分成训练集和测试集,并把数据和标签拆分开。这里多说一点,在进行分析时,一定要把数据分成训练集和测试集,不能在训练集上训练出模型后,然后再用训练集得出的预测值用于后续分析。因为刚开始的时候对随机森林的理解有点偏差,所以没有划分训练集和测试集,结果反应均方误差随模型个数变化的曲线一直是波浪线。
import numpy as np
import matplotlib.pyplot as plt
import os
from sklearn.tree import DecisionTreeRegressor
import random
##运行脚本所在目录
base_dir=os.getcwd()
data=np.loadtxt(base_dir+r"\wine.txt",delimiter=";")
dataLen = len(data) ##矩阵的长度:行数
dataWid = len(data[0]) ##矩阵的宽度:列数
'''
第一步:划分训练集和测试集
'''
##测试集大小:这里选择30%作为测试集,70%作为训练集
nSample = int(dataLen * 0.30)
##在0~dataLen直接随机生成nSample个点
idxTest = random.sample(range(dataLen), nSample)
idxTest.sort()
#定义训练集和测试集标签
xTrain = [] #训练集
xTest = [] #测试集
yTrain &#