Python 特征选择和分类变量

Python 特征选择和分类变量,python,scikit-learn,feature-selection,label-encoding,Python,Scikit Learn,Feature Selection,Label Encoding,我处理的数据集主要包含二进制变量。但是,其中两个是具有多个值(字符串)的类别。我想使用套索应用特征选择,但我有一个错误Keyerror:无法将字符串转换为浮点: 我是否应该使用标签编码,然后进行功能选择?你知道怎么处理吗 这是我的密码 X = data.iloc[:,:-1] y = data.iloc[:,-1] scaler = MinMaxScaler() scaler.fit(X) X_scaled = scaler.transform() selector = SelectFromM

我处理的数据集主要包含二进制变量。但是,其中两个是具有多个值(字符串)的类别。我想使用套索应用特征选择,但我有一个错误
Keyerror:无法将字符串转换为浮点:

我是否应该使用
标签编码
,然后进行功能选择?你知道怎么处理吗

这是我的密码

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()

使用onehot是有问题的,因为每个类别都将被编码为二进制,并且将其输入到lasso中不允许选择作为一个整体的类别变量,我猜这就是你们想要的。你也可以看看这个

您可以使用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)
定义分类和数字(二进制)列。您不需要最小-最大定标器,因为您的值是二进制的。接下来,我们对分类列进行onehot编码并提取组:

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}

还可以查看在管道中使用它的方法。

请发布您的代码