У меня есть набор данных, который выглядит следующим образом:
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
производительность.
Мой вопрос в том, какой путь является правильным т способ сделать это и почему это различие?
Я прошел через эту ссылку и это , и это не помогло с моим вопросом.