随机森林(RF)

2024-08-20 06:25:19 浏览数 (2)

用途

分类或者预测。

思想

(1)每次有放回地从训练集中取出 n 个训练样本,组成新的训练集;

(2)利用新的训练集,训练得到M个子模型;

(3)对于分类问题,采用投票的方法,得票最多子模型的分类类别为最终的类别;对于回归问题,采用简单的平均方法得到预测值。

步骤

第一步:T中共有N个样本,有放回的随机选择N个样本。从N个训练用例(样本)中以有放回抽样的方式每次取一个,取样N次,形成一个训练集(即bootstrap取样:随机有放回的抽样)。这样原本样本中可能不会全部选到。如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,都是绝对“片面的”(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决。

这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。

第二步:当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。

第三步:决策树形成过程中每个节点都要按照步骤2来分裂,一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。

第四步:按照步骤1~3建立大量的决策树,这样就构成了随机森林了。

剪枝

剪枝则是为了增加模型的泛化能力,防止过拟合。

考虑决策树的复杂对,对已生成的决策树进行简化,简化的过程称为剪枝。一些简单的剪枝算法包括损失函数(loss function)、代价函数(cost function)等。

使用随机森林法(RF)计算各指标的权重,相关代码如下:

代码语言:python代码运行次数:0复制
# -*- coding:utf-8 -*-
# @author:Ye Zhoubing
# @datetime:2024/7/19 10:30
# @software: PyCharm
"""
随机森林法计算各指标权重
"""
# 利用sklearn库求各指标的权重
# 数据文件应该时纯数据,没有表头,表头在下面的df.columns处按列顺序定义
import pandas as pd
import numpy as np

url = 'test.xlsx'
df = pd.read_excel(url, header=None)

#定义各列数据的名称,按自己文件中列的顺序命名
df.columns = ['yiji', 'erji', 'sanji', 'siji', 'wuji', 'liuji', 'qiji',  'baji', 'jiuji']

df.info()#查看文件中数据类型

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
x, y = df.iloc[:, 0:].values, df.iloc[:, 0].values #0表示从第一列开始,即索引下标为0的列
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)
feat_labels = df.columns[0:]
forest = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)
forest.fit(x_train, y_train)
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1] #[::-1]表示将各指标按权重大小进行排序输出
for f in range(x_train.shape[1]):
    print("-) %-*s %f" % (f   1, 30, feat_labels[indices[f]], importances[indices[f]]))

示例文件test.xlsx文件如下:

文件下载

0 人点赞