随机森林,顾名思义,是利用随机的方式建立成的一个森林,该森林由很多决策树组成,并且决策树之间没有任何关联。是一种集成学习方法,应用广泛,效果极佳。


文章目录

  • 随机森林
  • 随机森林的定义
  • 随机森林的建立过程
  • 随机森林的优缺点
  • 随机森林实战
  • Sklearn随机森林API
  • 实战


随机森林

随机森林的定义

定义:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
举个例子,比如现在训练了10棵决策树,其中8棵树的结果是True,2棵树是False,那么最终结果会是True,因为在10棵树中True的占比大。

随机森林的建立过程

  • 假如有N个样本,M个特征。则有放回的随机选择N个样本(每次随机选择一个样本,然后返回继续选择)。这选择好了的N个样本用来训练一个决策树。同理在选择N个样本训练第二课决策树,以此类推。
  • 在训练过程中,随机从这M个属性中选取出m个属性,满足条件m << M。
  • 按照以上步骤建立大量的决策树,这样就构成了随机森林了。建立的随机森林中,每一棵决策树的建立都是一个随机过程,即它们的样本和特征大多不一样。

为什么要随机抽样训练集?
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的。
为什么要有放回地抽样?
如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对“片面的”。也就是说学习器之间的相似性小,投票结果差,模型偏差大。

随机森林的优缺点

优点

  • 在所有的算法中,具有极好的准确率
  • 能够有效的运行在大数据集上
  • 能够处理具有高维特征的输入样本,而且不需要降维
  • 能够评估各个特征在分类问题上的重要性
  • 算法稳定,即使数据集中出现了一个新的数据点,整个算法也不会受到过多影响,它只会影响到一颗决策树,很难对所有决策树产生影响。

缺点

  • 比决策树算法更复杂,计算成本更高。
  • 由于其本身的复杂性,它们比其他类似的算法需要更多的时间来训练。

随机森林实战

Sklearn随机森林API

sklearn.ensemble.RandomForestClassifier(
n_estimators=10, 
criterion=’gini’, 
max_depth=None, 
min_samples_split=2, 
min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_features=’auto’,
 max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None,
bootstrap=True, 
oob_score=False,
 n_jobs=1, 
verbose=0, 
warm_start=False, 
class_weight=None)

重要参数意义
n_estimators : integer, optional (default=10):随机森林中树的个数,即学习器的个数。
max_depth:树的最大深度
max_features : (default=”auto”):每棵决策树的最大特征数量。

  • If “auto”, then max_features=sqrt(n_features)。
  • If “sqrt”, then max_features=sqrt(n_features) (same as “auto”)。
  • If “log2”, then max_features=log2(n_features)。

bootstrap : boolean, optional (default=True) 自助采样,又放回的采样,大量采样的结果就是初始样本的63.2%作为训练集。默认选择自助采样法。
min_samples_split : (default=2) 最小样本划分的数目,就是样本的数目少于等于这个值,就不能继续划分当前节点了
min_samples_leaf : int, float, optional (default=1) 叶子节点最少样本数,如果某叶子节点数目这个值,就会和兄弟节点一起被剪枝。
min_weight_fraction_leaf:叶子节点最小的样本权重和
max_leaf_nodes: (default=None)
最大叶子节点数,默认是”None”,即不限制最大的叶子节点数
min_impurity_split:节点划分的最小不纯度,是结束树增长的一个阈值,如果不纯度超过这个阈值,那么该节点就会继续划分,否则不划分,成为一个叶子节点。
min_impurity_decrease : float, optional (default=0.) 最小不纯度减少的阈值,如果对该节点进行划分,使得不纯度的减少大于等于这个值,那么该节点就会划分,否则,不划分。

实战

泰坦尼克号数据为例。
1、调库

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier#随机森林
from sklearn.model_selection import GridSearchCV#网格搜索

2、数据处理

data = pd.read_csv("Titanic.csv")
#挑选Pclass、Age、Sex作为特征
x = data[['Pclass','Sex','Age']]
#选择Survived作为目标值
y = data['Survived']
#填补缺失值
x['Age'].fillna(x['Age'].mean(),inplace=True)#inplace=True认为进行了替换,否则替换失败
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
dic =DictVectorizer(sparse=False)#将稀疏数组转化为array
x_train = dic.fit_transform(x_train.to_dict(orient="records"))#x_train.to_dict(orient="records")将dataframe转化为字典
x_test = dic.transform(x_test.to_dict(orient="records"))
print(dic.get_feature_names())

3、随机森林分类

rf = RandomForestClassifier()
param = {"n_estimators":[10,50,100,200,300,400],"max_depth":[2,4,6,10,30]}#RandomForestClassifier中的n_estimators分别设置为10,50,100,200,300,400,max_depth分别设置为2,4,6,10,30,在其中寻优
gc = GridSearchCV(rf, param_grid=param,cv=2)#为了加快速度,让cv=2
gc.fit(x_train,y_train)
print("准确率:",gc.score(x_test,y_test))
print("查看选择的参数模型:",gc.best_params_)

spark ml 随机森林 随机森林实例_子节点