мультиметочная классификация и стратифицированная выборка с различной подготовкой целевого значения приведут к другому результату - PullRequest
2 голосов
/ 16 апреля 2020

У меня есть набор данных, который выглядит следующим образом:

                                         Clean_Tweet     cEXT  cNEU cAGR  cCON  cOPN
0      thanks questions watch season premiere tonight     0     1     1     1    0
1                            couple films coming book     0     0     0     1    1
2                                  naked afford price     0     1     0     1    1

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

Я запутался в том, как мне нужно подготовить значение y и передать его в iterative_train_test_split.

I. сделали два пути и получили очень разные результаты. Мне было интересно, если вы можете помочь мне понять, какой путь является правильным.

Первый сценарий:

1. Я преобразую свой набор данных в этой форме:

0    thanks questions watch season premiere tonight     [cNeu, cAgr, cCon]
1    couple films coming book                           [cCON, cOPN]
2    naked afford price                                 [cNeu, cCON, cOPN]

2. А затем используется многолабировочный бинаризатор:

multilabel_binarizer = MultiLabelBinarizer()
multilabel_binarizer.fit(df.personality)
y = multilabel_binarizer.transform(df.personality)

3. И затем вызывается выборка:

X_train, y_train, X_test, y_test = iterative_train_test_split(np.array(df['Clean_Tweet']).reshape(-1,1), y, test_size = 0.33)

А затем используйте tfidf векторизатор и перейдите к OneVSRest linear svc для классификации (Если вы знаете, что этот код также может помочь, пожалуйста, дайте мне знать, я опубликую его здесь)

В таким образом, моя производительность f1, precision, recall составляет около 95 percent

Второй сценарий

1. Я преобразую свой набор данных в эту форму:

0    thanks questions watch season premiere tonight     [cNeu, cAgr, cCon]
1    couple films coming book                           [cCON, cOPN]
2    naked afford price                                 [cNeu, cCON, cOPN]

2. И затем используется многолабировочный бинаризатор:

multilabel_binarizer = MultiLabelBinarizer()
multilabel_binarizer.fit(df.personality)
y = multilabel_binarizer.transform(df.personality)

3. И тогда я применяю LabelEncoding на бинаризованная цель :

def get_new_labels(y):
    y_new = LabelEncoder().fit_transform([''.join(str(l)) for l in y])
    return y_new

y_new = get_new_labels(y)
y_new = y_new.reshape(len(y_new), 1)

4. А потом:

X_train, y_train, X_test, y_test = iterative_train_test_split(np.array(df['Clean_Tweet']).reshape(-1,1), y_new, test_size = 0.33)

С такими же tfidf и OneVSRest linear svc я обошел 68 percent производительность.

Мой вопрос в том, какой путь является правильным т способ сделать это и почему это различие?

Я прошел через эту ссылку и это , и это не помогло с моим вопросом.

...