我正在遵循Andrew NG的指令来评估分类中的算法:
我正在尝试使用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.
我不确定这是否是正确的开始方式。非常感谢您的帮助。
答案 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中一些未解决的问题(请参见here和here)。
出于评估模型泛化能力的目的,您可以使用准确性指标。
答案 1 :(得分:1)
这种错误经常在您进行交叉验证时出现。
基本上,您的数据被拆分为n_splits = 10
,并且某些拆分中缺少某些类。例如,您的第9个分组可能没有第2类的训练示例。
因此,当您评估损失时,预测和测试集之间现有类别的数量将不匹配。因此,如果您在y_true
中有3个类别,并且模型经过训练只能预测2个,就无法计算损失。
在这种情况下您该怎么办?
您有三种可能:
KFold(n_splits=10, random_state=42, shuffle = True
) args_loss = { "labels": [0,1,2] }
make_scorer(log_loss, greater_is_better=False,**args_loss)
答案 2 :(得分:1)
仅适用于正在关注安德鲁课程的未来读者:
K-Fold
实际上不是适用于此目的的原因,因为我们主要要评估由具有某些 参数的某种算法生成的Theta(即权重)< / em> ,通过在两个成本函数J(train)
与J(CV)
之间进行比较时使用这些Theta来确定模型是否存在 bias ,方差或确定。
尽管如此,K-Fold
主要用于 测试 ,使用在训练集上训练模型产生的权重对CV进行预测。