赞
踩
Python中计算特征重要性的3种必备方法
任何有志成为数据科学家的人都必须知道的内容
如何找到数据集中最重要的特征?有很多技巧,本文将教您三种任何数据科学家都应该知道的方法。
阅读后,您将知道如何仅使用几行代码来计算Python中的特征重要性。您还将学到这些技巧的前提条件,这对于使它们正常工作至关重要。
您可以在此文章的笔记本中下载笔记本。
文章的结构如下:
数据集加载和准备
方法1 — 从系数获取重要性
方法2 — 从基于树的模型获取重要性
方法3 — 从PCA载荷得分获取重要性
结论 数据集加载和准备
让我们尽量少花时间在这里。您将使用Scikit-Learn内置的乳腺癌数据集。您还需要_Numpy、Pandas和Matplotlib_用于各种分析和可视化目的。
以下代码片段显示了如何导入库并加载数据集:
# 导入库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_breast_cancer
数据集现在不是最方便的格式。您将大部分时间使用Pandas数据帧,所以让我们快速将其转换为一个数据帧。以下代码片段将预测变量和目标变量连接到一个数据帧中:
# 加载数据集 data = load_breast_cancer() df = pd.DataFrame(data.data, columns=data.feature_names) df['target'] = data.target
调用head()将产生以下输出:
[乳腺癌数据集的前几行]
简而言之,有30个预测变量和一个目标变量。所有的值都是数值的,没有缺失值。唯一明显的问题是规模。只需看看平均面积和平均光滑度列的差异 — 这可能导致模型效果不佳。
在解决规模问题之前,您还需要执行训练/测试拆分。
以下代码片段显示了如何进行训练/测试拆分并使用StandardScaler类来缩放预测变量:
# 数据拆分 from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler X = df.drop('target', axis=1) y = df['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 数据缩放 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test)
这就是您需要开始获取特征重要性的全部内容。接下来,让我们开始做到这一点。
方法1 — 从系数获取重要性检查特征重要性最简单的方法之一是检查模型的系数。例如,线性回归和逻辑回归都可以归结为一个方程,其中为每个输入值分配了系数(重要性)。
简单来说,如果分配的系数是一个较大的(负数或正数)数字,它对预测有一定的影响。相反,如果系数为零,则不会对预测产生任何影响。
简单的逻辑,但让我们来测试一下。我们有一个分类数据集,所以逻辑回归是一个适合的算法。在模型拟合后,系数存储在coef_属性中。
以下代码片段训练了逻辑回归模型,创建了一个数据帧,其中存储了属性及其相应系数,然后将该数据帧按系数降序排序:
# 训练逻辑回归模型 from sklearn.linear_model import LogisticRegression lr = LogisticRegression() lr.fit(X_train, y_train) # 获取系数 coefficients = lr.coef_[0] feature_names = X.columns # 创建包含特征及其系数的数据帧 feature_importance = pd.DataFrame({'feature': feature_names, 'importance': coefficients}) # 按重要性降序排序 feature_importance = feature_importance.sort_values(by='importance', ascending=False)
这很简单,不是吗?接下来,让我们通过视觉方式来检查系数。以下代码片段从系数制作一个条形图:
# 创建特征重要性的条形图 plt.figure(figsize=(12, 6)) plt.barh(feature_importance['feature'], feature_importance['importance']) plt.xlabel('Importance') plt.ylabel('Feature') plt.title('Feature Importances as Logistic Regression Coefficients') plt.show()
以下是相应的可视化效果:
[逻辑回归系数作为特征重要性]
这就是这个简单技术的全部内容。一个要记住的要点是,系数越大(无论是正数还是负数),它对预测的影响就越大。
方法2 — 从基于树的模型获取重要性
在训练任何基于树的模型之后,您将可以访问_feature_importances__属性。这是您可以获取特征重要性的最快方法之一。
以下代码片段显示了如何在训练数据上导入并拟合_XGBClassifier_模型。重要性的获取方式与之前类似,存储到一个数据帧中,然后按重要性排序:
# 导入XGBClassifier模型 from xgboost import XGBClassifier xgb = XGBClassifier() xgb.fit(X_train, y_train) # 获取特征重要性 importances = xgb.feature_importances_ # 创建包含特征及其重要性的数据帧 feature_importance = pd.DataFrame({'feature': feature_names, 'importance': importances}) # 按重要性降序排序 feature_importance = feature_importance.sort_values(by='importance', ascending=False)
您可以通过绘制条形图来可视化重要性。以下是如何制作一个:
# 创建从基于树的模型获取的特征重要性的条形图 plt.figure(figsize=(12, 6)) plt.barh(feature_importance['feature'], feature_importance['importance']) plt.xlabel('Importance') plt.ylabel('Feature') plt.title('Feature Importances obtained from a tree-based model') plt.show()
以下是相应的可视化效果:
[从基于树的模型获取的特征重要性]
正如之前提到的,以这种方式获取重要性是轻松的,但结果可能会有点偏倚。这种方法的倾向性是增加连续特征或高基数分类变量的重要性[1]。确保首先进行适当的准备和转换,然后您应该可以继续进行。
方法3 — 从PCA载荷得分获取重要性
主成分分析 PCA 是一种出色的降维技术,也可以用于确定特征重要性。
PCA不会直接显示您最重要的特征,就像前两种方法所做的那样。相反,它将返回N个主要成分,其中N等于原始特征的数量。
如果您对PCA有点生疏,可以在本文末尾找到一篇完整的从头开始的指南。
首先,让我们将PCA适应我们的缩放数据,并看看会发生什么。以下代码片段就是这样做的,还绘制了累积解释方差的线图:
# 导入PCA模型 from sklearn.decomposition import PCA pca = PCA() pca.fit(X_train) # 绘制累积解释方差的线图 explained_variance_ratio = pca.explained_variance_ratio_ cumulative_variance_ratio = np.cumsum(explained_variance_ratio) plt.figure(figsize=(8, 4)) plt.plot(range(1, len(cumulative_variance_ratio) + 1), cumulative_variance_ratio, marker='o', linestyle='--') plt.xlabel('Number of Principal Components') plt.ylabel('Cumulative Explained Variance') plt.title('PCA Cumulative Explained Variance') plt.grid() plt.show()
以下是相应的可视化效果:
[PCA累积解释方差]
但这意味着什么?
这意味着您可以使用前五个主要成分解释源数据集中约90%的方差。如果您不知道这意味着什么,可以参考从头开始的指南。
现在,您可以开始处理PCA载荷。这些只是主成分构建的原始变量的线性组合的系数[2]。
您可以使用载荷来找到实际变量和主成分之间的相关性。
如果主成分和原始变量之间存在强相关性,这意味着此特征很重要 — 用最简单的话来说。
如何使用Python计算载荷分数:
# 计算PCA载荷分数 loadings = pca.components_.T * np.sqrt(pca.explained_variance_) # 创建包含PCA载荷分数的数据帧 loading_scores = pd.DataFrame(loadings, columns=[f'PC{i}' for i in range(1, len(loadings) + 1)], index=feature_names) # 打印前几行 print(loading_scores.head())
相应的数据帧如下所示:
[PCA载荷分数的前几行]
第一个主成分非常重要。它只是一个单一的特征,但它解释了数据集中超过60%的方差。如您从图像5中所看到的,它与平均半径特征的相关系数几乎为0.8 — 这被认为是强正相关。
让我们可视化所有输入特征与第一个主成分之间的相关性。以下是包含整个代码段(包括可视化):
# 绘制PCA载荷分数的可视化 plt.figure(figsize=(12, 6)) plt.barh(loading_scores.index, loading_scores['PC1']) plt.xlabel ('Correlation with PC1') plt.ylabel('Feature') plt.title('PCA Loading Scores from the first Principal Component') plt.show()
以下是相应的可视化效果:
[来自第一个主成分的PCA载荷分数]
这就是如何“突破”PCA以将其用作特征重要性算法。让我们在下一节中总结一切。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。