Как правильно использовать sklearn cross_validate с классами One Hot Encoded? - PullRequest
0 голосов
/ 28 января 2020

Я создал модель, чтобы классифицировать свой набор данных из 8 классов и получить от него некоторые оценки, используя MLP. Для этого я решил использовать sklearn.metrics.cross_validate, используя 10 сгибов.

Следующий код работает нормально:

from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import cross_validate
from sklearn.metrics import accuracy_score, make_scorer, f1_score
import pandas as pd

def MLPClasify(sample):
    df = pd.read_csv('my_path\\my_file.csv', header=None)
    y = df[NumberOfFeatures]
    x = df.drop([NumberOfFeatures], axis=1)
    clf = MLPClassifier(hidden_layer_sizes=(27), activation='logistic', max_iter=500, alpha=0.0001, 
                        solver='adam', verbose=10, random_state=21, tol=0.000000001)
    clf.out_activation_ = 'softmax'
    scoring = {'Accuracy': make_scorer(accuracy_score), 'F1': make_scorer(f1_score, 
               average='weighted')}
    scores = cross_validate(clf, x, y, cv=10, scoring=scoring)
    return scores

Все прошло нормально, я получил некоторые точности около 60 %. Поэтому я решил использовать одну горячую кодировку, чтобы посмотреть, смогу ли я получить лучшие результаты. Итак, я написал следующий код:

from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import cross_validate
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.metrics import accuracy_score, make_scorer, f1_score
import pandas as pd

def MLPClasify(sample):
    df = pd.read_csv('my_path\\my_file.csv', header=None)
    y = df[NumberOfFeatures]
    x = df.drop([NumberOfFeatures], axis=1)
    label_encoder = LabelEncoder()
    integer_encoded = label_encoder.fit_transform(y)
    onehot_encoder = OneHotEncoder()
    integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
    onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
    y = onehot_encoded
    clf = MLPClassifier(hidden_layer_sizes=(27), activation='logistic', max_iter=500, alpha=0.0001, 
                        solver='adam', verbose=10, random_state=21, tol=0.000000001)
    clf.out_activation_ = 'softmax'
    scoring = {'Accuracy': make_scorer(accuracy_score), 'F1': make_scorer(f1_score, 
               average='weighted')}
    scores = cross_validate(clf, x, y, cv=10, scoring=scoring)
    return scores

Хорошо, код работает, но я получаю следующее предупреждение:

UndefinedMetricWarning: F-оценка неправильно определена и установлена ​​на 0,0 в этикетки без истинных или предсказанных образцов. Используйте параметр zero_division для управления этим поведением. средний, «верно, ни прогнозируемо», «F-оценка есть», len (true_sum)

Кроме того, моя точность падает до менее чем 2%

Любые идеи о том, что я могу делать неправильно ?

Спасибо за помощь

...