Реализация BorutaShap

Вопрос или проблема

Я хочу использовать BorutaShap для выбора признаков в моей модели. У меня есть train_x в виде numpy.ndarray, и я хочу передать его в экземпляр BorutaShap. Когда я пытаюсь обучить модель, я получаю ошибку:

AttributeError: 'numpy.ndarray' object has no attribute 'columns'

Вот мой код:

num_trans = Pipeline(steps = [('impute', SimpleImputer(strategy = 
                               'mean')), 
                          ('scale', StandardScaler())])
cat_trans = Pipeline(steps = [('impute', SimpleImputer(strategy = 
                               'most_frequent')), 
                          ('encode', OneHotEncoder(handle_unknown = 
                           'ignore'))])

from sklearn.compose import ColumnTransformer

preproc = ColumnTransformer(transformers = [('cat', cat_trans, 
                                             cat_cols), ('num', 
                                            num_trans, num_cols)])

X = preproc.fit_transform(train_data1)
X_final = preproc.transform(test_data1)

from xgboost import XGBRegressor
xgbr_model = XGBRegressor(random_state = 69, tree_method = 'gpu_hist')

from sklearn.model_selection import train_test_split, cross_val_score
train_x, test_x, train_y, test_y = train_test_split(X, y, test_size = 
                                               0.2, random_state = 69)

from BorutaShap import BorutaShap
Feature_Selector = BorutaShap(model=xgbr_model,
                              importance_measure="shap", 
                              classification=False)

Feature_Selector.fit(train_x, train_y, n_trials=10, random_state=69)

Любая помощь будет оценена!

BorutaShap ищет ввод, который имеет атрибут columns. Попробуйте преобразовать ваши данные в DataFrame Pandas.

Если вы это сделаете, вы также обнаружите, что BorutaShap хочет, чтобы элементы атрибута columns ваших данных были в строковом формате.

import pandas as pd
data = pd.DataFrame(data)
data.columns = [str(i) for i in data.columns] 
# или используйте фактические названия признаков, если у вас они имеются
# data.columns = ['feature 1', 'feature 2', ...]

Ответ или решение

Внедрение BorutaShap для выбора признаков

В процессе разработки модели машинного обучения необходимо корректно проводить отбор признаков для достижения высокой точности и производительности. Одним из полезных инструментов для этой задачи является метод BorutaShap. Однако, как показано в вашем вопросе, могут возникнуть ошибки при попытке его использования, особенно если передаваемые данные представлены в формате numpy.ndarray.

Проблема

В вашем коде возникает ошибка:

AttributeError: 'numpy.ndarray' object has no attribute 'columns'

Это связано с тем, что метод BorutaShap ожидает, что данные будут переданы в формате объекта Pandas, который имеет атрибут columns. Давайте разберёмся, как можно обойти это ограничение и корректно использовать BorutaShap.

Решение

  1. Конвертация в DataFrame: Чтобы избежать ошибки, вам нужно преобразовать данные train_x из numpy.ndarray в объект DataFrame библиотеки Pandas. Это можно сделать следующим образом:

    import pandas as pd
    
    # Преобразуем train_x в DataFrame
    train_x_df = pd.DataFrame(train_x)
    
    # Присваиваем колонки, если у вас есть соответствующие названия
    train_x_df.columns = [f'feature_{i}' for i in range(train_x_df.shape[1])]

    Если у вас есть конкретные имена признаков, вы могли бы указать их явно.

  2. Обновление вызова BorutaShap: Теперь после преобразования данных в DataFrame, вы можете передать их в BorutaShap без ошибок.

    Feature_Selector = BorutaShap(model=xgbr_model,
                                  importance_measure="shap", 
                                  classification=False)
    
    # Запуск метода fit с преобразованными данными
    Feature_Selector.fit(train_x_df, train_y, n_trials=10, random_state=69)

Пример полного кода

Итоговый код после поправок может выглядеть следующим образом:

import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.model_selection import train_test_split
from xgboost import XGBRegressor
from BorutaShap import BorutaShap

# Предположим, у вас есть preproc как описано ранее
X = preproc.fit_transform(train_data1)
X_final = preproc.transform(test_data1)

# Разделение данных на обучающие и тестовые
train_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.2, random_state=69)

# Преобразование в DataFrame
train_x_df = pd.DataFrame(train_x)
train_x_df.columns = [f'feature_{i}' for i in range(train_x_df.shape[1])]

# Создание модели XGBoost
xgbr_model = XGBRegressor(random_state=69, tree_method='gpu_hist')

# Конструкция BorutaShap
Feature_Selector = BorutaShap(model=xgbr_model, importance_measure="shap", classification=False)
Feature_Selector.fit(train_x_df, train_y, n_trials=10, random_state=69)

Заключение

Использование BorutaShap для выбора признаков может существенно улучшить вашу модель, однако важно правильно подготовить данные. Преобразование данных в DataFrame и назначение имен столбцов — необходимые шаги, чтобы избежать ошибок и обеспечить корректную работу алгоритма. Следуя приведённым рекомендациям, вы сможете успешно реализовать выбор признаков и повысить качество вашей модели.

Оцените материал
Добавить комментарий

Капча загружается...