`Do not support special JSON characters in feature name`: как использовать LGBM в колонках с русскими названиями?
У меня есть железнодорожная часть датафрейма с русскими названиями:
shop__56 | sub_type_Сумки, Альбомы, Коврики д/мыши | shop__46 | sub_type_Для дома и офиса (Цифра) | shop__49 | shop__58 | shop__37 | sub_type_Служебные | sub_type_CD локального производства | shop__22 | ... | shop__48 | sub_type_Артбуки, энциклопедии | sub_type_Подарочные издания | sub_type_PSN | shop_id | sub_type_CD фирменного производства | sub_type_DVD | sub_type_PSVita | sub_type_Комиксы, манга | sub_type_Дополнительные издания
-- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ... | 0 | 0 | 0 | 0 | 6 | 0 | 0 | 0 | 0 | 0
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ... | 0 | 0 | 0 | 0 | 41 | 0 | 0 | 0 | 0 | 0
И когда я применяю LightGBM
from lightgbm import LGBMRegressor
model_lgb = LGBMRegressor( n_estimators=200,
learning_rate=0.03,
num_leaves=32,
colsample_bytree=0.9497036,
subsample=0.8715623,
max_depth=8,
reg_alpha=0.04,
reg_lambda=0.073,
min_split_gain=0.0222415,
min_child_weight=40)
model_lgb.fit(X_train, y_train)
он увеличивает JSON имена.:
---------------------------------------------------------------------------
LightGBMError Traceback (most recent call last)
<ipython-input-125-711fbc08b2b9> in <module>
11 min_split_gain=0.0222415,
12 min_child_weight=40)
---> 13 model_lgb.fit(X_train, y_train)
/opt/conda/lib/python3.7/site-packages/lightgbm/sklearn.py in fit(self, X, y, sample_weight, init_score, eval_set, eval_names, eval_sample_weight, eval_init_score, eval_metric, early_stopping_rounds, verbose, feature_name, categorical_feature, callbacks, init_model)
777 verbose=verbose, feature_name=feature_name,
778 categorical_feature=categorical_feature,
--> 779 callbacks=callbacks, init_model=init_model)
780 return self
781
/opt/conda/lib/python3.7/site-packages/lightgbm/sklearn.py in fit(self, X, y, sample_weight, init_score, group, eval_set, eval_names, eval_sample_weight, eval_class_weight, eval_init_score, eval_group, eval_metric, early_stopping_rounds, verbose, feature_name, categorical_feature, callbacks, init_model)
615 evals_result=evals_result, fobj=self._fobj, feval=eval_metrics_callable,
616 verbose_eval=verbose, feature_name=feature_name,
--> 617 callbacks=callbacks, init_model=init_model)
618
619 if evals_result:
/opt/conda/lib/python3.7/site-packages/lightgbm/engine.py in train(params, train_set, num_boost_round, valid_sets, valid_names, fobj, feval, init_model, feature_name, categorical_feature, early_stopping_rounds, evals_result, verbose_eval, learning_rates, keep_training_booster, callbacks)
229 # construct booster
230 try:
--> 231 booster = Booster(params=params, train_set=train_set)
232 if is_valid_contain_train:
233 booster.set_train_data_name(train_data_name)
/opt/conda/lib/python3.7/site-packages/lightgbm/basic.py in __init__(self, params, train_set, model_file, model_str, silent)
2051 break
2052 # construct booster object
-> 2053 train_set.construct()
2054 # copy the parameters from train_set
2055 params.update(train_set.get_params())
/opt/conda/lib/python3.7/site-packages/lightgbm/basic.py in construct(self)
1323 init_score=self.init_score, predictor=self._predictor,
1324 silent=self.silent, feature_name=self.feature_name,
-> 1325 categorical_feature=self.categorical_feature, params=self.params)
1326 if self.free_raw_data:
1327 self.data = None
/opt/conda/lib/python3.7/site-packages/lightgbm/basic.py in _lazy_init(self, data, label, reference, weight, group, init_score, predictor, silent, feature_name, categorical_feature, params)
1149 raise TypeError('Wrong predictor type {}'.format(type(predictor).__name__))
1150 # set feature names
-> 1151 return self.set_feature_name(feature_name)
1152
1153 def __init_from_np2d(self, mat, params_str, ref_dataset):
/opt/conda/lib/python3.7/site-packages/lightgbm/basic.py in set_feature_name(self, feature_name)
1630 self.handle,
1631 c_array(ctypes.c_char_p, c_feature_name),
-> 1632 ctypes.c_int(len(feature_name))))
1633 return self
1634
/opt/conda/lib/python3.7/site-packages/lightgbm/basic.py in _safe_call(ret)
53 """
54 if ret != 0:
---> 55 raise LightGBMError(decode_string(_LIB.LGBM_GetLastError()))
56
57
LightGBMError: Do not support special JSON characters in feature name.
Так как же я могу использовать LightGBM для такого рода функций? Нужно ли их преобразовывать в английские названия колонок?
Вот все мои колонки:
Index(['shop__56', 'sub_type_Сумки, Альбомы, Коврики д/мыши', 'shop__46',
'sub_type_Для дома и офиса (Цифра)', 'shop__49', 'shop__58', 'shop__37',
'sub_type_Служебные', 'sub_type_CD локального производства', 'shop__22',
'shop__55', 'shop__18', 'shop__34', 'sub_type_Сувениры',
'sub_type_Обучающие', 'shop__7', 'shop__10', 'shop__44',
'sub_type_Live!', 'sub_type_PSP', 'month', 'sub_type_Доставка товара',
'shop__19', 'sub_type_Для дома и офиса', 'sub_type_Фигурки', 'shop__12',
'shop__38', 'sub_type_PS4', 'item_id', 'sub_type_XBOX 360',
'sub_type_XBOX ONE', 'sub_type_Live! (Цифра)', 'shop__15',
'sub_type_Элементы питания', 'shop__26', 'shop__39',
'sub_type_Сувениры (в навеску)', 'sub_type_Винил', 'shop__5',
'shop__21', 'sub_type_Аудиокниги', 'sub_type_Развитие', 'sub_type_Blu',
'shop__28', 'shop__3', 'sub_type_Атрибутика', 'shop__57',
'sub_type_Гарнитуры/Наушники', 'sub_type_Методические материалы 1С',
'sub_type_Обучающие (Цифра)', 'sub_type_MAC (Цифра)', 'shop__14',
'shop__4', 'shop__50', 'shop__52', 'sub_type_Настольные игры',
'sub_type_Настольные игры (компактные)', 'shop__25',
'sub_type_Мягкие игрушки', 'shop__59', 'shop__47', 'shop__41',
'shop__42', 'sub_type_Стандартные издания', 'shop__type', 'lat',
'sub_type_Аудиокниги (Цифра)', 'sub_type_Windows (Цифра)', 'shop__31',
'shop__16', 'shop__45', 'sub_type_Цифра', 'shop__24',
'sub_type_Аудиокниги 1С', 'sub_type_Коллекционные издания',
'item_price', 'sub_type_Гаджеты, роботы, спорт', 'lon', 'shop__6',
'shop__53', 'sub_type_Аксессуары для игр', 'shop__35', 'sub_type_MP3',
'sub_type_Коллекционное', 'shop__36', 'sub_type_PS3', 'shop__48',
'sub_type_Артбуки, энциклопедии', 'sub_type_Подарочные издания',
'sub_type_PSN', 'shop_id', 'sub_type_CD фирменного производства',
'sub_type_DVD', 'sub_type_PSVita', 'sub_type_Комиксы, манга',
'sub_type_Дополнительные издания'],
Я пытался загрузить предыдущую версию lightgbm, но когда я импортирую ее, у меня все еще есть предыдущая версия.
>>> !pip install lightgbm==2.2.3
Collecting lightgbm==2.2.3
Downloading lightgbm-2.2.3-py2.py3-none-manylinux1_x86_64.whl (1.2 MB)
|████████████████████████████████| 1.2 MB 4.3 MB/s eta 0:00:01
Requirement already satisfied: scipy in /opt/conda/lib/python3.7/site-packages (from lightgbm==2.2.3) (1.4.1)
Requirement already satisfied: numpy in /opt/conda/lib/python3.7/site-packages (from lightgbm==2.2.3) (1.19.5)
Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.7/site-packages (from lightgbm==2.2.3) (0.23.2)
Requirement already satisfied: joblib>=0.11 in /opt/conda/lib/python3.7/site-packages (from scikit-learn->lightgbm==2.2.3) (1.0.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.7/site-packages (from scikit-learn->lightgbm==2.2.3) (2.1.0)
Installing collected packages: lightgbm
Attempting uninstall: lightgbm
Found existing installation: lightgbm 3.1.1
Uninstalling lightgbm-3.1.1:
Successfully uninstalled lightgbm-3.1.1
Successfully installed lightgbm-2.2.3
>>>import lightgbm
>>>print(lightgbm.__version__)
3.1.1
Ответы (1 шт):
Я попробовал на вашем списке колонок, в Google Colab всё работает нормально, не ругается. Попробуйте версию lightgbm посвежее поставить, я пробовал с версией 2.2.3. Проверить версию можно так:
import lightgbm
print(lightgbm.__version__)
Код, на котором я тестировал, я тут постепенно добавляю колонки по одной, чтобы увидеть, на какой колонке упадёт. Так и не упало.
from lightgbm import LGBMRegressor
import lightgbm
import pandas as pd
s = ['shop__56', 'sub_type_Сумки, Альбомы, Коврики д/мыши', 'shop__46',
'sub_type_Для дома и офиса (Цифра)', 'shop__49', 'shop__58', 'shop__37',
'sub_type_Служебные', 'sub_type_CD локального производства', 'shop__22',
'shop__55', 'shop__18', 'shop__34', 'sub_type_Сувениры',
'sub_type_Обучающие', 'shop__7', 'shop__10', 'shop__44',
'sub_type_Live!', 'sub_type_PSP', 'month', 'sub_type_Доставка товара',
'shop__19', 'sub_type_Для дома и офиса', 'sub_type_Фигурки', 'shop__12',
'shop__38', 'sub_type_PS4', 'item_id', 'sub_type_XBOX 360',
'sub_type_XBOX ONE', 'sub_type_Live! (Цифра)', 'shop__15',
'sub_type_Элементы питания', 'shop__26', 'shop__39',
'sub_type_Сувениры (в навеску)', 'sub_type_Винил', 'shop__5',
'shop__21', 'sub_type_Аудиокниги', 'sub_type_Развитие', 'sub_type_Blu',
'shop__28', 'shop__3', 'sub_type_Атрибутика', 'shop__57',
'sub_type_Гарнитуры/Наушники', 'sub_type_Методические материалы 1С',
'sub_type_Обучающие (Цифра)', 'sub_type_MAC (Цифра)', 'shop__14',
'shop__4', 'shop__50', 'shop__52', 'sub_type_Настольные игры',
'sub_type_Настольные игры (компактные)', 'shop__25',
'sub_type_Мягкие игрушки', 'shop__59', 'shop__47', 'shop__41',
'shop__42', 'sub_type_Стандартные издания', 'shop__type', 'lat',
'sub_type_Аудиокниги (Цифра)', 'sub_type_Windows (Цифра)', 'shop__31',
'shop__16', 'shop__45', 'sub_type_Цифра', 'shop__24',
'sub_type_Аудиокниги 1С', 'sub_type_Коллекционные издания',
'item_price', 'sub_type_Гаджеты, роботы, спорт', 'lon', 'shop__6',
'shop__53', 'sub_type_Аксессуары для игр', 'shop__35', 'sub_type_MP3',
'sub_type_Коллекционное', 'shop__36', 'sub_type_PS3', 'shop__48',
'sub_type_Артбуки, энциклопедии', 'sub_type_Подарочные издания',
'sub_type_PSN', 'shop_id', 'sub_type_CD фирменного производства',
'sub_type_DVD', 'sub_type_PSVita', 'sub_type_Комиксы, манга',
'sub_type_Дополнительные издания']
for i in range(len(s)):
X_train = pd.DataFrame({s[j]: [1] for j in range(i+1)})
y_train = [1]
model_lgb = LGBMRegressor( n_estimators=200,
learning_rate=0.03,
num_leaves=32,
colsample_bytree=0.9497036,
subsample=0.8715623,
max_depth=8,
reg_alpha=0.04,
reg_lambda=0.073,
min_split_gain=0.0222415,
min_child_weight=40)
model_lgb.fit(X_train, y_train)