随机森林(Random Forest)入门与实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sb19931201/article/details/52601058

随机森林(Random Forest)入门与实战

前言

集成学习(ensemble learning)是通过构建并结合多个学习器来完成学习任务,主要包含两类,一是个体学习器间存在强依赖关系、必须串行生成的序列化方法,比如前几篇博文介绍提升学习方法提升树GBDT 详解xgboost等,主要思想是boosting迭代将弱学习器提升为强学习器;二是个体学习器之间不存在强依赖关系、可同时生成的并行化方法,该类的代表是bagging和随机森林。

Bagging


想要得到泛化能力强的集成,集成中的个体学习应该尽可能的相互独立,所以设法是的基学习器尽可能的具有较大的差异。给定一个训练数据集将其随机抽样成n份子样本集,然后每个子集训练得出一个个体学习器,这样得到的基学习器就会有比较大的差异,从而获得好的集成;但是因为每个基学习器只用了一小部分的数据,这不能保证个体学习器的学习的有效性,因此,为了解决这个问题可以考虑使用相互有交叠的采样子集。

Bagging就是采用这种思想,对于给定的m个样本数据集,先随机取出一个样本放入采样集,再把这部分样本放回初始数据集,使得下次采样时该样本仍然有可能被选中,这样经过m次随机采样操作得到含m个样本的采样集。初始训练集中的样本有的在采样集中多次出现,有的则未出现。这样经过T轮,我们可以得到T个含m个训练样本的采样集,基于每个采样集训练得到一个基学习器,然后再将这些基学习器进行结合。在对预测值输出结合的时候,Bagging通常对分类问题使用简单投票法,对回归问题使用简单平均法。

随机森林


随机森林是Bagging的一个拓展变体,RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。传统决策树在选择划分属性时是在当前结点的属性集合(假定d个属性)中选择一个最优属性;而在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则决策树的构建与传统决策树相同;若令k=1,则是随机选择一个属性用于划分,一般情况下k=log2(d)。
随机森林对Bagging只做了小改动,但是与Bagging中基学习器的“多样性”—仅通过样本扰动不同,随机森林还加入了随机属性扰动,这是的最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。
随机森林的收敛性与Bagging相似(如下图),随机森林的起始性能相对较差,特别是只包含一个基学习器的时候(因为通过引入属性扰动,随机森林中个体学习器的性能往往有所降低,然而随着个体学习器数目的增加随机森林通常会收敛到更低的泛化误差)。此外,随机森林的训练效率往往优于Bagging(决策树生成划分属性时只需要考察一个属性子集)。

结合策略



1.平均法 :对数字型输出通常用平均法(averaging)
(1)简单平均法

(2)加权平均法


2.投票法:对分类任务来说,每个学习器预测出一个标记,然后采用投票法(voting)得出最终结果
(1)绝对多数投票法

即若某标记得票过半,则预测为该标记,否则就拒绝预测
(2)相对多数投票法

即预测为得票最多的标记,若同时有多个标记获最高票,则从中随机选取一个。
(3)加权投票法


3.学习法:当训练数据很多时,通过另外一个学习器进行结合—Stacking。Stacking先从初始数据集训练出初级学习器,然后生成一个新数据集用于训练次级学习器,在这个新数据集中,初级学习器的输出被当做样例输入特征,而初始样本的标记仍被当做样例标记。算法流程如下图所示,这里假定初级学习器使用不同学习算法产生,及初级集成是异质的。

在训练阶段,次级训练集是利用初级学习器产生的,若直接用初级学习器的训练集来产生次级训练集,则过拟合风险会比较大;因此一般采用交叉验证或留一法这样的方式,用训练初级学习器未使用的样本来产生次级学习器的训练样本。

Random Forest实战


实战数据还是用的kaggle上的Classify handwritten digits using the famous MNIST data,数据集介绍见我上一篇博文 xgboost入门与实战(实战调参篇),或者直接看官方赛题
kaggle的Kernels上已经有很多的解题方案(直接能看代码,有的还有思路介绍)论文,这对新手来说真的是个绝佳的学习去处!
说明一下:以下代码参考自其中一个用Random Forest解题的选手: Alexander Zerbe

完整代码:

# -*- coding: utf-8 -*-
"""
Created on Tue Sep 20 21:34:34 2016

@author: 我曾经被山河大海跨过
"""
# Imports
import pandas as pd # load csv's (pd.read_csv)
import numpy as np # math (lin. algebra)

import sklearn as skl # machine learning
from sklearn.ensemble import RandomForestClassifier

# Visualisation
import matplotlib.pyplot as plt # plot the data
import seaborn as sns # data visualisation
sns.set(color_codes=True)
#% matplotlib inline

# load data as Pandas.DataFrame
train_df = pd.read_csv('input/train.csv')
train_data = train_df.values

test_df = pd.read_csv('input/test.csv')
test_data = test_df.values

plt.figure(figsize=(12,8))
sns.countplot(x='label', data=train_df)
plt.title('Distribution of Numbers')
plt.xlabel('Numbers');

# Holdout ( 2/3 to 1/3 )
num_features = train_data.shape[0] # number of features
print("Number of all features: \t\t", num_features)
split = int(num_features * 2/3)

train = train_data[:split]
test = train_data[split:]

print("Number of features used for training: \t", len(train), 
      "\nNumber of features used for testing: \t", len(test))

# Classifier
clf = RandomForestClassifier(n_estimators=100) # 100 trees

# train model / ravel to flatten the array structure from [[]] to []
model = clf.fit(train[:,1:], train[:,0].ravel())

# evaluate on testdata
output = model.predict(test[:,1:])

# calculate accuracy
acc = np.mean(output == test[:,0].ravel()) * 100 # calculate accuracy
print("The accuracy of the pure RandomForest classifier is: \t", acc, "%")

# Classifier
clf = RandomForestClassifier(n_estimators=100) # 100 trees

# train model / ravel to flatten the array structure from [[]] to []
target = train_data[:,0].ravel()
train = train_data[:,1:]
model = clf.fit(train, target)

# modify the test_data, so the number of attributes match with the training data (missing label column)

# evaluate on testdata
output = model.predict(test_data)

pd.DataFrame({"ImageId": range(1, len(output)+1), "Label": output}).to_csv('out.csv', index=False, header=True)

结果:

此处先留个坑。。。不同版本的运行结果我会陆续贴出来。

版本1:
这里写图片描述

成绩稍微比之前xgboost的结果差一些。

这里写图片描述
.
.
.


.
.
.

猜你喜欢

转载自blog.csdn.net/sb19931201/article/details/52601058