#python #machine-learning #decision-tree #label-encoding
#python #машинное обучение #дерево решений #метка-кодировка
Вопрос:
Я использовал Decision Tree Classifier
, и я хочу ввести my input
как a string
, а не указывать integer
значение, но это дает мне error
что-то вроде:
Traceback (most recent call last):
File "D:/backup code for odoo project/New folder/New folder/main.py", line 38, in <module>
theme_res = lebel_encoder.transform(theme_input)
File "C:UsersDellAppDataLocalProgramsPythonPython38libsite-packagessklearnpreprocessing_label.py", line 277, in transform
_, y = _encode(y, uniques=self.classes_, encode=True)
File "C:UsersDellAppDataLocalProgramsPythonPython38libsite-packagessklearnpreprocessing_label.py", line 121, in _encode
return _encode_numpy(values, uniques, encode,
File "C:UsersDellAppDataLocalProgramsPythonPython38libsite-packagessklearnpreprocessing_label.py", line 50, in _encode_numpy
raise ValueError("y contains previously unseen labels: %s"
ValueError: y contains previously unseen labels: ['Food', 'cafe', 'sticky']
Код:
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn import tree
df = pd.read_csv("new_data.csv", encoding='latin1')
inputs = df.drop('selected_theme', axis='columns')
target = df['selected_theme']
lebel_encoder = LabelEncoder()
inputs['main_cat_n'] = lebel_encoder.fit_transform(inputs['main_cat'])
inputs['sub_cat_n'] = lebel_encoder.fit_transform(inputs['sub_cat'])
inputs['nav_bar_n'] = lebel_encoder.fit_transform(inputs['nav_bar'])
inputs_n = inputs.drop(['main_cat', 'sub_cat', 'nav_bar'], axis='columns')
model = tree.DecisionTreeClassifier()
model.fit(inputs_n, target)
print(model.score(inputs_n, target))
theme_input = ['Food', 'cafe', 'sticky']
theme_res = lebel_encoder.transform(theme_input)
result_theme = model.predict(theme_res)
print(result_theme)
Ответ №1:
Ошибка возникает перед классификатором, это происходит в этой строке
theme_res = lebel_encoder.transform(theme_input)
в сообщении об ошибке говорится, что вы label_encoder
никогда не видели такие категории, как «Еда», «кафе», «липкий». Это происходит потому, что вы переписываете свои LabelEncoders. Вы должны использовать отдельные LabelEncoders для разных функций, например:
categorical_features = ['main_cat', 'sub_cat', 'nav_bar']
encoders = dict()
for cat in categorical_features:
encoders[cat] = LabelEncoder()
inputs[f'{cat}_n'] = encoders[cat].fit_transform(inputs[cat])
inputs_n = inputs.drop(['main_cat', 'sub_cat', 'nav_bar'], axis='columns')
...
Комментарии:
1. А еще лучше, используйте один
OrdinalEncoder
иfit_transform
все эти столбцы одновременно.LabelEncoder
предназначено для меток / целевой / зависимой переменной.