个性化阅读
专注于IT技术分析

了解Python中的随机森林分类器

本文概述

随机森林是一种监督学习算法。它可以用于分类和回归。它也是最灵活和易于使用的算法。森林由树木组成。据说树木越多, 森林就越健壮。随机森林在随机选择的数据样本上创建决策树, 从每个树中获取预测并通过投票选择最佳解决方案。它还提供了功能重要性的很好指示。

随机森林具有各种应用程序, 例如推荐引擎, 图像分类和特征选择。它可用于对忠实的贷款申请人进行分类, 识别欺诈活动并预测疾病。它位于Boruta算法的基础上, 该算法选择数据集中的重要特征。

在本教程中, 你将学习以下所有内容:

  • 随机森林算法
  • 分类器如何工作?
  • 其优缺点
  • 寻找重要特征
  • 随机森林和决策树之间的比较
  • 使用scikit-learn构建分类器
  • 使用scikit-learn查找重要功能

如果你还不熟悉机器学习中的基于树的模型, 则应该看看我们关于该主题的R课程。

随机森林算法

让我们以外行的术语来理解算法。假设你想旅行, 并且想去一个可以享受的地方。

那么, 你如何找到自己想要的地方?你可以在线搜索, 在旅行博客和门户网站上阅读评论, 也可以问朋友。

假设你决定问问你的朋友, 并与他们讨论他们过去在各个地方的旅行经历。你会从每个朋友那里得到一些建议。现在, 你必须列出这些推荐地点。然后, 你要求他们从你推荐的地点列表中投票(或为旅行选择一个最佳地点)。票数最高的地方将是你这次旅行的最终选择。

在上述决策过程中, 分为两个部分。首先, 向你的朋友询问他们的个人旅行经历, 并从他们访问过的多个地方中获得一项推荐。这部分就像使用决策树算法。在这里, 每个朋友都选择了他或她到目前为止访问过的地方。

在收集所有建议之后, 第二部分是投票程序, 用于在建议列表中选择最佳位置。从朋友那里获得推荐并对其进行投票以找到最佳地点的整个过程称为随机森林算法。

从技术上讲, 它是在随机拆分的数据集上生成的决策树的整体方法(基于分治法)。决策树分类器的这种集合也称为森林。使用属性选择指示符(例如, 每个属性的信息增益, 增益比和Gini索引)生成各个决策树。每棵树取决于一个独立的随机样本。在分类问题中, 每棵树投票, 并选择最受欢迎的类别作为最终结果。在回归的情况下, 所有树输出的平均值被视为最终结果。与其他非线性分类算法相比, 它更简单, 功能更强大。

该算法如何工作?

它分四个步骤工作:

  1. 从给定的数据集中选择随机样本。
  2. 为每个样本构造一个决策树, 并从每个决策树中获得预测结果。
  3. 对每个预测结果进行投票。
  4. 选择投票最多的预测结果作为最终预测。
表决

优点

  • 由于参与该过程的决策树数量众多, 因此随机森林被认为是一种高度准确且健壮的方法。
  • 它不会遭受过度拟合的问题。主要原因是它采用了所有预测的平均值, 从而消除了偏差。
  • 该算法可用于分类和回归问题。
  • 随机森林也可以处理缺失值。处理这些问题的方法有两种:使用中位数替换连续变量, 以及计算缺失值的近似加权平均值。
  • 你可以获得相对特征的重要性, 这有助于为分类器选择最有帮助的特征。

缺点

  • 随机森林具有多个决策树, 因此生成预测的速度较慢。每当做出预测时, 森林中的所有树木都必须针对相同的给定输入做出预测, 然后对其进行投票。这整个过程很耗时。
  • 与决策树相比, 该模型难以解释, 在决策树中, 你可以通过遵循树中的路径轻松地做出决策。

寻找重要特征

随机森林还提供了良好的特征选择指标。 Scikit-learn为模型提供了一个额外的变量, 该变量显示了预测中每个功能的相对重要性或贡献。它会在训练阶段自动计算每个功能的相关性得分。然后将相关性按比例缩小, 以使所有分数的总和为1。

该分数将帮助你选择最重要的功能, 而放弃最不重要的功能以进行模型构建。

随机森林使用基尼重要性或杂质平均减少量(MDI)来计算每个特征的重要性。基尼重要性也被称为节点杂质的总减少。这是删除变量时模型拟合或准确性降低的程度。减小幅度越大, 变量越显着。在此, 平均下降是变量选择的重要参数。基尼系数可以描述变量的整体解释能力。

随机森林与决策树

  • 随机森林是一组多个决策树。
  • 深度决策树可能会过度拟合, 但是随机森林通过在随机子集上创建树来防止过度拟合。
  • 决策树的计算速度更快。
  • 随机森林很难解释, 而决策树则易于解释并且可以转换为规则。

使用Scikit学习构建分类器

你将在鸢尾花数据集上建立模型, 这是一个非常著名的分类集。它包括萼片长度, 萼片宽度, 花瓣长度, 花瓣宽度和花的类型。共有三个物种或类别:濑户, 杂色和弗吉尼亚州。你将建立一个模型来对花的类型进行分类。数据集可在scikit-learn库中找到, 或者你可以从UCI机器学习存储库中下载。

首先从scikit-learn导入数据集库, 然后使用load_iris()加载iris数据集。

#Import scikit-learn dataset library
from sklearn import datasets

#Load dataset
iris = datasets.load_iris()

你可以打印目标名称和特征名称, 以确保你拥有正确的数据集, 例如:

# print the label species(setosa, versicolor, virginica)
print(iris.target_names)

# print the names of the four features
print(iris.feature_names)
['setosa' 'versicolor' 'virginica']
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

经常浏览一下数据是个好主意, 这样你就知道自己在使用什么。在这里, 你可以看到打印了数据集的前五行, 以及整个数据集的目标变量。

# print the iris data (top 5 records)
print(iris.data[0:5])

# print the iris labels (0:setosa, 1:versicolor, 2:virginica)
print(iris.target)
[[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]

在这里, 你可以通过以下方式创建虹膜数据集的DataFrame。

# Creating a DataFrame of given iris dataset.
import pandas as pd
data=pd.DataFrame({
    'sepal length':iris.data[:, 0], 'sepal width':iris.data[:, 1], 'petal length':iris.data[:, 2], 'petal width':iris.data[:, 3], 'species':iris.target
})
data.head()
花瓣长度 花瓣宽度 萼片长度 萼片宽度 种类
0 1.4 0.2 5.1 3.5 0
1 1.4 0.2 4.9 3.0 0
2 1.3 0.2 4.7 3.2 0
3 1.5 0.2 4.6 3.1 0
4 1.4 0.2 5.0 3.6 0

首先, 将列分为因变量和自变量(或功能和标签)。然后, 将这些变量拆分为训练和测试集。

# Import train_test_split function
from sklearn.model_selection import train_test_split

X=data[['sepal length', 'sepal width', 'petal length', 'petal width']]  # Features
y=data['species']  # Labels

# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 70% training and 30% test

拆分后, 你将在训练集上训练模型并在测试集上执行预测。

#Import Random Forest Model
from sklearn.ensemble import RandomForestClassifier

#Create a Gaussian Classifier
clf=RandomForestClassifier(n_estimators=100)

#Train the model using the training sets y_pred=clf.predict(X_test)
clf.fit(X_train, y_train)

y_pred=clf.predict(X_test)

训练后, 使用实际值和预测值检查准确性。

#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
# Model Accuracy, how often is the classifier correct?
print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
('Accuracy:', 0.93333333333333335)

你还可以对单个项目进行预测, 例如:

  • 萼片长度= 3
  • 萼片宽度= 5
  • 花瓣长度= 4
  • 花瓣宽度= 2

现在你可以预测它是哪种花。

clf.predict([[3, 5, 4, 2]])
array([2])

在此, 2表示花型维珍尼亚。

在Scikit学习中发现重要功能

在这里, 你可以在IRIS数据集中找到重要特征或选择特征。在scikit-learn中, 你可以按照以下步骤执行此任务:

  • 首先, 你需要创建一个随机森林模型。
  • 其次, 使用特征重要性变量查看特征重要性分数。
  • 第三, 使用seaborn库可视化这些分数。
from sklearn.ensemble import RandomForestClassifier

#Create a Gaussian Classifier
clf=RandomForestClassifier(n_estimators=100)

#Train the model using the training sets y_pred=clf.predict(X_test)
clf.fit(X_train, y_train)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', 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=100, n_jobs=1, oob_score=False, random_state=None, verbose=0, warm_start=False)
import pandas as pd
feature_imp = pd.Series(clf.feature_importances_, index=iris.feature_names).sort_values(ascending=False)
feature_imp
petal width (cm)     0.458607
petal length (cm)    0.413859
sepal length (cm)    0.103600
sepal width (cm)     0.023933
dtype: float64

你还可以可视化功能的重要性。可视化易于理解和解释。

为了可视化, 可以结合使用matplotlib和seaborn。由于seaborn是基于matplotlib构建的, 因此它提供了许多自定义主题, 并提供了其他绘图类型。 Matplotlib是seaborn的超集, 并且对于良好的可视化而言, 两者同等重要。

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# Creating a bar plot
sns.barplot(x=feature_imp, y=feature_imp.index)
# Add labels to your graph
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title("Visualizing Important Features")
plt.legend()
plt.show()
了解Python中的随机森林分类器2

在选定特征上生成模型

在这里, 你可以删除”分隔宽度”功能, 因为它的重要性很低, 然后选择其余3个功能。

# Import train_test_split function
from sklearn.cross_validation import train_test_split
# Split dataset into features and labels
X=data[['petal length', 'petal width', 'sepal length']]  # Removed feature "sepal length"
y=data['species']                                       
# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.70, random_state=5) # 70% training and 30% test

拆分后, 你将在选定的训练集特征上生成模型, 对选定的测试集特征执行预测, 并比较实际值和预测值。

from sklearn.ensemble import RandomForestClassifier

#Create a Gaussian Classifier
clf=RandomForestClassifier(n_estimators=100)

#Train the model using the training sets y_pred=clf.predict(X_test)
clf.fit(X_train, y_train)

# prediction on test set
y_pred=clf.predict(X_test)

#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
# Model Accuracy, how often is the classifier correct?
print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
('Accuracy:', 0.95238095238095233)

你可以看到, 删除了最不重要的特征(间隔长度)后, 准确性提高了。这是因为你删除了误导性数据和噪声, 从而提高了准确性。较少的功能也可以减少训练时间。

总结

恭喜, 你已完成本教程的结尾!

在本教程中, 你学习了什么是随机森林, 如何工作, 查找重要功能, 随机森林与决策树之间的比较, 优缺点。你还学习了scikit-learn中的模型构建, 评估和发现重要功能。乙

如果你想了解有关机器学习的更多信息, 建议你看一看我们的《 R:分类中的监督学习》课程。

赞(0)
未经允许不得转载:srcmini » 了解Python中的随机森林分类器

评论 抢沙发

评论前必须登录!