在集成算法这一章中,我们大概的阐述了一下常用的两种集成算法,这里我们就具体研究一下
b
a
g
g
i
n
g
bagging
bagging 算法中最常用的模型:随机森林。
由前面我们了解:
b
a
g
g
i
n
g
bagging
bagging + 决策树 = 随机森林,所以在学习随机森林之前,我们必须了解决策树相关的知识,这些我在ID3,C4.5,CART中已经比较详细的讲过一遍,这里就不在赘述了,有不懂的童鞋可以去前面看看。
算法思想
随机森林是集成学习的一个子类,它依靠于决策树的投票选择来决定最后的分类结果,通俗的讲,随机森林就是用随机的方式建立一个森林,森林由许多决策树组成,而且每一棵决策树相互之间是没有关联的。得到森林后,当有一个新的样本进入森林后,就让森林中的每一个决策树分别进行判断,看看这个样本属于哪一个类,最终哪一个类最多,就预测这个样本属于哪一个类。
算法流程
1. 从样本集中有放回的随机选取n个样本
2. 如果每个样本的特征维度为
m
m
m,指定一个常数
n
<
<
m
n<<m
n<<m,随机地从
m
m
m 个特征中选取
n
n
n 个特征子集,再对子样本进行完全分裂的方式建立决策树(也可以是其他类型的分类器,比如
S
V
M
SVM
SVM、
L
o
g
i
s
t
i
c
s
Logistics
Logistics)。
3. 重复上述步骤
n
n
n 次,即建立了
n
n
n 棵决策树。
4. 将
n
n
n 棵决策树形成随机森林,通过投票表决结果,最终决定数据属于哪一类。
这种算法得到随机森林中的每一棵决策树都是很弱的,但是将他们组合起来就很厉害。这里有个形象的比喻:每一个决策树都是一个精通某领域的专家,这样在随机森林中就有很多歌精通不同领域的专家,对于一个新问题,最终是由多个专家投票的结果。
特点
随机森林优点:
1. 在当前所有算法中,具有极好的准确率
2. 能处理高维特征,不容易产生过拟合,模型训练速度比较快,而且不需要降维
3. 既能处理离散型数据,也能处理连续型数据,数据集无需规范化
4. 对于缺省值问题也能够获得很好得结果
随机森林缺点:
1. 当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
2. 随机森林在解决回归问题时并没有像它在分类中表现的那么好,不能够作出超越训练集数据范围的预测,这可能导致在对某些还有特定噪声的数据进行建模时出现过度拟合
3. 随机森林模型还有许多不好解释的地方,有点算是黑盒模型
代码分析
from sklearn.ensemble import RandomForestClassifier # 分类
# from sklearn.ensemble import RandomForestRegressor # 回归
from sklearn.model_selection import train_test_split
from sklearn import datasets
iris = datasets.load_iris() # 加载iris数据集
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
clf = RandomForestClassifier(n_estimators=10, max_features=3)
clf.fit(X_train, y_train) # 建模
ans = clf.predict(X_test) # 预测 # 计算准确率
cnt = 0
for i in range(len(y_test)):
if ans[i] - y_test[i] < 1e-1:
cnt += 1
print("准确率: ", (cnt * 100.0 / len(y_test)),"%")
使用上述方法时要调整的参数主要是
n_estimators
{\text{n\_estimators }}
n_estimators 和
max_features
{\text{max\_features }}
max_features 。
n_estimators
{\text{n\_estimators }}
n_estimators 是森林里树的数量,通常数量越大,效果越好,但是计算时间也会随之增加。 此外要注意,当树的数量超过一个临界值之后,算法的效果并不会很显著地变好。
max_features
{\text{max\_features }}
max_features 是分割节点时考虑的特征的随机子集的大小。 这个值越低,方差减小得越多,但是偏差的增大也越多。 根据经验,回归问题中使用
max_features
=
n_features
{\text{max\_features }} = {\text{n\_features }}
max_features =n_features , 分类问题使用
max_features
=
s
q
r
t
(
n_features
)
{\text{max\_features }} = sqrt(\text{n\_features })
max_features =sqrt(n_features )其中
n_features
{\text{n\_features }}
n_features 是特征的个数, 这是比较好的默认值。
max_depth
=
N
o
n
e
{\text{max\_depth }} = None
max_depth =None 和
min_samples_split
=
2
{\text{min\_samples\_split }} = 2
min_samples_split =2 结合通常会有不错的效果(即生成完全的树)。 但请记住,这些默认值通常不是最佳的,同时还可能消耗大量的内存,最佳参数值应由交叉验证获得。 另外,请注意,在随机森林中,默认使用自助采样法(
b
o
o
t
s
t
r
a
p
=
T
r
u
e
bootstrap = True
bootstrap=True),当使用自助采样法方法抽样时,泛化精度是可以通过剩余的或者袋外的样本来估算的,设置
oob_score
=
T
r
u
e
{\text{oob\_score }} = True
oob_score =True 即可实现。
总结
随机森林用随机的方式建立一个森林,森林里面有很多的决策树组成,能够执行回归和分类的任务,它将几个低效模型整合为一个高效模型。主要解决了决策树泛化能力弱的缺点。同时,随机森林也实现了数据降维,是处理缺失值、异常值或其他数据的重要手段,并取得了不错成效。随机森林是人工智能之机器学习中最近比较火的算法,具有准确度高、抗噪声强、速度快、并行化、适用广等优点,在实际应用中,随机森林算法性能表现得非常强大和实用,因此在业界受到高度关注和欢迎。