我需要做的是:
- 应用逻辑回归分类器
- 使用AUC报告每个类的ROC
- 使用逻辑回归的估计概率来指导ROC的构建
- 对模型训练使用5倍交叉验证
为此,我的方法是使用这个非常好的教程:
基于他的想法和方法,我只是改变了获取原始数据的方式,像这样:
df = pd.read_csv( filepath_or_buffer='https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None, sep=',')df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']df.dropna(how="all", inplace=True) # drops the empty line at file-enddf.tail()# split data table into data X and class labels yX = df.iloc[:,0:4].valuesY = df.iloc[:,4].values
然后我直接运行代码。如果我尝试使用accuracy
或balanced_accuracy
等指标,一切正常(即使是许多其他指标)。我的问题是当我尝试使用roc_auc
指标时,我得到了以下错误:
“ValueError: Only one class present in y_true. ROC AUC score is not defined in that case.”
这个错误已经在这里1, 这里2, 这里3, 和 这里4讨论过。然而,我无法使用他们提供的任何“解决方案”/变通方法来解决我的问题。
我的完整代码是:
回答:
Iris数据集通常是按类别排序的。因此,当你不打乱顺序进行分割时,测试数据集可能会只包含一个类别。
一个简单的解决方案是使用shuffle
参数。
kfold = model_selection.KFold(n_splits=10, shuffle=True, random_state=seed)
即便如此,roc_auc
也不直接支持多类格式(Iris数据集有三个类别)。
请通过这个链接了解更多关于如何在多类情况下使用roc_auc
的信息。