随机森林分类器详解及代码实现

class sklearn.ensemble.RandomForestClassifier(n_estimators='100', criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='sqrt', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, cpp_alpha=0.0, max_samples=None)

随机森林是非常具有代表性的Bagging集成算法,它的所有基评估器都是决策树,分类树组成的森林就叫做随机森林分类器,回归树所集成的森林就叫做随机森林回归器。

单个决策树的准确率越高,随机森林的准确率也会越高,因为装袋法是依赖于平均值或者少数服从多数原则来决定集成的结果的。

重要参数

控制基评估器的参数

参数含义
criterion不纯度的衡量指标,有基尼系数和信息熵两种选择
max_depth树的最大深度,超过最大深度的树枝都会被剪掉
min_samples_leaf一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生
min_samples_split一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生
max_featuresmax_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方取整
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生

n_estimators

n_estimators是森林中树木的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是任何模型都有决策边界,n_estimators达到一定程度时,随机森林的精确性往往不再上升或开始浮动。且n_estimators越大,需要的计算量和内存也越大,训练的时间也越长。对于此参数,希望在训练难度和模型效果之间取得平衡。

上代码

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score

wine = load_wine()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)

# 实例化 
clf = DecisionTreeClassifier(random_state=0)  # 决策树
rfc = RandomForestClassifier(random_state=0)  # 随机森林

# 将训练集带入实例化后的模型训练
clf = clf.fit(Xtrain, Ytrain) 
rfc = rfc.fit(Xtrain, Ytrain) 


# 将预测集导入训练好的模型,获取希望获取的结果(score, y_test)

score_c = clf.score(Xtest, Ytest)
score_r = rfc.score(Xtest, Ytest)
print("Single Tree:{}".format(score_c), 
    "Random Forest:{}".format(score_r))


# # 显示随机森林中每棵树的信息
# # 每棵树的信息只有random_state不同
# print(rfc.estimators_)
#
# # 获取第一棵树的相关参数信息
# print(rfc.estimators_[0].random_state)
# print(rfc.estimators_[0].max_depth)
# # 获取所有树的random_state信息
# # 由于数据类型的原因只能用for循环获取
# for i in range(len(rfc.estimators_)):
#     print(rfc.estimators_[i].random_state)
# 获取每个特征的重要程度
print(rfc.feature_importances_)

为了验证模型的稳定性,可以使用交叉验证来完成

from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc, wine.data, wine.target, cv=10)  # 十折交叉验证

clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf, wine.data, wine.target, cv=10)
plt.plot(range(1, 11), rfc_s, label="RandomForest")
plt.plot(range(1, 11), clf_s , label="DecisionTree")
plt.legend()
plt.show()
画出随机森林与决策树在十组交叉验证下的效果对比
rf = []
cl = []
for i in range(10):
    print(i)
    rfc = RandomForestClassifier(n_estimators=25)
    rfc_s = cross_val_score(rfc, X, y, cv=10).mean()

    rf.append(rfc_s)
    clf = DecisionTreeClassifier()
    clf_s = cross_val_score(clf, X, y, cv=10).mean()

    cl.append(clf_s)
plt.plot(range(1, 11), rf, label='RandomForest')
plt.plot(range(1, 11), cl, label='DecisionTree')
plt.legend()
plt.show()
画出n_estimators的学习曲线,选取最佳的n_estimators取值
superpa = []
for i in range(200):
    print(i)
    rfc = RandomForestClassifier(n_estimators=i+1, n_jobs=-1)
    rfc_s = cross_val_score(rfc, X, y, cv=10).mean()
    superpa.append(rfc_s)
# list.index(object) # 对象object在list当中的索引
print(max(superpa), superpa.index(max(superpa))+1)
plt.figure(figsize=[20, 5])
plt.plot(range(1, 201), superpa)
plt.show()

由于随机森林的本质是一种装袋集成算法(bagging),袋装集成算法是对基评估器的预测结果进行平均或多数表决原则来决定集成评估的结果。上述的红酒例子中,建立了25棵树,当且仅当有13棵以上的树判断错误的时候,随机森林才有可能判错。故随机森林会比决策树效果好。

随机森林的random_state参数控制的是生成森林的模式,而非让一个森林中只有一颗树。

bootstrap参数默认True,代表采用这种有放回的随机抽样技术。通常,这个参数不会被我们设置为False.

有放回的随机抽样技术会有这样的问题:一些样本可能在同一个自助集中出现多次,而有的却可能被忽略。一般来说,自主集大约平均会包含63%的原始数据,而有约37%的训练数据被浪费掉,没有参与建模,这些数据被称为袋外数据(out of bag data, oob)。故除了最开始划分好测试集外,这些数据也可被用来作为集成算法的测试集。

即,通常情况来说,使用随机森林时,可以不划分训练集和测试集,只需要用袋外数据来测试模型。如果希望用袋外数据来测试,需要在实例化时将oob_score这个参数调整为True,训练结束后可以用oob_score_查看在袋外数据上测试的结果。

rfc = RandomForestClassifier(n_estimators=25, oob_score=True)
rfc = rfc.fit(X, y)
print(rfc.oob_score_)

  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义随机森林分类器是一种使用自定义参数和设置的随机森林模型,可以根据具体需求进行调整。在随机森林分类器中,可以通过设置random_state来控制生成森林的模式。与分类树中不同的是,随机森林中的random_state不仅控制生成棵树的随机性,还控制每棵树的随机性。这样可以确保生成的森林中每棵树都是不一样的,并且每棵树中的特征选择也是随机的。 通过自定义随机森林分类器,可以灵活地调整一些重要的属性,比如n_estimators参数控制森林中树的数量,可以根据需求增加或减少树的数量来提高模型的准确性。另外,还可以通过调整其他参数,如max_depth和min_samples_split等,来控制每棵树的生长方式和分割节点的规则,从而进一步提高模型性能。 总结起来,自定义随机森林分类器可以通过设置和调整不同的参数,来满足不同的需求并提高模型的表现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [随机森林分类器详解代码实现](https://blog.csdn.net/ThePaK/article/details/125060704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [随机森林分类器](https://blog.csdn.net/m0_50572604/article/details/120832299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值