我正在尝试应用特征选择。问题是使用整个数据框会导致内存错误。因此,我决定裁剪我的数据框,以便能够应用接下来的特征选择:
# 这是原始数据框
X_full = df_train[df_train.columns[0:size]] # 76000(rows)*300(cols)
y_full = df_train[[len(df_train.columns)-1]] # 76000(rows)*1(col)
y_full
包含0和1,且1的数量少于5%。所有其他列只包含数字,但我们不知道这些数字的含义。
# 这是我减少行数到10%的方法
test_frac = 0.10
count = len(X_full)
X = X_full.iloc[-int(count*test_frac):]
y = y_full.iloc[-int(count*test_frac):]
# 然后我使用L1范数惩罚的线性模型来降低数据的维度
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
print "X_new.shape", X_new.shape
print X_new
问题是我需要获取被删除的列列表,以便从原始数据框中删除它们。我该怎么做呢?
回答:
听起来你是在寻找SelectFromModel.get_support()
。根据文档,它可以返回以下两种形式之一:(1) 一个布尔数组,其长度等于所有特征的数量;(2) 包含特征的整数索引:
一个从特征向量中选择保留特征的索引。如果indices为False,这是一个形状为[#输入特征]的布尔数组,其中一个元素为True当且仅当其对应的特征被选择保留。如果indices为True,这是一个形状为[#输出特征]的整数数组,其值是输入特征向量的索引。