Сомнительный вывод из LeaveOneOut - PullRequest
0 голосов
/ 12 февраля 2019

В моем наборе данных 93 наблюдения и 24 объекта.Я использую модель SVM для классификации либо в класс 0, либо в класс 1.

У меня есть несколько вопросов о подходе перекрестной проверки Leave One Out, который я использовал, особенно в отношении точности, точности, отзыва и AUC

Я проверил методы в своем коде ниже, но что-то определенно не так, что вы можете видеть из стандартного отклонения точности 0,91.

Что я пропустил?

Дайте мне знать, если вам нужно больше информации.Спасибо!

#creates feature set and class#

x = np.array(df.drop(['target'], 1))
y = np.array(df['target'])
xs = scale(x)



#Here is the LOOCV code to achieve accuracy#

svm_model = SVC(C=0.1,kernel ='linear', probability = True)   
loo = LeaveOneOut(93)

acc = cross_val_score(estimator=svm_model,
                                      X=xs,
                                      y=y,
                                      cv=loo)
print(acc)
print("Accuracy: %0.2f (+/- %0.2f)" % (acc.mean(), acc.std() * 2))
#prints 0.71 +- 0.91 
    [0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
    1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0]



#Here is what I tried to get precision and recall#

predicted = cross_val_predict(svm_model, xs, y, cv = loo)
print (recall_score(y, predicted))
#prints 23%

print (precision_score(y, predicted))
#prints 46%


print (roc_auc_score(y, predicted))
#prints 56%

1 Ответ

0 голосов
/ 12 февраля 2019

Согласно документации SkLearn для LeaveOneOut , создается впечатление, что метод split() фактически отвечает за генерацию индексов поезда / теста для всех расщеплений CV:

loo = LeaveOneOut()
loo.split(xs, y)

Iполагайте, что две вышеупомянутые строки должны заменить строку, loo = LeaveOneOut(93), которую вы написали.Если вы посмотрите на исходный код для метода __init__(), используемого LeaveOneOut, вы увидите, что ничего не делается с любыми аргументами, которые ему могут быть переданы.Я полагаю, что именно поэтому вы не видели сообщения об ошибке, когда создавали объект loo, передавая ему целое число 93.

Действительно, если вы прокрутите страницу прямо под исходным кодом для __init__()метод, вы увидите, что метод split на самом деле принимает аргументы (данные обучения и метки), а затем выдает индексы поезда / теста для каждого сгиба резюме (в вашем случае 93 сгиба).

...