📜  机器学习-随机森林算法

📅  最后修改于: 2020-09-28 06:30:38             🧑  作者: Mango

随机森林算法

随机森林是一种流行的机器学习算法,属于监督学习技术。它可以用于ML中的分类和回归问题。它基于集成学习的概念,集成学习是组合多个分类器以解决复杂问题并提高模型性能的过程。

顾名思义,“ Random Forest是一种分类器,它在给定数据集的各个子集上包含许多决策树,并取其平均值以提高该数据集的预测准确性。”随机森林不依赖一棵决策树,而是根据预测的多数票从每一棵树获取预测,并预测最终输出。

森林中树木的数量越多,精度越高,并可以防止过拟合的问题。

下图说明了随机森林算法的工作原理:


注意:为了更好地理解随机森林算法,您应该了解决策树算法。

随机森林的假设

由于随机森林组合了多棵树来预测数据集的类别,因此某些决策树可能会预测正确的输出,而其他决策树可能不会。但是所有的树一起预测正确的输出。因此,以下是两个更好的随机森林分类器的假设:

  • 数据集的特征变量中应该有一些实际值,以便分类器可以预测准确的结果,而不是猜测的结果。
  • 每棵树的预测必须具有非常低的相关性。

为什么要使用随机森林?

以下几点解释了为什么我们应该使用随机森林算法:

  • 与其他算法相比,它需要更少的训练时间。
  • 即使对于大型数据集,它也可以高效地预测输出结果。
  • 当丢失大量数据时,它还可以保持准确性。
  •  

随机森林算法如何工作?

随机森林分两个阶段进行工作,首先是通过组合N个决策树来创建随机森林,其次是对在第一阶段中创建的每个树进行预测。

可以在以下步骤和图中说明工作过程:

步骤1:从训练集中选择随机的K个数据点。

步骤2:构建与所选数据点(子集)关联的决策树。

步骤3:为要构建的决策树选择编号N。

步骤4:重复步骤1和2。

步骤5:对于新数据点,找到每个决策树的预测,然后将新数据点分配给赢得多数票的类别。

下面的示例可以更好地理解算法的工作原理:

示例:假设有一个包含多个水果图像的数据集。因此,将此数据集提供给随机森林分类器。数据集分为子集,并分配给每个决策树。在训练阶段,每个决策树都会产生预测结果,并且当出现新数据点时,然后基于大多数结果,随机森林分类器会预测最终决策。考虑下图:

随机森林的应用

主要在以下四个领域中使用随机森林:

  • 银行业:银行业通常使用此算法来识别贷款风险。
  • 医学:借助该算法,可以识别疾病趋势和疾病风险。
  • 土地利用:我们可以通过此算法识别相似土地利用的区域。
  • 市场营销:可以使用此算法确定市场趋势。

随机森林的优势

  • 随机森林能够执行分类和回归任务。
  • 它能够处理具有高维的大型数据集。
  • 它提高了模型的准确性,并防止了过拟合的问题。

随机森林的缺点

  • 尽管随机森林可用于分类和回归任务,但它并不更适合于回归任务。

随机森林算法的Python实现

现在,我们将使用Python实现随机森林算法树。为此,我们将使用与先前分类模型相同的数据集“ user_data.csv”。通过使用相同的数据集,我们可以将“随机森林”分类器与其他分类模型(如决策树分类器,KNN,SVM,逻辑回归等)进行比较。

实施步骤如下:

  • 数据预处理步骤
  • 使随机森林算法适合训练集
  • 预测测试结果
  • 测试结果的准确性(创建混淆矩阵)
  • 可视化测试集结果。

1.数据预处理步骤:

以下是预处理步骤的代码:

# importing libraries
import numpy as nm
import matplotlib.pyplot as mtp
import pandas as pd

#importing datasets
data_set= pd.read_csv('user_data.csv')

#Extracting Independent and dependent Variable
x= data_set.iloc[:, [2,3]].values
y= data_set.iloc[:, 4].values

# Splitting the dataset into training and test set.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0)

#feature Scaling
from sklearn.preprocessing import StandardScaler  
st_x= StandardScaler()  
x_train= st_x.fit_transform(x_train)  
x_test= st_x.transform(x_test)  

在上面的代码中,我们已经对数据进行了预处理。加载数据集的位置,其表示为:

2.使随机森林算法适合训练集:

现在,我们将随机森林算法适合训练集。为了适应它,我们将从sklearn.ensemble库中导入RandomForestClassifier类。代码如下:

#Fitting Decision Tree classifier to the training set
from sklearn.ensemble import RandomForestClassifier
classifier= RandomForestClassifier(n_estimators= 10, criterion="entropy")
classifier.fit(x_train, y_train)

在上面的代码中,分类器对象采用以下参数:

  • n_estimators =随机森林中所需的树木数量。默认值为10。我们可以选择任何数字,但需要注意过拟合的问题。
  • standard =是分析拆分准确性的函数 。在这里,我们采用“熵”来获取信息。

输出:

RandomForestClassifier(bootstrap=True, class_weight=None, criterion='entropy',
                       max_depth=None, max_features='auto', max_leaf_nodes=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=1, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, n_estimators=10,
                       n_jobs=None, oob_score=False, random_state=None,
                       verbose=0, warm_start=False)

3.预测测试集结果

由于我们的模型适合训练集,因此现在我们可以预测测试结果了。为了进行预测,我们将创建一个新的预测向量y_pred。下面是它的代码:

#Predicting the test set result
y_pred= classifier.predict(x_test)

输出:

预测向量为:

通过检查上述预测向量和测试集实向量,我们可以确定分类器所做的错误预测。

4.创建混淆矩阵

现在,我们将创建混淆矩阵,以确定正确和不正确的预测。下面是它的代码:

#Creating the Confusion matrix
from sklearn.metrics import confusion_matrix
cm= confusion_matrix(y_test, y_pred)

输出:

正如我们在上面的矩阵中看到的那样,有4 + 4 = 8个错误的预测和64 + 28 = 92个正确的预测。

5.可视化培训设置结果

在这里,我们将可视化训练集结果。为了可视化训练集结果,我们将为随机森林分类器绘制一个图形。分类器将为购买或未购买SUV汽车的用户预测是或否,就像我们在Logistic回归中所做的那样。下面是它的代码:

from matplotlib.colors import ListedColormap
x_set, y_set = x_train, y_train
x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step  =0.01),
nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01))
mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape),
alpha = 0.75, cmap = ListedColormap(('purple','green' )))
mtp.xlim(x1.min(), x1.max())
mtp.ylim(x2.min(), x2.max())
for i, j in enumerate(nm.unique(y_set)):
    mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1],
        c = ListedColormap(('purple', 'green'))(i), label = j)
mtp.title('Random Forest Algorithm (Training set)')
mtp.xlabel('Age')
mtp.ylabel('Estimated Salary')
mtp.legend()
mtp.show()

输出:

上图是随机森林分类器与训练集结果一起使用的可视化结果。它与决策树分类器非常相似。每个数据点对应于user_data的每个用户,紫色和绿色区域是预测区域。紫色区域是针对未购买SUV汽车的用户而分类的,绿色区域是针对已购买SUV汽车的用户的分类。

因此,在“随机森林”分类器中,我们采用了10棵树,这些树预测“已购买”变量的“是”或“否”。分类器采用了大多数预测并提供了结果。

6.可视化测试设置结果

现在我们将可视化测试集结果。下面是它的代码:

#Visulaizing the test set result
from matplotlib.colors import ListedColormap
x_set, y_set = x_test, y_test
x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step  =0.01),
nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01))
mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape),
alpha = 0.75, cmap = ListedColormap(('purple','green' )))
mtp.xlim(x1.min(), x1.max())
mtp.ylim(x2.min(), x2.max())
for i, j in enumerate(nm.unique(y_set)):
    mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1],
        c = ListedColormap(('purple', 'green'))(i), label = j)
mtp.title('Random Forest Algorithm(Test set)')
mtp.xlabel('Age')
mtp.ylabel('Estimated Salary')
mtp.legend()
mtp.show()

输出:

上图是测试集的可视化结果。我们可以检查是否存在最少数量的错误预测(8),而不会出现过度拟合问题。通过更改分类器中的树数,我们将获得不同的结果。