机器学习之随机森林学习实践

目录

一、概念

二、随机森林所解决的问题

 三、随机森林常用库

四、 代码实现

1、随机森林分类

2、随机森林回归

3、代码可能出现的问题


一、概念

        随机森林是一种集成学习(ensemble learning)方法,用于解决分类和回归问题。它结合了多个决策树模型,通过投票或平均的方式来进行预测。

        随机森林的主要思想是通过构建多个决策树,每个决策树都是基于不同的随机样本和随机特征集来训练的。这种随机性的引入有助于减少过拟合的风险,并提高模型的泛化能力。

具体来说,随机森林的训练过程如下:

  1. 从原始训练数据集中有放回地抽取随机样本,形成一个新的训练数据集(bootstrap样本)。
  2. 针对每个bootstrap样本,随机选择一部分特征作为决策树的输入特征。
  3. 构建决策树模型,根据选定的特征和样本进行划分,直到达到预定的停止条件(如树的深度)。
  4. 重复步骤1-3,构建多个决策树模型。
  5. 对于分类问题,通过投票的方式,选择多数决策树的预测结果作为最终的预测结果。对于回归问题,通过平均多个决策树的预测结果来得到最终的预测值。

        随机森林具有很多优点,包括:

  • 能够处理高维数据和大规模数据集。
  • 对于离群值和噪声具有较好的鲁棒性。
  • 可以估计特征的重要性,用于特征选择。
  • 不需要对数据进行归一化或标准化。

二、随机森林所解决的问题

  1. 分类问题:随机森林可以用于解决二分类问题或多分类问题。它可以根据输入特征对数据进行分类,并输出相应的类别。

  2. 回归问题:随机森林可以用于解决回归问题。它可以根据输入特征预测输出的连续数值。

  3. 特征选择:随机森林可以用于选择最重要的特征。通过计算特征在随机森林中的重要性,可以确定哪些特征对于解决问题最为关键。

  4. 异常检测:随机森林可以用于检测异常数据点。通过比较数据点与随机森林的预测结果,可以判断数据点是否异常。

  5. 缺失值填充:随机森林可以用于填充缺失值。通过使用其他特征的值预测缺失值,可以将缺失值进行估计。

 三、随机森林常用库

  1. scikit-learn:scikit-learn是Python中最流行的机器学习库之一,提供了丰富的机器学习算法实现,包括随机森林。它提供了RandomForestClassifier和RandomForestRegressor类,可以用于分类和回归问题。

  2. XGBoost:XGBoost是一个优秀的梯度提升框架,也支持随机森林。它提供了XGBClassifier和XGBRegressor类,可以用于分类和回归问题,并且具有较高的性能和可扩展性。

  3. LightGBM:LightGBM是另一个高效的梯度提升框架,也支持随机森林。它提供了LGBMClassifier和LGBMRegressor类,可以用于分类和回归问题,并且具有较快的训练速度和较低的内存消耗。

  4. RandomForest4Life:RandomForest4Life是R语言中一个常用的随机森林库,提供了RandomForest和randomForestSRC等函数,可以用于分类和回归问题。

  5. H2O:H2O是一个分布式机器学习平台,支持多种机器学习算法,包括随机森林。它提供了H2ORandomForestEstimator类,可以用于分类和回归问题,并且具有分布式计算的能力。

四、 代码实现

1、随机森林分类

#生成分类示例数据

from sklearn.datasets import make_classification

X, y = make_classification(n_features = 2, n_informative = 2, n_redundant = 0, n_samples = 100, n_classes = 2, random_state = 0)
y[y == 0] = -1

'''二分类的数据集,n_features表示生成数据集的特征数量,n_informative表示有用特征的数量,n_redundant表示冗余特征的数量,n_samples表示生成的样本数量,n_classes表示类别的数量,random_state表示随机种子,用于保证每次生成的数据集相同。

在生成的数据集中,标签y中的0被替换为-1,这是为了方便后续使用某些分类算法。在二分类问题中,通常使用-1和1来表示两个类别。'''

#随机森林分类实现

import numpy as np
from sklearn.tree import DecisionTreeClassifier

class rfc:
    """
    随机森林分类器
    """
    #初始化方法,设置随机森林的大小和随机种子
    def __init__(self, n_estimators = 100, random_state = 0):
        # 随机森林的大小
        self.n_estimators = n_estimators
        # 随机森林的随机种子
        self.random_state = random_state
    
    #拟合方法,用于训练随机森林分类器。根据输入的特征矩阵X和标签y,生成决策树数组,并使用随机生成的权重拟合数据集。
    def fit(self, X, y):
        """
        随机森林分类器拟合
        """
        self.y_classes = np.unique(y)
        # 决策树数组
        dts = []
        n = X.shape[0]
        rs = np.random.RandomState(self.random_state)
        for i in range(self.n_estimators):
            # 创建决策树分类器
            dt = DecisionTreeClassifier(random_state=rs.randint(np.iinfo(np.int32).max), max_features = "auto")
            # 根据随机生成的权重,拟合数据集
            dt.fit(X, y, sample_weight=np.bincount(rs.randint(0, n, n), minlength = n))
            dts.append(dt)
        self.trees = dts
    #predict(self, X): 预测方法,用于对新的样本进行分类预测。遍历决策树数组,依次预测每个决策树的结果可能性,并取平均值作为最终预测结果。        
    def predict(self, X):
        """
        随机森林分类器预测
        """
        # 预测结果数组
        probas = np.zeros((X.shape[0], len(self.y_classes)))
        for i in range(self.n_estimators):
            # 决策树分类器
            dt = self.trees[i]
            # 依次预测结果可能性
            probas += dt.predict_proba(X)
        # 预测结果可能性取平均
        probas /= self.n_estimators
        # 返回预测结果
        return self.y_classes.take(np.argmax(probas, axis = 1), axis = 0)
#随机森林分类拟合

# 随机森林分类器
rf = rfc()
# 拟合数据集
rf.fit(X, y)

#随机森林分类可视化

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

%matplotlib notebook

plt.rcParams['font.sans-serif'] = ['simhei']  # 选择一个本地的支持中文的字体
fig, ax = plt.subplots()
ax.set_facecolor('#f8f9fa')

x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, .05), np.arange(y_min, y_max, .05))
Z = rf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
clist=['#ffadad', '#8ecae6']
newcmp = LinearSegmentedColormap.from_list('point_color', clist)
plt.pcolormesh(xx, yy, Z, cmap = newcmp)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())

x1 = X[y==-1][:, 0]
y1 = X[y==-1][:, 1]
x2 = X[y==1][:, 0]
y2 = X[y==1][:, 1]
p1 = plt.scatter(x1, y1, c='#e63946', marker='o', s=20)
p2 = plt.scatter(x2, y2, c='#457b9d', marker='x', s=20)

ax.set_title('随机森林分类', color='#264653')
ax.set_xlabel('X1', color='#264653')
ax.set_ylabel('X2', color='#264653')
ax.tick_params(labelcolor='#264653')
plt.legend([p1, p2], ["-1", "1"], loc="upper left")
plt.show()

 

2、随机森林回归

#生成回归示例数据集

from sklearn.datasets import make_regression

X, y = make_regression(n_features = 1, n_targets = 1, n_samples = 100, noise=5, random_state = 0)

#随机森林回归

import numpy as np
from sklearn.tree import DecisionTreeRegressor

class rfr:
    """
    随机森林回归器
    """
    
    def __init__(self, n_estimators = 100, random_state = 0):
        # 随机森林的大小
        self.n_estimators = n_estimators
        # 随机森林的随机种子
        self.random_state = random_state
        
    def fit(self, X, y):
        """
        随机森林回归器拟合
        """
        # 决策树数组
        dts = []
        n = X.shape[0]
        rs = np.random.RandomState(self.random_state)
        for i in range(self.n_estimators):
            # 创建决策树回归器
            dt = DecisionTreeRegressor(random_state=rs.randint(np.iinfo(np.int32).max), max_features = "auto")
            # 根据随机生成的权重,拟合数据集
            dt.fit(X, y, sample_weight=np.bincount(rs.randint(0, n, n), minlength = n))
            dts.append(dt)
        self.trees = dts
            
    def predict(self, X):
        """
        随机森林回归器预测
        """
        # 预测结果
        ys = np.zeros(X.shape[0])
        for i in range(self.n_estimators):
            # 决策树回归器
            dt = self.trees[i]
            # 依次预测结果
            ys += dt.predict(X)
        # 预测结果取平均
        ys /= self.n_estimators
        return ys
#随机森林回归拟合

# 随机森林回归器
rf = rfr()
# 拟合数据集
rf.fit(X, y)

#随机森林回归可视化

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

%matplotlib notebook

plt.rcParams['font.sans-serif'] = ['simhei']  # 选择一个电脑支持的中文的字体
fig, ax = plt.subplots()
ax.set_facecolor('#f8f9fa')

x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
xx = np.arange(x_min, x_max, .05)
yy = rf.predict(np.c_[xx.ravel()])

plt.scatter(X, y, c='#e63946', marker='o', s=20)
plt.plot(xx, yy)

ax.set_title('随机森林回归', color='#264653')
ax.set_xlabel('X', color='#264653')
ax.set_ylabel('Y', color='#264653')
ax.tick_params(labelcolor='#264653')
plt.show()

 

3、代码可能出现的问题

(1)汉化乱码

①如果出现可视化结果中的汉化问题,请修改途中标注红色部分,引号中表示.ttf字体文件名


②首先,从网上下载simhei.ttf文件


③将它放在C盘目录下的电脑字体文件夹中(C:\Windows\fonts)

(2)没有或正确安装代码所需要的库

①请从Anaconda文件夹中的Anaconda Prompt(anaconda3)命令符中输入

#先输入这个
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
#再输入这个
conda config --set show_channel_urls yes

#之后输入你想要安装的库的名称
conda install 库名

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

New_bie Set_sail

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值