Перекрестная проверка и проверка поездным тестом дают совершенно разные результаты по проблеме классификации текста.Python

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Перекрестная проверка и проверка поездным тестом дают совершенно разные результаты по проблеме классификации текста.

Сообщение Гость »

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

Мое ограничение заключается в использовании SVM, Perceptron, линейной регрессии и Наивного-Байеса для моих проблема классификации, мера должна быть мерой микро f1, и мне нужно получить оценку микро f1 выше 0,70 на тестовом наборе данных, которого у меня нет (это означает, что я не смогу опробовать свое решение, пока оно не будет полностью завершено).
Строфа — это группа строк в стихотворении.
Это лишь часть предоставленного мне набора обучающих данных:< /p>

Код: Выделить всё

[
{
"stanza": "Ne znam sta misli devojka ta kako je mogla biti tako zla necu da cujem za njega i nju moju bivsu drugaricu",
"genre": "pop"
},
{
"stanza": "Mala sala ali dobar klub stojim, gledam naslonjen na stub u sali lom gore s plafona kaplje voda pravo na mikrofon u sali lom a mene gadja svaki ton",
"genre": "rock"
},
{
"stanza": "Sinoc zvezda s neba pade jedna ljubav s njom nestade nesta zvezde divnog sjaja nesta toplih zagrljaja",
"genre": "folk"
}
]
Во всем наборе данных у меня только три класса: поп, рок и фолк.
Мне нужно обучить модель с использованием обучающего набора данных, чтобы я мог прогнозировать жанр, основанный на строфе из тестового набора данных. В наборе обучающих данных у меня есть 1600 записей для каждого класса.
Вот как я выполнил перекрестную проверку:

Код: Выделить всё

import pandas as pd
from sklearn.svm import SVC
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import cross_validate

df = pd.read_json("data/train.json")

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(df["stanza"])
estimator = SVC()

scores = cross_validate(estimator=estimator,
X=X,
y=df["genre"],
scoring="f1_micro",
return_train_score=True,
cv=30)
Среднее значение test_score в баллах составляет около 0,54. Изменение cv не помогает.
Вот как я выполнил проверку поезд-тестом:

Код: Выделить всё

import pandas as pd
from sklearn.svm import SVC
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics import f1_score, classification_report

# Idea is to get random 100 samples from each class (each class has 1600 entries) and make them test dataset and rest to use as training dataset
test = df.groupby('genre').apply(lambda x: x.sample(100)).reset_index(drop=True)
train = df.drop(test.index)

vectorizer = CountVectorizer()
X_train = vectorizer.fit_transform(train["stanza"])
X_test = vectorizer.transform(test["stanza"])

svc = SVC()
svc.fit(X_train, train["genre"])
predictions = svc.predict(X_test)

score = f1_score(test["genre"], predictions, average="micro")
report = classification_report(test["genre"], predictions)
Оценка варьируется в районе 0,90. Я также предоставлю отчет о классификации, если это что-то значит.

Код: Выделить всё

              precision    recall  f1-score   support

folk       0.93      0.94      0.94       100
pop       0.92      0.85      0.89       100
rock       0.89      0.95      0.92       100

accuracy                           0.91       300
macro avg       0.91      0.91      0.91       300
weighted avg       0.91      0.91      0.91       300
Вот и все. Я не совсем уверен, все ли делаю так, как надо.
PS
Это решение использует базовые модели без предварительной обработки. В моем исходном решении я удаляю стоп-слова. Поскольку он написан на сербском языке, я не могу выполнять стемминг или лемматизацию, поэтому, если у вас есть какие-нибудь советы относительно того, что я могу использовать для предварительной обработки данных, чтобы они работали лучше, я буду благодарен. Я также пробовал использовать все модели из моего первого абзаца (хотя и не настраивал гиперпараметры) и векторизацию TF-IDF, но все это дает одинаковые результаты.

Подробнее здесь: https://stackoverflow.com/questions/784 ... ts-on-text
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»