Вопрос или проблема
Я хочу использовать 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.
Решение
-
Конвертация в 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])]
Если у вас есть конкретные имена признаков, вы могли бы указать их явно.
-
Обновление вызова 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
и назначение имен столбцов — необходимые шаги, чтобы избежать ошибок и обеспечить корректную работу алгоритма. Следуя приведённым рекомендациям, вы сможете успешно реализовать выбор признаков и повысить качество вашей модели.