📅  最后修改于: 2020-09-28 06:30:38             🧑  作者: Mango
随机森林是一种流行的机器学习算法,属于监督学习技术。它可以用于ML中的分类和回归问题。它基于集成学习的概念,集成学习是组合多个分类器以解决复杂问题并提高模型性能的过程。
顾名思义,“ Random Forest是一种分类器,它在给定数据集的各个子集上包含许多决策树,并取其平均值以提高该数据集的预测准确性。”随机森林不依赖一棵决策树,而是根据预测的多数票从每一棵树获取预测,并预测最终输出。
森林中树木的数量越多,精度越高,并可以防止过拟合的问题。
下图说明了随机森林算法的工作原理:
注意:为了更好地理解随机森林算法,您应该了解决策树算法。
由于随机森林组合了多棵树来预测数据集的类别,因此某些决策树可能会预测正确的输出,而其他决策树可能不会。但是所有的树一起预测正确的输出。因此,以下是两个更好的随机森林分类器的假设:
以下几点解释了为什么我们应该使用随机森林算法:
随机森林分两个阶段进行工作,首先是通过组合N个决策树来创建随机森林,其次是对在第一阶段中创建的每个树进行预测。
可以在以下步骤和图中说明工作过程:
步骤1:从训练集中选择随机的K个数据点。
步骤2:构建与所选数据点(子集)关联的决策树。
步骤3:为要构建的决策树选择编号N。
步骤4:重复步骤1和2。
步骤5:对于新数据点,找到每个决策树的预测,然后将新数据点分配给赢得多数票的类别。
下面的示例可以更好地理解算法的工作原理:
示例:假设有一个包含多个水果图像的数据集。因此,将此数据集提供给随机森林分类器。数据集分为子集,并分配给每个决策树。在训练阶段,每个决策树都会产生预测结果,并且当出现新数据点时,然后基于大多数结果,随机森林分类器会预测最终决策。考虑下图:
主要在以下四个领域中使用随机森林:
现在,我们将使用Python实现随机森林算法树。为此,我们将使用与先前分类模型相同的数据集“ user_data.csv”。通过使用相同的数据集,我们可以将“随机森林”分类器与其他分类模型(如决策树分类器,KNN,SVM,逻辑回归等)进行比较。
实施步骤如下:
以下是预处理步骤的代码:
# 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)
在上面的代码中,我们已经对数据进行了预处理。加载数据集的位置,其表示为:
现在,我们将随机森林算法适合训练集。为了适应它,我们将从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)
在上面的代码中,分类器对象采用以下参数:
输出:
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)
由于我们的模型适合训练集,因此现在我们可以预测测试结果了。为了进行预测,我们将创建一个新的预测向量y_pred。下面是它的代码:
#Predicting the test set result
y_pred= classifier.predict(x_test)
输出:
预测向量为:
通过检查上述预测向量和测试集实向量,我们可以确定分类器所做的错误预测。
现在,我们将创建混淆矩阵,以确定正确和不正确的预测。下面是它的代码:
#Creating the Confusion matrix
from sklearn.metrics import confusion_matrix
cm= confusion_matrix(y_test, y_pred)
输出:
正如我们在上面的矩阵中看到的那样,有4 + 4 = 8个错误的预测和64 + 28 = 92个正确的预测。
在这里,我们将可视化训练集结果。为了可视化训练集结果,我们将为随机森林分类器绘制一个图形。分类器将为购买或未购买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棵树,这些树预测“已购买”变量的“是”或“否”。分类器采用了大多数预测并提供了结果。
现在我们将可视化测试集结果。下面是它的代码:
#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),而不会出现过度拟合问题。通过更改分类器中的树数,我们将获得不同的结果。