Ошибка графика частичной зависимости (PDPbox) на модели lightGBM: «неправильно передано 3 элемента, подразумевается размещение» - PullRequest
0 голосов
/ 22 марта 2020

У меня есть фрагмент кода, подобный этому

import lightgbm as lgb
from pdpbox import pdp, get_dataset, info_plots
import seaborn as sns
from sklearn.model_selection import train_test_split

#load some data
df = sns.load_dataset("iris")

X_train, X_test, y_train, y_test = train_test_split(
        X, y, train_size=0.80)
lgd_train = lgb.Dataset(X_train, label=y_train)
params={ "objective": "multiclass",
            "num_class": 3,}
clf = lgb.train(params, d_train)
#plot partial dependence
pdp_dist = pdp.pdp_isolate(
            model=clf, dataset=X_train, model_features=X_train.columns, feature='petal_width'
        )
pdp.pdp_plot(pdp_dist, 'petal_width')

Возможно, это как-то связано с выводом предиката, вероятно, для класса 3 iris, но я не знаю, как это исправить.

Если я использую другой синтаксис lightGBM lgb.LGBMClassifier (). Fit (X_train, y_train), то он будет возвращать ошибку

[LightGBM] [Fatal] Не поддержка специальных JSON символов в имени элемента.

, несмотря на мои данные, абсолютно не имеет специальных символов. Есть ли способ обойти это? Thanks1

1 Ответ

0 голосов
/ 24 марта 2020

Ваше сообщение об ошибке исчезнет, ​​если вы переключитесь на sklearn API lightgbm. Это правильный API, предложенный в документах :

модель: встроенная sklearn модель

Подтверждение

import lightgbm as lgb
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from pdpbox import pdp, get_dataset, info_plots

#load some data
df = sns.load_dataset("iris")
X = df.iloc[:,:4]
y , mapping = pd.factorize(df["species"])

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.80)

lgd_train = lgb.Dataset(X_train, label=y_train)
params={ "objective": "multiclass",
            "num_class": 3,}

clf = lgb.LGBMClassifier() # <-- Choose sklearn API !!!
clf.fit(X_train, y_train)

pdp_dist = pdp.pdp_isolate(model=clf, dataset=X_train
                           , model_features=X_train.columns
                           , feature='petal_width')
pdp.pdp_plot(pdp_dist, 'petal_width');

enter image description here

Что касается вашей другой ошибки, я не могу воспроизвести ее на своем компьютере с lightgbm v. 2.3.1, установленным с conda-forge.

Итак, я полагаю, у вас есть 2 курса действий:

  • установите версию lightgbm, у которой нет такой проблемы
  • или замените все не-буквенные символы c в именах столбцов:
X_train.columns = ["".join (c if c.isalnum() else "_" for c in str(x)) for x in X_train.columns]

, как предлагается здесь

...