特征选择和分类变量
Feature selection and categorical variables
我处理主要包含二进制变量的数据集。然而,其中两个是具有多个值(字符串)的分类值。我想使用套索应用特征选择,但出现错误 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()
使用 onehot 是有问题的,因为每个类别都将被编码为二进制并将其输入套索不允许选择整个类别变量,我猜这就是你想要的。您也可以查看此 post.
您可以在 python 中使用 group lasso 实现。下面我使用了一个示例数据集:
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放在一起,也可以转成dense,但是如果数据量大的话会出问题:
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}
另请查看 help page 在管道中使用它。
我处理主要包含二进制变量的数据集。然而,其中两个是具有多个值(字符串)的分类值。我想使用套索应用特征选择,但出现错误 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()
使用 onehot 是有问题的,因为每个类别都将被编码为二进制并将其输入套索不允许选择整个类别变量,我猜这就是你想要的。您也可以查看此 post.
您可以在 python 中使用 group lasso 实现。下面我使用了一个示例数据集:
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放在一起,也可以转成dense,但是如果数据量大的话会出问题:
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}
另请查看 help page 在管道中使用它。