почему прогнозы модели с несколькими метками пусты?

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

и код, который я написал:

X_train, y_train = train['title'].values, train['tags'].values
X_val, y_val = validation['title'].values, validation['tags'].values
##I did some preprocessing on the data(eg.lowering, removing stop words etc.) then:
tfidf=TfidfVectorizer(ngram_range=(1,2),min_df=2,max_df=.9,token_pattern='(\S+)').fit(X_train)

X_train=tfidf.transform(X_train)
X_test=tfidf.transform(X_test) 
X_val=tfidf.transform(X_val) 
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer(classes=sorted(tags_counts.keys()))##tags_counts.keys are all the tags contained in the dataset
y_train = mlb.fit_transform(y_train)
y_val = mlb.fit_transform(y_val)
model=OneVsRestClassifier(LogisticRegression(C=10)).fit(X_train_tfidf, y_train) 
y_val_predicted_labels_tfidf = classifier_tfidf.predict(X_val[0])

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


Я получил пустое предсказание [()]. Любые идеи?


person Mee    schedule 10.04.2020    source источник


Ответы (1)


Если вы запустите y_val_predicted_probabilities_tfidf = classifier_tfidf.predict_proba(X_val), вы увидите, что для точек данных, для которых прогнозируемые метки пусты, прогнозируемые вероятности для всех меток меньше порогового значения (0,5 по умолчанию).

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

y_val_predicted_probabilities_tfidf = classifier_tfidf.predict_proba(X_val)
y_val_predicted_labels_tfidf = classifier_tfidf.predict(X_val)
for i in range(len(X_val)):
    if len(y_val_predicted_labels_tfidf[i])==0:
        max_idx= np.argmax(y_val_predicted_probabilities_tfidf[i])
        y_val_predicted_labels_tfidf[i].append(max_idx)

В качестве альтернативы вы также можете попробовать снизить порог до соответствующего значения:

y_val_predicted_labels_tfidf = np.where(y_val_predicted_probabilities_tfidf > threshold, 1, 0)
person arpitrathi    schedule 10.04.2020
comment
Спасибо за ваш комментарий, но не могли бы вы сказать мне, пожалуйста, порог чего .5? это для OneVsRestClassifier или для логистики? потому что я хочу попробовать чередовать тройку - person Mee; 10.04.2020
comment
Вы можете просто написать output = np.where(y_val_predicted_probabilities_tfidf > threshold, 1, 0) и установить свой собственный порог, чтобы получить желаемый результат. - person arpitrathi; 10.04.2020