2016-12-04 3 views
0

Я хочу построить кривые обучения на обученном классификаторе SVM, используя разные оценки и используя метод Leave One Group Out как метод перекрестного подтверждения. I подумал, что я понял, но два разных бомбардира - «f1_micro» и «точность» - будут давать одинаковые значения. Я в замешательстве, это предположительно ?Scikit-learn кривые обучения с разными счетчиками и оставить одну группу из cv дают одинаковые значения

Вот мой код (к сожалению, я не могу разделить данные, как он еще не открыт):

from sklearn import svm 
SVC_classifier_LOWO_VC0 = svm.SVC(cache_size=800, class_weight=None, 
    coef0=0.0, decision_function_shape=None, degree=3, gamma=0.01, 
    kernel='rbf', max_iter=-1, probability=False, random_state=1, 
    shrinking=True, tol=0.001, verbose=False) 
training_data = pd.read_csv('training_data.csv') 
X = training_data.drop(['Groups', 'Targets'], axis=1).values 
scaler = preprocessing.StandardScaler().fit(X) 
X = scaler.transform(X) 
y = training_data['Targets'].values 
groups = training_data["Groups"].values 
Fscorer = make_scorer(f1_score, average = 'micro') 
logo = LeaveOneGroupOut() 
parm_range0 = np.logspace(-2, 6, 9) 
train_scores0, test_scores0 = validation_curve(SVC_classifier_LOWO_VC0, X, 
    y, "C", parm_range0, cv =logo.split(X, y, groups=groups), scoring = Fscorer) 

Теперь от:

train_scores_mean0 = np.mean(train_scores0, axis=1) 
train_scores_std0 = np.std(train_scores0, axis=1) 
test_scores_mean0 = np.mean(test_scores0, axis=1) 
test_scores_std0 = np.std(test_scores0, axis=1) 
print test_scores_mean0 
print np.amax(test_scores_mean0) 
print np.logspace(-2, 6, 9)[test_scores_mean0.argmax(axis=0)] 

я получаю:

[0,20257407 0,35551122 0,40791047 0,49887676 0,5021742
0,50030438 0,49426622 0,48 066419 0,4868987]

0,502174200206

100,0

Если я создаю новый классификатор, но с теми же параметрами, и запустить все точно так, как и раньше, для озвучивания, за исключением, например:

parm_range1 = np.logspace(-2, 6, 9) 
train_scores1, test_scores1 = validation_curve(SVC_classifier_LOWO_VC1, X, 
y, "C", parm_range1, cv =logo.split(X, y, groups=groups), scoring = 
'accuracy') 
train_scores_mean1 = np.mean(train_scores1, axis=1) 
train_scores_std1= np.std(train_scores1, axis=1) 
test_scores_mean1 = np.mean(test_scores1, axis=1) 
test_scores_std1 = np.std(test_scores1, axis=1) 
print test_scores_mean1 
print np.amax(test_scores_mean1) 
print np.logspace(-2, 6, 9)[test_scores_mean1.argmax(axis=0)] 

Я получаю точно такой же ответ:

[0,20257407 0,35551122 0,40791047 0,49887676 0,5021742
0,50030438 0,49426622 0,48066419 0,4868987]

0,502174200206

100,0

Как это возможно, я делаю что-то не так, или что-то отсутствует?

Благодаря

+1

Можете ли вы показать самодостаточный пример с образцами данных, демонстрирующими проблему? Я предполагаю, что один из ваших прогонов случайно повторно использует уже определенную переменную из более раннего запуска, хотя я не вижу, где в указанном вами коде. – BrenBarn

+0

Я постараюсь, но мне понадобится некоторое время, чтобы выяснить, как построить самодостаточный пример, который имеет смысл, поскольку эти функции представляют собой проводные журналы, формирующие скважины, а цели - геологические фации. – MyCarta

+0

@BrenBarn Тем временем, имея в виду ваше предложение, я снова буду расчесывать свой полный код для повторных использованных переменных. – MyCarta

ответ

1

F1 = accuracy тогда и только тогда, когда TP = TN, то есть, число верных срабатываний равно числу истинных негативов, которые могут произойти, если ваши классы идеально сбалансированы. Так оно и есть, или у вас есть ошибка в вашем коде. Где вы инициализируете своего бомбардира, следующим образом: scorer = make_scorer(accuracy_score, average = 'micro')?

+0

Мой счетчик очков инициализирован как: Ascorer = make_scorer (precision_score), но я получаю такую ​​же проблему. Я делаю это или нет, и просто передаю «точность» без ее инициализации. Мне придется проверять ошибки кода. Классы не сбалансированы. благодаря – MyCarta