使用 Python 和 Scikit-Learn PlatoBlockchain 数据智能获取随机森林的特征重要性。 垂直搜索。 人工智能。

使用 Python 和 Scikit-Learn 获取随机森林的特征重要性

介绍

随机森林 算法是一种基于树的监督学习算法,它使用许多决策树的预测集合,对数据点进行分类或确定其近似值。 这意味着它可以用于分类或回归。

当应用于分类时,数据点的类别是根据树投票最多的类别来选择的; 当应用于回归时,数据点的值是树输出的所有值的平均值。

使用随机森林时要记住的一件重要事情是树的数量是一个超参数,它将在运行模型之前定义。

在数据科学领域工作时,为特定项目选择随机森林模型的原因之一可能与查看集成树和理解的能力有关 为什么 进行了分类,或 为什么 给出了一个值——这叫做 可解释性.

考虑到基于树的算法,可以通过多种方式尝试解释模型,通过显示和查看每棵树(如果模型有 200 棵或更多树,则可能很难),使用 Shapley(或 SHAP)值,查看模型考虑最多的特征,使用 LIME 研究模型输入和输出之间的关系等。通常,采用所有方法的组合。

在本快速指南中,我们将重点创建一张图表,其中包含被认为对模型在企鹅分类时做出决定很重要的特征。 这被称为调查 特征重要性,并且可以传达给团队的其他成员(技术和非技术),以提供对如何做出决策的一瞥。

为此,让我们导入必要的库,加载 Palmer Penguins 数据集,拆分数据,创建模型,获取特征重要性,并使用 Seaborn 绘制它们! 我们不会深入研究数据、EDA 或模型本身——这些是专门指南的主题。

请注意: 您可以从下载数据集 GitHub上 或直接从代码。

导入库

让我们从导入一些我们将要使用的库开始:


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier


raw_data_url = "https://gist.githubusercontent.com/cassiasamp/197b4e070f5f4da890ca4d226d088d1f/raw/38c9d4906ed121481b4dc201fa2004f2b3d0065f/penguins.csv"
df = pd.read_csv(raw_data_url)

分割数据

让我们拆分数据进行训练和测试:


df = df.dropna().drop("rowid", axis=1)


y = df["species"]
X = df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]]


X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

获取特征重要性

最后——我们可以训练模型并导出特征重要性:


rf = RandomForestClassifier()


rf.fit(X_train, y_train)


rf.feature_importances_

输出:

array([0.41267633, 0.30107056, 0.28625311])

这些是特征值,要查看特征名称,请运行:


rf.feature_names_in_

这导致每个功能的相应名称:

array(['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],
      dtype=object)

这意味着决定这个特定模型的企鹅类别的最重要特征是 bill_length_mm!

重要性与数据在每个节点拆分中的分离程度有关 - 在这种情况下,该度量由 基尼指数 – 然后,在使用 bill_length_mm 对合奏中的 100 棵树进行特征和平均。 这些步骤的结果说明 0.41267633,或在这种情况下超过 40%。

可视化特征重要性

表示重要性值的一种常见方法是使用条形图。 让我们首先创建一个包含特征名称及其相应重要性的数据框,然后使用 Seaborn 的可视化它们 barplot():


importances_df = pd.DataFrame({"feature_names" : rf.feature_names_in_, 
                               "importances" : rf.feature_importances_})
                             

g = sns.barplot(x=importances_df["feature_names"], 
                y=importances_df["importances"])
g.set_title("Feature importances", fontsize=14);                          

建议: 呈现信息时的一个好习惯是按升序或降序对值进行排序。 在这种情况下,数据已经排序,第一个值是我们想要知道的第一个值。 如果不是这种情况,您可以使用以下命令订购数据框 sort_values. 这可以按升序或降序在任何列上完成: importances_df.sort_values(by="importances", ascending=False).

在查看第一个图时,很难解释每个特征重要性的值。 很明显,钞票长度比其他两个条长,但不完全是 bill_depth_mm 相当于 0.30107056那个 flipper_length_mm 是 0.28625311。 因此,可以通过显示每个柱的值来改进第一个图表。 这可以通过访问 Seaborn 的 containers 目的。 它存储每个条形信息并将值作为条形标签传递:

查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

使用 Python 和 Scikit-Learn PlatoBlockchain 数据智能获取随机森林的特征重要性。 垂直搜索。 人工智能。

现在,我们可以清楚地或几乎清楚地看到每个重要性值,因为 bill_length_mm 值被作为图表外边框一部分的垂直线切割。 边框用于包围一个区域,作为一种将更多注意力集中在它上面的方式,但在这种情况下,我们不需要包围,因为只有一个图形。 让我们删除边框并提高数字的可读性:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
                

sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

使用 Python 和 Scikit-Learn PlatoBlockchain 数据智能获取随机森林的特征重要性。 垂直搜索。 人工智能。

该图表似乎更易于阅读,但 X 轴上的刻度线似乎在浮动,我们已经有了值和条形图,因此我们可以删除 xticks:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)


g.set(xticks=[])
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

使用 Python 和 Scikit-Learn PlatoBlockchain 数据智能获取随机森林的特征重要性。 垂直搜索。 人工智能。

请注意在删除刻度后,Y 和 X 标签有点难以阅读。 Y标签, feature_names, 是垂直的,在 X 轴上,只有 importances. 由于标题已经说明图表是 特征重要性,我们还可以删除轴标签:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])


g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value)

使用 Python 和 Scikit-Learn PlatoBlockchain 数据智能获取随机森林的特征重要性。 垂直搜索。 人工智能。

与第一个图表相比,您可以看到这张图表更清晰、更易于阅读和理解。 我们还有一些事情可以做。 观察数字真的很接近条形,如果它们之间有更多的空间会更容易阅读。

这个情节中的另一个元素是颜色,当使用对比色时,它传达了一种分离的想法,反之,当使用相似的颜色时,它们传达了一种统一的想法,或者是整体的一部分。 由于这些特征都是企鹅的一部分,我们可以使用一种颜色,使每个条形各不相同,同时保持统一:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names",
                
                
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, 
                padding=2) 

使用 Python 和 Scikit-Learn PlatoBlockchain 数据智能获取随机森林的特征重要性。 垂直搜索。 人工智能。

如果你想让结果更直接,你可以改变标题并添加结论。 众所周知,根据我们之前讨论的标准,票据长度被认为是最重要的特征。 对于看情节的人来说,这可能是第一个信息,我们可以说 企鹅的喙长是随机森林 (RF) 基础模型中物种分类的最重要特征 :

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names", 
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("The penguin's bill length was the most important feature for species classification (RF base model)", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, padding=2)

这是特征重要性图表的最终结果:

使用 Python 和 Scikit-Learn PlatoBlockchain 数据智能获取随机森林的特征重要性。 垂直搜索。 人工智能。

结论

在本指南中——我们构建了一个随机森林分类器——并检查了用于训练模型的特征重要性,以试图 说明 模型学到了什么,以及什么影响了它的推理。

时间戳记:

更多来自 堆栈滥用