乳腺癌的特征重要性:随机森林与逻辑回归

机器算法验证 机器学习 物流 随机森林 回归系数
2022-03-21 10:50:13

假设我是一名医生,我想知道哪些变量对预测乳腺癌最重要(二元分类)。两位不同的科学家分别向我展示了不同的特征重要性数字......

使用 L2 范数进行逻辑回归(模型系数的绝对值;显示 10 个最高值): 在此处输入图像描述

和随机森林(显示最高的 10 个): 在此处输入图像描述

结果非常不同。我应该相信哪个科学家?这些数字中的一个/两个都没有意义吗?

代码如下;在 scikit-learn 中使用 Wisconsin Breast Cancer 数据集。

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegressionCV
from sklearn.ensemble import RandomForestClassifier
import numpy as np
import matplotlib.pyplot as plt

data = load_breast_cancer()
y = data.target
X = data.data

clf = LogisticRegressionCV(max_iter=3000)
clf.fit(X, y)
coefs = np.abs(clf.coef_[0])
indices = np.argsort(coefs)[::-1]

plt.figure()
plt.title("Feature importances (Logistic Regression)")
plt.bar(range(10), coefs[indices[:10]],
       color="r", align="center")
plt.xticks(range(10), data.feature_names[indices[:10]], rotation=45, ha='right')
plt.subplots_adjust(bottom=0.3)

clf = RandomForestClassifier(n_jobs=-1, random_state=42, n_estimators=400, max_depth=6, max_features=6) #has already been tuned
clf.fit(X, y)
coefs = clf.feature_importances_
indices = np.argsort(coefs)[::-1]

plt.figure()
plt.title("Feature importances (Random Forests)")
plt.bar(range(10), coefs[indices[:10]],
       color="r", align="center")
plt.xticks(range(10), data.feature_names[indices[:10]], rotation=45, ha='right')
plt.subplots_adjust(bottom=0.3)

plt.ion(); plt.show()
2个回答

从您的评论看来,您真正追求的是特征选择 - 您想要一组使用可变数量特征(1、2、3、...、N)的模型,这样逐步添加新特征会产生尽可能地提高模型性能。然后决策者可以评估他们是否要执行昂贵的程序来获取附加特征的数据,以使用具有更高精确度/召回率的更复杂的模型。我们在这里假设获取每个特征的数据的成本相同。

在这种情况下,我会将您的数据分成训练和测试集;我会在训练集上使用交叉验证来选择最好的增量特征(严格来说,你需要在这里使用嵌套交叉验证,但是如果这在计算上不可行或者你没有足够的数据,我们可以验证我们做到了通过交叉引用 CV 结果和最后的测试集结果来避免过度拟合)。也就是说,您将首先尝试每个功能,然后选择能够为您提供最佳 CV 性能的功能。然后,您将重复该过程以迭代地添加其他功能。

注意不同的 CV 折叠是否显示出不同的最佳增量特征——如果变异性太高,这种方法可能不可行。

这个问题是不恰当的。例如,我们不能建议医生检查特征更有价值“重要程度”仅在使用的特定模型的上下文中才有意义,而不是在现实世界中。XaXb

逻辑回归和随机森林是两种完全不同的方法,它们以不同的方式(结合)使用特征来最大化预测能力。这就是为什么一组不同的功能可以为每个模型提供最强大的预测能力。

这样的特征重要性数字经常出现,但它们被认为传达的信息通常被误认为与现实世界相关。为什么人们会对这样一个特征重要性感兴趣是数字尚不清楚