有趣且强大的随机森林

机器学习 专栏收录该内容
3 篇文章 0 订阅

集成算法

集成算法通过构建多个弱学习器并结合来完成学习任务,那么就用随机森林来举例子,随机森林是由很多个决策树来形成的,这些决策树都是弱学习器,在二分类中弱学习器就是精确度比50%大一点点的分类器。

决策树1
决策树2
决策树3
结合模块
输出

一般的随机森林中决策树一般是100棵。

结合策略

投票法(随机森林分类)

假如现在有一个二分类的问题,有100棵决策树,那么假如70棵决策树认为这个样本属于A类,30棵决策树认为这个样本属于B类,那么该随机森林的输出就会认为这个样本属于A类,这就是投票法的少数服从多数。

平均法(随机森林回归)

假如现在有一个回归类问题,那么100棵决策树就会有100个输出,但是随机森林最后的输出只能是一个,因此我们可以采取平均的办法。

简单平均法

就是简单地把每个决策树的结果加起来除以决策树的数量。
y = ∑ i = 1 n y i n y = \frac{\sum_{i=1}^ny_i}{n} y=ni=1nyi

加权平均法

通过对每个决策树赋予权重,然后让每个决策树的输出乘以权重再相加就能够得到随机森林的输出了。
y = ∑ i = 1 n w i y i y = \sum_{i=1}^nw_iy_i y=i=1nwiyi
通常要求 w i ≥ 0 w_i\geq0 wi0, ∑ i = 1 n w i = 1 \sum_{i=1}^nw_i=1 i=1nwi=1;

sklearn中的随机森林建模流程

from sklearn.ensemble import RandomForestClassifier   #导入随机森林模块

clf = RandomForestClassifier()                        #实例化一个模型
model = clf.fit(x,y)                                  #训练实例化的这个模型
print(clf.score(xtest,ytest))                         #使用.score接口输出测试集得分

随机森林重要参数

参数含义
n_estimators随机森林中树的数量
criterion不纯度衡量指标:‘gini’:基尼系数 ,‘entropy’:信息熵
max_depth限制树的最大深度(防止过拟合重要参数)
min_samples_leaf一个节点分支后的每个子节点至少包含多少个训练样本,否则不会发生分支
min_samples_split一个节点包含至少多少个训练样本,这个节点才会被允许分支
max_features分支时考虑的特征个数
min_impurity_decrease每一个分支需要提高的信息增益的大小是多少
bootstrap默认:‘True’,代表采用有放回的抽样技术。一般不选择’False’
oob_score因为随机森林是一种袋装法的集成算法,如果希望用袋外数据来测试随机森林的结果,则需要在实例化的时候将此参数设置为True,训练完毕后,我们可以用随机森林的一个重要属性:oob_score_来查看我们的袋外数据的测试结果

随机森林的重要属性

属性含义
.estimators_查看随机森林中所有树的样子
.oob_score_查看袋外数据的得分
.feature_importances_查看各个特征对模型的重要性

随机森林的重要接口

接口含义
.apply返回每个测试样本所在的叶子节点的索引
.score返回模型的得分(默认返回的是 R 2 R^2 R2)
.fit训练
.predict预测
.predict_proba返回每个测试样本对应被分到每一类标签的概率,标签有几个就会返回几个概率

随机森林要点掌握

  1. 每个弱学习器必须是相互独立的
  2. 每个弱学习器的判断准确率必须超过50%

实例

导入数据

from sklearn.datasets import load_wine                     #导入sklearn自带红酒数据集
wine = load_wine()   #实例化红酒数据集
#因为数据是用字典保存的因此可以采用.键的模式取出数据
x = wine.data        #特征矩阵
y = wine.target      #标签(三分类)

数据分布

from sklearn.datasets import load_wine                     #导入sklearn自带红酒数据集
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
wine = load_wine()   #实例化红酒数据集
#因为数据是用字典保存的因此可以采用.键的模式取出数据
x = wine.data        #特征矩阵
y = wine.target      #标签(三分类)

pca = PCA(n_components=2)    #主成分分析将特征矩阵降成二维
x_dr = pca.fit_transform(x)  #导出降维后的矩阵
print(pca.explained_variance_ratio_.sum())   #导出可解释性方差

plt.figure()
plt.scatter(x_dr[y==0,0],x_dr[y==0,1],label=wine.target_names[0])
plt.scatter(x_dr[y==1,0],x_dr[y==1,1],label=wine.target_names[1])
plt.scatter(x_dr[y==2,0],x_dr[y==2,1],label=wine.target_names[2])
plt.legend()
plt.show()

在这里插入图片描述
然后我们发现第0类跟1、2重叠的区域比较少容易分开,但是1类和2类混杂的地方比较多不容易分开,下面将介绍随机森林分类模型的建立。

建立随机森林分类模型

from sklearn.datasets import load_wine                     #导入sklearn自带红酒数据集
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
wine = load_wine()   #实例化红酒数据集
#因为数据是用字典保存的因此可以采用.键的模式取出数据
x = wine.data        #特征矩阵
y = wine.target      #标签(三分类)
#建立随机森林分类模型
#将数据集分成训练集70%,测试集30%
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3)

rfc = RandomForestClassifier()   #实例化随机森林分类模型
model = rfc.fit(xtrain,ytrain)   #训练随机森林分类模型
print('训练集得分:',rfc.score(xtrain,ytrain))
print('测试集得分:',rfc.score(xtest,ytest))

结果:
在这里插入图片描述
可以看出来结果比较好,虽然第1类和第2类有这么多重叠的地方随机森林也有这么好的效果,可以发现随机森林是一个非常强大的算法。

随机森林和决策树的对比

from sklearn.datasets import load_wine                     #导入sklearn自带红酒数据集
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
wine = load_wine()   #实例化红酒数据集
#因为数据是用字典保存的因此可以采用.键的模式取出数据
x = wine.data        #特征矩阵
y = wine.target      #标签(三分类)
#建立随机森林分类模型
#将数据集分成训练集70%,测试集30%
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3)

rfc = RandomForestClassifier()   #实例化随机森林分类模型
model = rfc.fit(xtrain,ytrain)   #训练随机森林分类模型
print('训练集得分:',rfc.score(xtrain,ytrain))
print('测试集得分:',rfc.score(xtest,ytest))

#建立决策树模型
clf = DecisionTreeClassifier()   #实例化决策树模型
clf1 = clf.fit(xtrain,ytrain)   #训练数据
print('训练集得分:',clf.score(xtrain,ytrain))
print('测试集得分:',clf.score(xtest,ytest))

结果:在这里插入图片描述
我们不给决策树模型和随机森林模型设置参数,可以看出随机森林的测试集得分比决策树测试集得分高了0.13,因此可以看出来随机森林和单棵决策树的差距。

混淆矩阵

from sklearn.metrics import confusion_matrix   #导入混淆矩阵
print('决策树模型测试集的混淆矩阵:',confusion_matrix(ytest,clf.predict(xtest)))
print('随机森林模型测试集的混淆矩阵:',confusion_matrix(ytest,rfc.predict(xtest)))

混淆矩阵:
在这里插入图片描述
这是一个二分类的混淆矩阵,混淆矩阵的对角线就是分类正确的样本,FP就是本来就反例的样本被分为了正例,FN就是本来是正例被分为了反例。(混淆矩阵以后会详细讲一章,这儿不细讲)
决策树分类的混淆矩阵:
在这里插入图片描述
随机森林分类的混淆矩阵:
在这里插入图片描述
从混淆矩阵也可以明显看出随机森林模型的分类能力强于决策树的分类能力。

代码整合

from sklearn.datasets import load_wine                     #导入sklearn自带红酒数据集
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.decomposition import PCA
from sklearn.metrics import confusion_matrix   #导入混淆矩阵
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

wine = load_wine()   #实例化红酒数据集
#因为数据是用字典保存的因此可以采用.键的模式取出数据
x = wine.data        #特征矩阵
y = wine.target      #标签(三分类)

#建立随机森林分类模型
#将数据集分成训练集70%,测试集30%
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3)

rfc = RandomForestClassifier()   #实例化随机森林分类模型
model = rfc.fit(xtrain,ytrain)   #训练随机森林分类模型
print('训练集得分:',rfc.score(xtrain,ytrain))
print('测试集得分:',rfc.score(xtest,ytest))

#建立决策树模型
clf = DecisionTreeClassifier()   #实例化决策树模型
clf1 = clf.fit(xtrain,ytrain)   #训练数据
print('训练集得分:',clf.score(xtrain,ytrain))
print('测试集得分:',clf.score(xtest,ytest))


pca = PCA(n_components=2)    #主成分分析将特征矩阵降成二维
x_dr = pca.fit_transform(x)  #导出降维后的矩阵
print(pca.explained_variance_ratio_.sum())   #导出可解释性方差

#创建混淆矩阵
print('决策树模型测试集的混淆矩阵:',confusion_matrix(ytest,clf.predict(xtest)))
print('随机森林模型测试集的混淆矩阵:',confusion_matrix(ytest,rfc.predict(xtest)))

plt.figure()
plt.scatter(x_dr[y==0,0],x_dr[y==0,1],label=wine.target_names[0])
plt.scatter(x_dr[y==1,0],x_dr[y==1,1],label=wine.target_names[1])
plt.scatter(x_dr[y==2,0],x_dr[y==2,1],label=wine.target_names[2])
plt.legend()
plt.show()

总结

欢迎大家指出其中的问题,能够让我更好的去完善。
请大家尊重劳动结果,本博客不允许转载!!!

  • 3
    点赞
  • 3
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

想要逆袭的废物

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值