Выбор признаков и категориальные переменные

Я работаю с набором данных, который содержит в основном бинарные переменные. Однако два из них являются категориальными с несколькими значениями (строками). Я хочу применить выбор объекта с помощью лассо, но у меня возникает ошибка Keyerror: could not convert string to float:

Должен ли я использовать LabelEncoder, а затем выбрать функцию? Любые идеи, как с этим бороться?

Вот мой код

X = data.iloc[:,:-1]
y = data.iloc[:,-1]

scaler = MinMaxScaler()
scaler.fit(X)
X_scaled = scaler.transform()
selector = SelectFromModel(estimator=LassoCV (cv=5)).fit(X_scaled,y)
selector.get_support()

person Gvasiles    schedule 23.01.2021    source источник
comment
Пожалуйста, опубликуйте свой код   -  person gtomer    schedule 23.01.2021


Ответы (1)


Использование onehot проблематично, потому что каждая категория будет закодирована как двоичная, а ввод ее в лассо не позволяет выбрать категориальную переменную в целом, что, как я думаю, вам нужно. Вы также можете проверить этот сообщение.

Вы можете использовать реализацию группового лассо в Python. Ниже я использую пример набора данных:

import pandas as pd
import numpy as np
from sklearn.metrics import r2_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder

from group_lasso import GroupLasso
from group_lasso.utils import extract_ohe_groups

import scipy.sparse

data = pd.DataFrame({'cat1':np.random.choice(['A','B','C'],100),
                    'cat2':np.random.choice(['D','E','F'],100),
                    'bin1':np.random.choice([0,1],100),
                    'bin2':np.random.choice([0,1],100)})

data['y'] = 1.5*data['bin1'] + -3*data['bin2'] + 2*(data['cat1'] == 'A').astype('int') + np.random.normal(0,1,100)

Определите категориальные и числовые (двоичные) столбцы. Вам не нужен масштабатор min max, поскольку ваши значения являются двоичными. Затем мы сразу кодируем категориальные столбцы и извлекаем группы:

cat_columns = ['cat1','cat2']
num_columns = ['bin1','bin2']

ohe = OneHotEncoder()
onehot_data = ohe.fit_transform(data[cat_columns])
groups = extract_ohe_groups(ohe)

Соедините numeric и onehot вместе, вы также можете преобразовать их в плотные, но это может быть проблематично, если данные огромны:

X = scipy.sparse.hstack([onehot_data,scipy.sparse.csr_matrix(data[num_columns])])
y = data['y']

Аналогично сформируйте группы:

groups = np.hstack([groups,len(cat_columns) + np.arange(len(num_columns))+1])
groups

Запускаем групповое лассо:

grpLasso = GroupLasso(groups=groups,supress_warning=True,n_iter=1000)

grpLasso.sparsity_mask_
array([ True,  True,  True, False, False, False,  True,  True])

grpLasso.chosen_groups_
{0, 3, 4}

Ознакомьтесь также с справочная страница для использования в конвейере.

person StupidWolf    schedule 29.01.2021