机器学习的世界正在不断进步,而且速度很快。因此,每个 AI 爱好者都必须跟上机器学习方法提出的解决方案的数量。直到今天,机器学习工程师已经为回归和分类问题提出了许多方法。其中一种方法称为随机森林。
随机森林基本上是一种有监督的机器学习算法,用于解决分类和回归问题。在某种程度上,随机森林是众所周知的决策树算法的扩展,也用于回归和分类。
如何实现随机森林分类算法?要广泛了解随机森林算法,我们首先必须了解监督学习的基础知识,并且必须了解分类和回归之间的区别。这将帮助你了解随机森林算法的基本思想及其工作原理。
我们还将使用用于实现目的的 Sklearn 库来查看用于分类和回归问题的算法的 Python 实现。展示分类和回归的原因是为了帮助你理解为什么随机森林更适合用于分类而不是回归,包括详细的随机森林分类算法实现示例。
因此,这个随机森林分类算法教程分为以下几个部分:
- 监督学习与无监督学习
- 分类与回归
- 随机森林算法
- 决策树是如何工作的?
- Sklearn的基本介绍
- Sklearn中用于分类的随机森林
- Sklearn 中用于回归的随机森林
- 结论
监督学习与无监督学习
监督学习和无监督学习是两种主要且最常采用的机器学习方法。
在监督学习的情况下,机器学习模型提供了一个数据集,其中包含训练示例的特征和输出标签或值。这种方法的目的是使底层算法能够“学习”一个假设函数,以给出给定输入特征的输出。这是通过使用损失函数来完成的,该函数使用提供的输出标签和估计的标签来优化假设函数。
该算法旨在最小化损失函数并根据输入数据给出输出标签的最佳近似值。你可以通过一个简单的例子来理解这一点。假设我们为算法提供了猫的图片,每张图片都有相应的标签“猫”,我们还为算法提供了狗的图片,每张图片都有相应的标签“狗”。
现在我们将在这些数据上训练我们的机器学习模型,以便将来当模型遇到猫的图片时,它会给出输出标签“猫”而不是“狗”。
与监督学习不同,无监督学习是可用数据集没有标签的方法。留给模型自己寻找数据中的共性。
未标记数据的可用性比标记数据更丰富。该方法的主要目标是发现所提供数据集中的隐藏模式。交易数据通常使用无监督学习方法来解决和评估。假设你有一个庞大的客户数据集以及他们从你的商店购买的商品。
对于人类来说,从数据中提取有意义的模式是非常不可能的。无监督学习算法可以以有助于你的商店和销售的方式构建数据。它可以决定哪个年龄段的男性和女性最有可能购买什么样的产品等等。
无需标签,无监督学习方法可以处理看似无关的复杂数据,并输出可能有意义的模式。
![来源:https://vrzkj25a871bpq7t1ugcgmn9-wpengine.netdna-ssl.com/wp-content/uploads/2021/04/supervised-vs-unsupervised-learning_FEATURED-IMAGE.png](https://livecodestream.dev/post/a-deep-dive-into-random-forest-classification-algorithm/svsus_hu324e3ffc5942af4498f9472530b90a9a_48942_700x0_resize_q90_h2_lanczos_3.webp)
随机森林分类算法教程:分类与回归
回归和分类都是监督学习算法,用于机器学习中的预测分析。分类和回归之间的主要区别在于分类算法用于对离散值进行分类,而回归算法用于预测连续值和/或数据。
回归基本上是找到自变量和因变量之间的相关性。它用于预测连续值,例如,预测房价、市场趋势等。
它计算将输入变量映射到连续输出的映射函数。在这里,我们尝试拟合最佳拟合线,或最佳拟合函数,它可以准确地预测输出。
回归既可以是线性回归,也可以是非线性回归。在线性回归中,我们尝试在可用数据集上拟合最佳拟合线,而在非线性回归中,我们尝试将非线性函数拟合到数据,它可以是任意度数的曲线。
分类是计算假设函数的方法,该函数能够根据输入特征将数据集划分为多个离散类。
分类模型将输入数据分类为它所训练的各种类别之一。最简单的分类示例是预测模型的输入图像是否是猫的图像。模型应该为猫提供 1,为非猫提供 0。分类模型将输入变量映射到离散输出变量或类别。
分类模型试图找到有效地将数据集分成不同类别的决策边界。分类可以是二进制的,我们只在两个输入类之间进行分类,也可以是多类的,其中有两个以上的目标类。
![分类与回归](https://livecodestream.dev/post/a-deep-dive-into-random-forest-classification-algorithm/cvsr_hu2fa4145deac3340afc1be34a8c116efa_16152_700x0_resize_q90_h2_lanczos_3.webp)
随机森林算法
如何实现随机森林分类算法?如前所述,随机森林算法是一种机器学习技术,用于解决分类和回归问题。随机森林算法中使用的主要技术是所谓的集成学习。集成学习技术有助于解决一些极其复杂的问题。
集成学习是指在某种组合中使用多个分类或回归模型来实现特定输出。事实证明,这种方法比使用单个分类器更有效,并且能够处理更复杂的问题,从而提高模型的性能。
随机森林,顾名思义,是几个决策树的集合,每个决策树都应用于原始数据集的一个子集。然后使用多数投票来使用所有决策树的输出输出一个最可能的预测。
更多的树导致更高的准确性,同时防止过度拟合的问题。随机森林算法具有以下特征:
- 无需使用超参数调整即可获得合理的预测。
- 过拟合的问题得到了有效的处理。
- 与其他算法相比,训练随机森林所需的时间更少。
- 即使是大型数据集也能得到有效处理并能准确执行。
- 丢失的数据也由随机森林自己处理。
要了解随机森林算法的完整工作原理,我们首先需要了解决策树如何围绕数据集工作。
随机森林分类算法教程:决策树是如何工作的?
决策树构成了随机森林的构建块。它们是机器学习中最流行的分类技术工具之一。它具有树状结构,其中树内的每个节点表示对数据输入属性的特定测试。从节点出现的每个分支代表测试的结果。
决策树通常从单个节点开始。第一个节点根据在节点上执行的测试输出几个分支。每个结果或分支通向另一个节点,该节点沿途输出其他分支。这就是使算法具有树状结构的原因。节点分为两类:即决策节点和叶节点。决策节点的任务是评估输入数据并根据对数据的特定测试做出决策,而叶节点代表树的结果。
![决策树](https://livecodestream.dev/post/a-deep-dive-into-random-forest-classification-algorithm/ctree_hu453f769a4862b561fa39dd19981744b3_7967_700x0_resize_q90_h2_lanczos_3.webp)
决策树的实现基于如何为根节点和其他决策节点决定最佳属性。决定这一点的技术称为属性选择度量或 ASM。ASM 有两种最流行的方法:
- 信息增益
- 基尼系数
信息增益测量基于单个属性的数据集中熵的变化。它基本上决定了一个属性拥有多少关于特定类的信息。根据这个信息增益值,我们对树的节点进行分裂。
Information Gain= Entropy(S)- [(Weighted Avg) * Entropy (each feature)]
哪里S
是样本总数。
Entropy (S) = - [P(a) x log2 P(a)] - [P(b) x log2 P(b)]
这里P(a)
和P(b)
分别表示 classa
和 class的概率b
。
基尼指数基本上衡量创建决策树时使用的纯度或杂质。与基尼系数高的属性相比,基尼系数较低的属性是首选。基尼指数计算如下:
Gini index = 1 - Σj (Pj)2
![决策树示例(https://www.javatpoint.com/machine-learning-decision-tree-classification-algorithm)](https://livecodestream.dev/post/a-deep-dive-into-random-forest-classification-algorithm/dtreeexample_hu6cb3af21b72e83d3aa8d734854bef8e2_9991_700x0_resize_q90_h2_lanczos_3.webp)
决策树和随机森林算法最大和最基本的区别是根节点和分离节点的建立是随机进行的随机森林。它涉及使用不同的数据样本,而不是使用单个大样本。决策树输出不同的叶节点类,然后对输出进行排序。选择排名最高的作为最终输出。
![随机森林分类器](https://livecodestream.dev/post/a-deep-dive-into-random-forest-classification-algorithm/rf-classifier_hu071b652f7d309dd5b8e24e94d2c86ded_46927_700x0_resize_q90_h2_lanczos_3.webp)
尽管如此,尽管随机森林可用于分类和回归任务,但与其他回归模型相比,它们在回归任务中的执行效率不高,也不受欢迎。使用随机森林的分类和回归模型都可以使用 Sklearn 在 Python 中实现。
Sklearn的基本介绍
Sklearn 的 Scikit-Learn 是 Python 中使用最广泛、最强大的开源机器学习库。
它为机器学习模型的开发提供了大量预定义的工具和模块,包括分类、回归和支持向量机等监督学习方法,以及因子分析、主成分分析(PCA)等无监督学习方法,以及与其他几种用于处理数据的工具一起进行聚类。它还提供了用于对开发的机器学习模型进行后评估的功能和模块。
在使用 Scikit-Learn 继续使用 Python 实现随机森林之前,我们必须安装 Scikit-Learn 库:
使用pip命令,安装如下:
pip install -U scikit-learn
使用 conda 环境,安装使用:
conda install scikit-learn
随机森林分类算法实现示例:Sklearn中用于分类的随机森林
现在让我们看一下以分类为目的的随机森林算法的实现。为简单起见,我们将使用 Sklearn 库中已有的数据集,称为数字数据。
该数据包含多个带有手写数字及其相应标签的图像。我们的任务是开发一个分类器,通过查看数字的输入图像来预测手写数字。
虽然我们在文章中提供了完整的代码和解释,但你也可以在此处访问 Google Colab 上的此部分的代码 。
如何实现随机森林分类算法?我们首先导入代码所需的模块。
# Importing the libraries
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, plot_confusion_matrix
from sklearn.datasets import load_digits
matplotlib 库有助于可视化基于图像的数据。我们从 Sklearn 导入的所有其他工具都用于模型开发和拟合。train_test_split 模块将整个数据集分成两个子集,一个用于训练目的,另一个用于测试。
它还在拆分之前对数据进行混洗以提高性能。StandardScaler 类用于数据的预处理。它为不同的预处理技术提供了多个模块。RandomForestClassifier 类提供了用于开发随机森林分类模型的工具。
我们可以使用多个指标来评估模型。我们将使用准确性和混淆矩阵进行评估。你还可以选择其他评估指标,例如精度、召回率、F1 分数和曲线下面积 (AUC) 分数。load_digits 提供了从 Sklearn 数据集集合中加载数字数据集的模块。
# Importing the dataset
dataset = load_digits()
在这里,我们加载数字数据集。该数据集包含手写数字的图像以及与图像对应的目标标签。
# Vizualizing the Dataset
_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))
for ax, image, label in zip(axes, dataset.images, dataset.target):
ax.set_axis_off()
ax.imshow(image, cmap=plt.cm.gray_r)
ax.set_title("Training: %i" % label)
我们通过使用具有一行和 4 列的 matplotlib 库创建一个绘图来可视化数据,这意味着我们将能够在一行中显示 4 个图像。for 循环使用轴变量遍历数据集,并显示数据集的前四个条目及其标签。图像显示为灰度图像。
![示例图像](https://livecodestream.dev/post/a-deep-dive-into-random-forest-classification-algorithm/sample-image_hu738015b9382ef0b955eeaf499726eb92_3034_700x0_resize_q90_h2_lanczos_3.webp)
# Unpacking the data into X(input) and Y(target output)
n_samples = len(dataset.images)
X = dataset.images.reshape((n_samples, -1))
Y = dataset.target
现在我们从数据集变量中解包数据并将其存储到两个变量中:即 X 和 Y,其中 X 指的是输入图像,Y 包含相应的目标标签。
# Splitting the dataset into the Training set and Test set
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25)
# Feature Scaling
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
现在,我们在开发模型之前对数据进行预处理。我们首先将整个数据分成两个子集,即训练数据和测试数据。
测试数据大小的概率为 0.25,这意味着整个数据的 25% 将保存到测试集,而其余的将放入训练集。之后,我们使用标准缩放器类来转换训练数据。
如何实现随机森林分类算法?该fit_transform()
函数使用整个训练数据集的均值和标准差对整个数据进行归一化。为确保测试数据比训练数据更难,但仍与开发的模型一致,我们transform()
对测试集使用该函数。该函数对与训练数据具有相同均值和标准差的测试数据进行变换,而无需再次计算测试数据的均值和标准差。
# Fitting Random Forest Classification to the Training set
classifier = RandomForestClassifier(n_estimators = 10, criterion = 'entropy')
classifier.fit(X_train, y_train)
# Predicting the Test set results
y_pred = classifier.predict(X_test)
# Computing Accuracy
accuracy = accuracy_score(y_test, y_pred)
然后我们最终创建了随机森林模型。在RandomForestClassifier
类用于创建模型的实例。
该n_estimators
参数设置为等于用于创建随机森林的决策树的数量,我们将决策树计算的标准设置为熵。它也可以设置为基尼系数。
然后我们将训练数据拟合到模型中,以便模型对其进行训练并创建我们可以测试模型的最终架构。然后我们使用测试集中的图像来输出模型的预测。
然后将这些预测与测试数据的实际目标标签进行比较,并计算准确度。
print("Accuracy of model: ", accuracy)
plot_confusion_matrix(classifier,X_test,y_test,cmap='Blues',display_labels=dataset.target_names)
plt.tight_layout()
plt.show()
最后,我们显示模型的准确率和混淆矩阵。
![重整矩阵](https://livecodestream.dev/post/a-deep-dive-into-random-forest-classification-algorithm/confusion-matrix_hucf8f78d25fe44d92b03f309e94a905ad_16932_700x0_resize_q90_h2_lanczos_3.webp)
正如我们所看到的,随机森林分类器在没有任何超参数调整的情况下提供了 93% 的良好准确率。
Sklearn 中用于回归的随机森林
随机森林分类算法教程:回归模型的代码与分类代码没有太大区别。唯一的区别是我们将使用来自 Sklearn 集合的另一个数据集,称为糖尿病数据集。
此外,由于这是一个回归任务,我们不能将准确性用作评估指标,因此我们将使用 R2 分数作为我们的评估指标,并且我们将使用随机森林回归器而不是随机森林分类器。
由于数据集有多个输入属性,因此我们无法为每个属性绘制数据以进行可视化。因此,为了可视化,我们将仅使用第一个属性来绘制数据。
随机森林分类算法实现示例:和以前一样,你可以按照这里的代码,也可以使用代码访问谷歌Colab笔记本本节在这里 。
# Importing the libraries
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_diabetes
# Importing the dataset
X, Y = load_diabetes(return_X_y=True)
# Plotting the data
plt.scatter(X[:,0], Y)
plt.title("Targets corresponding to a single attribute of X")
![深入研究随机森林分类算法:详细教程](https://livecodestream.dev/post/a-deep-dive-into-random-forest-classification-algorithm/targets_hu595afa325d87e00128b18c367582eae4_18953_700x0_resize_q90_h2_lanczos_3.webp)
# Splitting the dataset into the Training set and Test set
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25)
# Fitting Random Forest Classification to the Training set
regressor = RandomForestRegressor(n_estimators=100)
regressor.fit(X_train, y_train)
# Predicting the Test set results
y_pred = regressor.predict(X_test)
# Computing Accuracy
r2 = r2_score(y_test, y_pred)
print("R2 score of model: ", r2)
如何实现随机森林分类算法?从上面的代码可以明显看出,唯一的变化是上面提出的那些。我还注意到,在回归的情况下,标准缩放器的使用并没有真正提高模型的性能,所以我们可以忽略这些数据。R2 分数计算为 0.4396,这对于回归模型来说是一个非常低的分数。
R2 分数越接近 1,模型的性能越好。这也证明了将随机森林用于回归目的的缺点。
随机森林分类算法教程结论
就分类方法而言,随机森林算法是解决机器学习问题最强大的算法之一。将随机森林用于分类目的是有效的。
然而,回归相关的任务通常不会使用随机森林算法来解决,因为它不能有效地执行基于回归的任务。总的来说,与决策树算法以外的其他机器学习分类技术相比,随机森林算法提供了更好的计算能力和速度,因为它比随机森林更简单。