2
votes

Si j'étiquette des données catégorielles, dois-je toujours utiliser categorical_feature lors de la création d'un ensemble de données LightGBM?

J'essaie de créer un modèle simple dans lightgbm en utilisant deux fonctionnalités, l'une est catégorique et l'autre est une distance. Je suis un tutoriel ( https://sefiks.com/2018/10/13/a-gentle-introduction-to-lightgbm-for-applied-machine-learning/ ) qui indique que même après LabelEncoding, je dois encore dire lightgbm que ma fonction encodée est de nature catégorique. Cependant, je reçois cette série de messages d'avertissement lorsque j'essaye de le faire:

trainDataProc = pd.read_csv('trainDataPrepared.csv', header=0)

le=prep.LabelEncoder()

num_columns=trainDataProc.shape[1]

for i in range(0, num_columns):
    column_name=trainDataProc.columns[i]
    column_type=trainDataProc[column_name].dtypes
    if column_type == 'object':
        le.fit(trainDataProc[column_name])
        encoded_feature=le.transform(trainDataProc[column_name])
        trainDataProc[column_name]=pd.DataFrame(encoded_feature)

# Prepare train X and Y column names.
trainColumnsX = ['type', 'dist']
cat_feat=['type']
trainColumnsY = ['scalar']

# Perform K-fold split.
kfold = mls.KFold(n_splits=5, shuffle=True, random_state=0)
result = next(kfold.split(trainDataProc), None)
train = trainDataProc.iloc[result[0]]
test = trainDataProc.iloc[result[1]]

# Train model via lightGBM.
lgbTrain = lgb.Dataset(train[trainColumnsX], label=train[trainColumnsY], 
                       categorical_feature=cat_feat)
lgbEval = lgb.Dataset(test[trainColumnsX], label=test[trainColumnsY])

# Model parameters.
params = {
    'boosting_type': 'gbdt',
    'objective': 'regression',
    'metric': {'mae'},
    'num_leaves': 25,
    'learning_rate': 0.0001,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': 0
}

# Set up training.
gbm = lgb.train(params,
                lgbTrain,
                num_boost_round=200,
                valid_sets=lgbEval,
                early_stopping_rounds=50)

Ce que je me demande, c'est si lightgbm comprend en fait que la colonne est de nature catégorique. Il semble que ce soit le cas, mais je ne sais pas pourquoi le didacticiel le déclare explicitement. Voici le code que j'ai:

UserWarning: Using categorical_feature in Dataset.
  warnings.warn('Using categorical_feature in Dataset.')
UserWarning: categorical_feature in Dataset is overridden.
New categorical_feature is ['type']
 'New categorical_feature is 
    {}'.format(sorted(list(categorical_feature))))
 categorical_feature in param dict is overridden.
  warnings.warn('categorical_feature in param dict is overridden.')


0 commentaires

3 Réponses :


1
votes

La raison pour laquelle vous devriez toujours dire à LightGBM que les fonctionnalités que vous encodez sont catégoriques est que le modèle voit une variable numérique, donc il essaiera de diviser la variable en utilisant un seuil plus grand ou plus petit qu'un seuil qui n'est pas correct si nous parlons à propos d'une variable catégorielle.


0 commentaires

0
votes

Même si vous effectuez le codage d'étiquettes, il ne fait que étiqueter les valeurs dans un certain ordre. Mais cette colonne contiendra toujours des nombres, c'est pourquoi LightGBM essaiera de se diviser sur cette variable comme s'il s'agissait d'une fonctionnalité continue.
Nous devons donc fournir ce nom de colonne explicitement afin que LightGBM sache qu'il doit traiter cette variable différemment.


0 commentaires

2
votes

J'étais également confronté à un message d'avertissement similaire et j'ai consulté la documentation de scikit-learn.

Il n'est pas nécessaire de définir séparément si vous utilisez pandas Dataframe avec des fonctionnalités catégorielles (et un libellé encodé sous forme d'entiers).

La valeur par défaut du paramètre 'categorical_feature' pour LGBM est 'Auto', ce qui garantit que les colonnes catégorielles pandas sont automatiquement utilisées.


0 commentaires