Требуется ли кодирование меток при использовании TfidfVectorizer?

#python #scikit-learn #text-classification

Вопрос:

Вероятно, вопрос для очень новичка:

Я работаю над проектом многоклассовой классификации текста, в котором все мои функции и метки основаны на тексте.

Только что до меня дошло, что я не кодирую функции и метки, так как я передавал их ниже:

 def _create_transformer_from_feature_columns(columns):
    tuples = []
    for col in list(columns):
        tfidf_kwargs = {'ngram_range': (1, 2), 'sublinear_tf': True}
        if col not in NON_LEMMATIZED_COLUMN_NAMES:
            tfidf_kwargs.update({'tokenizer': Tokenizer()})
        tuples.append((f'vec_{col}', TfidfVectorizer(**tfidf_kwargs), col))

    return ColumnTransformer(tuples, remainder='passthrough')

df_list = []
for bug in useful_bugs_dict.values():
    # convert bug data into feature metric
    bug_data = bug.get_data_as_df()
    group_name = bug_data['group_name'][0]
    if group_name not in group_owners_dict:
        owner_id = len(group_owners_dict)
        group_owners_dict[group_name] = owner_id
        group_owner_id_dict[owner_id] = group_name

    df_list.append(bug_data)

training_data = pd.concat(df_list)
training_data.reset_index(drop=True, inplace=True)

columns = training_data.drop('group_name', axis='columns').columns
transformer = _create_transformer_from_feature_columns(columns)



labels = training_data['group_name']
features = training_data.drop('group_name', axis='columns')

X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2)

 

Кроме того, я использую XGBClassifier и получаю это предупреждение:

 /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/xgboost/sklearn.py:1146: 
UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. 
To remove this warning, do the following: 
1) Pass option use_label_encoder=False when constructing XGBClassifier object; 
and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].
  warnings.warn(label_encoder_deprecation_msg, UserWarning)
 

У меня сложилось впечатление, что он сделает это за меня.

Я был неправ?

Комментарии:

1. это только предупреждение о том, что они могут изменить его в будущем — и это даже показывает вам, как это исправить. Ты пробовал это сделать?

2. @furas мой вопрос касался не (только) предупреждения. В любом случае — на него уже ответили.

3. @furas хорошо… Я думаю, это только ты, так как мне уже кто-то ответил

Ответ №1:

Предупреждение не имеет отношения к TfidfVectorizer . ИТС fit и fit_transform методы полагаются только на X вычисление матрицы терминов документа, взвешенной по tf-idf. y игнорируется в обоих случаях, и его кодировка не имеет значения.

Для scikit-learn классификаторов кодирование y также не является обязательным. Передача объектов со строковыми значениями в задачах классификации обычно не является проблемой. Обратите внимание, что следующий код для многоклассовой проблемы будет выполнен без каких-либо проблем:

 from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.tree import DecisionTreeClassifier


X = ['doc one', 'doc two', 'number three']
y = [['yes', 'ok'], ['yes', 'not okay'], ['no', 'not okay']]

vec = TfidfVectorizer()
Xt = vec.fit_transform(X, y)

clf = DecisionTreeClassifier()
clf.fit(Xt, y)
 

Однако предупреждение исходит от того, от XGBClassifier чего оно не исходит scikit-learn . И, по-видимому, внутренняя кодировка y устарела и будет удалена в будущем выпуске. Поэтому в данном конкретном случае вам придется сделать это явно самостоятельно в будущем, например, при использовании следующей версии (- ов).