почему прогнозы модели с несколькими метками пусты? - PullRequest
0 голосов
/ 10 апреля 2020

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

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

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])

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


, я получил пустое предсказание [()]. Есть идеи?

1 Ответ

0 голосов
/ 10 апреля 2020

Если вы запустите 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)
...