Мое ограничение заключается в использовании 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)
Вот как я выполнил проверку поезд-тестом:
Код: Выделить всё
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)
Код: Выделить всё
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