`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 шт):

Автор решения: CrazyElf

Я попробовал на вашем списке колонок, в 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)
→ Ссылка