随机森林,顾名思义,是利用随机的方式建立成的一个森林,该森林由很多决策树组成,并且决策树之间没有任何关联。是一种集成学习方法,应用广泛,效果极佳。
文章目录
- 随机森林
- 随机森林的定义
- 随机森林的建立过程
- 随机森林的优缺点
- 随机森林实战
- 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_)