一个多层次类别的文本分类问题

A question on text classification with more than one level of category

我正在尝试根据每个产品的文本描述生成一系列产品分类器。我拥有的数据框类似于以下内容,但更复杂。 Python 和 sklearn 库被使用。

data = {'description':['orange', 'apple', 'bean', 'carrot','pork','fish','beef'],
        'level1':['plant', 'plant', 'plant', 'plant','animal','animal','animal'],
         'level2:['fruit','fruit','vegatable','vegatable','livestock', 'seafood','livestock'}
  
# Create DataFrame
df = pd.DataFrame(data)

“描述”是文本数据。现在只是一个字。但真正的是一个更长的句子。 “Level1”是顶级类别。 “Level2”是一个子类别。

我知道如何使用 sklearn 库训练分类模型将产品分类为 1 级类别。

下面是我做的:

import pandas as pd
import numpy as np
import nltk
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report, f1_score, accuracy_score, confusion_matrix
from sklearn.metrics import roc_curve, auc, roc_auc_score
import pickle

# Train/Test split
X_train, X_test, y_train, y_test = train_test_split(df['description'],
                                                 df[['Level1','Level2']], test_size = 0.4, shuffle=True)

#use the TF-IDF Vectorizer
tfidf_vectorizer = TfidfVectorizer(use_idf=True)

#transforming the training data into tf-idf matrix
X_train_vectors_tfidf = tfidf_vectorizer.fit_transform(X_train)

#transforming testing data into tf-idf matrix
X_test_vectors_tfidf = tfidf_vectorizer.transform(X_test)

#Create and save model for level 1
naive_bayes_classifier = MultinomialNB()
model_level1 = naive_bayes_classifier.fit(X_train_vectors_tfidf, y_train['Level1'])
with open('model_level_1.pkl','wb') as f:
    pickle.dump(model_level1, f)

我不知道如何做的是为每个级别 1 类别建立一个分类模型,可以预测产品的级别 2 类别。例如,基于上述数据集,应该有一个 'plant' 的分类模型(预测水果或蔬菜)和另一个 'animal' 的模型(预测海鲜或牲畜)。您有什么想法可以使用循环来完成并保存模型吗?

假设您将能够获取数据集的所有列,那么它将是特征的混合,级别是 class 标签。在同一行上制定:

cols = ["abc", "Level1", "Level2", "Level3"]

从这里开始,现在让我们只考虑关卡,因为那是我们感兴趣的。

level_cols = [val for val in levels if "Lev" in val]

上面只是检查是否存在以这三个字符开头的“Lev”。

现在,级别列就位了。我认为您可以从以下方面着手:

1. Iterate only the level cols.
2. Take only the numbers 1,2,3,4....n
3. If step-2 is divisible by 2 then I do the prediction using the saved level model. Ideally, all the even ones.
4. Else train on other levels. 

for level in level_cols:
    if int(level[-1]) % 2 == 0:
      #  open the saved model at int(level[-1]) - 1
      #  Perform my prediction
    else:
        level_idx = int(level[-1])
        model = naive_bayes_classifier.fit(x_train, y_train[level])
        mf = open("model-x-"+level_idx, "wb")
        pickle.dump(model, mf)