评估从交叉验证集训练集获得的损失函数值

时间:2018-08-07 11:48:14

标签: python machine-learning scikit-learn loss-function

我正在遵循Andrew NG的指令来评估分类中的算法:

  1. 找到训练集的损失函数。
  2. 将其与交叉验证的损失功能进行比较。
  3. 如果两者都足够近且很小,请转到下一步(否则,存在偏差或差异。等)。
  4. 使用上一步产生的Thetas(即权重)作为测试结果,对测试集进行预测。

我正在尝试使用Scikit-Learn库来应用它,但是,我真的迷路了,并且确定自己完全错了(我在网上没有找到类似的东西):

from sklearn import model_selection, svm
from sklearn.metrics import make_scorer, log_loss
from sklearn import datasets

def main():

    iris = datasets.load_iris()
    kfold = model_selection.KFold(n_splits=10, random_state=42)
    model= svm.SVC(kernel='linear', C=1)
    results = model_selection.cross_val_score(estimator=model,
                                              X=iris.data,
                                              y=iris.target,
                                              cv=kfold,
                                              scoring=make_scorer(log_loss, greater_is_better=False))

    print(results)

错误

ValueError: y_true contains only one label (0). Please provide the true labels explicitly through the labels argument.

我不确定这是否是正确的开始方式。非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

鉴于您在评论中提供的说明,并且您对日志丢失本身并不特别感兴趣,我认为最直接的方法是放弃日志丢失并改为准确性:

from sklearn import model_selection, svm
from sklearn import datasets

iris = datasets.load_iris()
kfold = model_selection.KFold(n_splits=10, random_state=42)
model= svm.SVC(kernel='linear', C=1)
results = model_selection.cross_val_score(estimator=model,
                                              X=iris.data,
                                              y=iris.target,
                                              cv=kfold,
                                              scoring="accuracy")  # change 

评论中已经提到,在这种情况下将日志丢失包括在内仍然会导致scikit-learn中一些未解决的问题(请参见herehere)。

出于评估模型泛化能力的目的,您可以使用准确性指标。

答案 1 :(得分:1)

这种错误经常在您进行交叉验证时出现。

基本上,您的数据被拆分为n_splits = 10,并且某些拆分中缺少某些类。例如,您的第9个分组可能没有第2类的训练示例。

因此,当您评估损失时,预测和测试集之间现有类别的数量将不匹配。因此,如果您在y_true中有3个类别,并且模型经过训练只能预测2个,就无法计算损失。

在这种情况下您该怎么办?

您有三种可能:

  1. 随机播放数据KFold(n_splits=10, random_state=42, shuffle = True
  2. 使n_splits更大
  3. 按如下所示为损失函数明确提供标签列表

args_loss = { "labels": [0,1,2] } make_scorer(log_loss, greater_is_better=False,**args_loss)

  1. 樱桃让您分心,以确保不会发生这种情况。我认为Kfold不允许这样做,但是GridSearchCV允许

答案 2 :(得分:1)

仅适用于正在关注安德鲁课程的未来读者:

K-Fold 实际上不是适用于此目的的原因,因为我们主要要评估由具有某些 参数的某种算法生成的Theta(即权重)< / em> ,通过在两个成本函数J(train)J(CV)之间进行比较时使用这些Theta来确定模型是否存在 bias 方差确定

尽管如此,K-Fold主要用于 测试 ,使用在训练集上训练模型产生的权重对CV进行预测。