使用 TfidfVectorizer 时是否需要标签编码?
Is label encoding needed when using TfidfVectorizer?
可能是一个非常新手的问题:
我正在开发一个多 class 文本 class化项目,其中我的所有功能和标签都是基于文本的。
我刚刚了解到我没有对特征和标签进行编码,因为我在下面进行转述:
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)
我印象中会为我做这件事。
我错了吗?
警告与 TfidfVectorizer
无关。它的 fit
和 fit_transform
方法仅依赖 X
来计算 tf-idf-weighted document-term 矩阵。 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
的内部编码已弃用,将在未来的版本 中删除。因此,在这种特殊情况下,您必须在将来 明确地自己做,例如,当您使用下一个版本时。
可能是一个非常新手的问题:
我正在开发一个多 class 文本 class化项目,其中我的所有功能和标签都是基于文本的。
我刚刚了解到我没有对特征和标签进行编码,因为我在下面进行转述:
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)
我印象中会为我做这件事。
我错了吗?
警告与 TfidfVectorizer
无关。它的 fit
和 fit_transform
方法仅依赖 X
来计算 tf-idf-weighted document-term 矩阵。 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
的内部编码已弃用,将在未来的版本 中删除。因此,在这种特殊情况下,您必须在将来 明确地自己做,例如,当您使用下一个版本时。