使用交叉验证和 ROC 评估逻辑回归

Posted

技术标签:

【中文标题】使用交叉验证和 ROC 评估逻辑回归【英文标题】:Evaluating logistic regression using cross validation and ROC 【发布时间】:2019-04-20 17:49:48 【问题描述】:

我正在尝试使用 AUROC 曲线评估逻辑回归并交叉验证我的分数。当我不进行交叉验证时,我没有任何问题,但我真的很想使用交叉验证来帮助减少我的方法中的偏差。

无论如何,下面是我得到的代码开头部分的代码和错误术语:

X = df.drop('Survived', axis=1)
y = df['Survived']

skf = StratifiedKFold(n_splits=5)
logmodel = LogisticRegression()

i=0
for train, test in skf.split(X,y):
    logmodel.fit(X[train], y[train])   # error occurs here
    predictions = logmodel.predict_proba(X[test])
    # a bunch of code that I haven't included which creates the ROC curve
    i += 1

错误发生在倒数第四行,并返回一个整数列表,后跟'not in index'

我真的不明白问题出在哪里?

这是我对代码的理解:首先我创建了一个分层 kfold 和逻辑回归的实例。分层 kfold 的实例表明要进行五次折叠。接下来,我说对于我的数据集 X,y 中的每个训练和测试折叠,我将逻辑模型拟合到数据,然后根据测试数据创建不同概率的预测列表。稍后(这部分不展示)我会为每个k-fold数据创建一个ROC曲线。

再一次,我真的不明白问题出在哪里,但也许有人可以澄清一下。我的作品或多或少是直接从 sklearn 中的这个链接复制而来的:https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc_crossval.html#sphx-glr-auto-examples-model-selection-plot-roc-crossval-py

【问题讨论】:

请参阅how to ask 问题指南。 请附上确切的错误行,以便我们查看错误。此外,您的标题具有误导性 - 您只是在逻辑模型中存在错误,而不是在验证步骤中(这里也不包括在内),并且您只是展示您所知道的,没有问题。您希望验证您的知识吗? X, y 是 pandas 对象。您需要使用iloc 来访问这些元素。见sklearn TimeSeriesSplit Error: KeyError: '[ 0 1 2 ...] not in index'。否则,您可以按照@mr_mo 的回答,首先将 pandas 对象转换为 numpy 数组。 @VivekKumar 谢谢!!!!这工作得很好。 【参考方案1】:

请添加更多详细信息,以便对其进行真正的检查。最好(并且实际上需要)一段可以运行以查看错误的代码。

从第一个视图开始,您获取一个 pandas 数据框并将其输入到模型中,这是不正确的。 请参阅以下正确检索数据并将其提供给模型的行:

X = df.drop('Survived', axis=1).values
y = df['Survived'].values

.values 后缀访问存储在这些数据帧中的 numpy 数据对象,这与其余代码一致。

希望能帮助您解决错误。

祝你好运!

【讨论】:

以上是关于使用交叉验证和 ROC 评估逻辑回归的主要内容,如果未能解决你的问题,请参考以下文章

使用交叉验证评估逻辑回归

R语言ROC曲线下的面积 - 评估逻辑回归中的歧视

机器学习逻辑回归分类评估方法

Python 中的逻辑回归和交叉验证(使用 sklearn)

Python sklearn 逻辑回归 K-hold 交叉验证:如何为 coef_ 创建一个框架

交叉验证、留一交叉验证、自助法