#python #machine-learning #scikit-learn
#python #машинное обучение #scikit-learn
Вопрос:
Я использую набор данных для обучения и тестирования твитов, которые были объединены вместе. (combi = train.append(test, ignore_index=True).
в обучающем CSV вручную помечены значения: -1, 0 и 1 (в основном отрицательные, нейтральные и положительные), тогда как в тестировании этого нет.
я хочу, чтобы код использовал логистическую регрессию для вывода оценки f1, но возникает проблема: используется f1_score(yvalid, prediction_int):
мой код выглядит следующим образом:
from sklearn.feature_extraction.text import CountVectorizer
bow_vectorizer = CountVectorizer(max_df=0.90, min_df=2, max_features=1000, stop_words='english')
bow = bow_vectorizer.fit_transform(combi['tidy_tweet'])
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer(max_df=0.90, min_df=2, max_features=1000, stop_words='english')
tfidf = tfidf_vectorizer.fit_transform(combi['tidy_tweet'])
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score
train_bow = bow[:1300,:]
test_bow = bow[1300:,:]
xtrain_bow, xvalid_bow, ytrain, yvalid = train_test_split(train_bow, train['label'], random_state=42, test_size=0.3)
lreg = LogisticRegression()
lreg.fit(xtrain_bow, ytrain) # training the model
prediction = lreg.predict_proba(xvalid_bow)
prediction_int = prediction[:,1] >= 0.3
prediction_int = prediction_int.astype(np.int)
f1_score(yvalid, prediction_int)
Ответ №1:
Читая соответствующую документацию, вы увидите, что значение по умолчанию для аргумента average
в f1_score
равно binary
; поскольку здесь вы его не указываете, оно принимает это значение по умолчанию, которое, однако, недопустимо для вашего случая многоклассовой классификации (согласен, возможно, это плохой выбор дизайна).
Как указано в сообщении об ошибке, вам следует явно выбрать и указать один из других доступных аргументов, показанных в документах; вот пример из документов с фиктивными данными нескольких классов:
from sklearn.metrics import f1_score
# dummy multi-class data, similar to yours:
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
f1_score(y_true, y_pred, average='macro')
# 0.26666666666666666
f1_score(y_true, y_pred, average='micro')
# 0.33333333333333331
f1_score(y_true, y_pred, average='weighted')
# 0.26666666666666666
f1_score(y_true, y_pred)
# ValueError: Target is multiclass but average='binary'. Please choose another average setting.