在Scikit功能选择后保留功能名称

时间:2016-10-02 00:56:07

标签: python pandas scikit-learn output feature-selection

在Scikit-Learn上运行一组数据的方差阈值后,它会删除一些功能。我觉得我做了一些简单但又愚蠢的事情,但我想保留其余功能的名称。以下代码:

Comment

更改以下数据(这只是行的一小部分):

def VarianceThreshold_selector(data):
    selector = VarianceThreshold(.5) 
    selector.fit(data)
    selector = (pd.DataFrame(selector.transform(data)))
    return selector
x = VarianceThreshold_selector(data)
print(x)

到此(再次只是行的一小部分)

Survived    Pclass  Sex Age SibSp   Parch   Nonsense
0             3      1  22   1        0        0
1             1      2  38   1        0        0
1             3      2  26   0        0        0

使用get_support方法,我知道这些是Pclass,Age,Sibsp和Parch,所以我更倾向于返回更像:

     0         1      2     3
0    3      22.0      1     0
1    1      38.0      1     0
2    3      26.0      0     0

有一种简单的方法吗?我是Scikit Learn的新手,所以我可能只是做些傻事。

6 个答案:

答案 0 :(得分:17)

这样的事情有帮助吗?如果您传递一个pandas数据帧,它将获取列并使用您提到的get_support来按列索引遍历列列表,以仅提取符合方差阈值的列标题。

>>> df
   Survived  Pclass  Sex  Age  SibSp  Parch  Nonsense
0         0       3    1   22      1      0         0
1         1       1    2   38      1      0         0
2         1       3    2   26      0      0         0

>>> from sklearn.feature_selection import VarianceThreshold
>>> def variance_threshold_selector(data, threshold=0.5):
    selector = VarianceThreshold(threshold)
    selector.fit(data)
    return data[data.columns[selector.get_support(indices=True)]]

>>> variance_threshold_selector(df, 0.5)
   Pclass  Age
0       3   22
1       1   38
2       3   26
>>> variance_threshold_selector(df, 0.9)
   Age
0   22
1   38
2   26
>>> variance_threshold_selector(df, 0.1)
   Survived  Pclass  Sex  Age  SibSp
0         0       3    1   22      1
1         1       1    2   38      1
2         1       3    2   26      0

答案 1 :(得分:5)

可能有更好的方法可以做到这一点,但对于那些感兴趣的人我是怎么做的:

def VarianceThreshold_selector(data):

    #Select Model
    selector = VarianceThreshold(0) #Defaults to 0.0, e.g. only remove features with the same value in all samples

    #Fit the Model
    selector.fit(data)
    features = selector.get_support(indices = True) #returns an array of integers corresponding to nonremoved features
    features = [column for column in data[features]] #Array of all nonremoved features' names

    #Format and Return
    selector = pd.DataFrame(selector.transform(data))
    selector.columns = features
    return selector

答案 2 :(得分:4)

我来到这里寻找让fit_transform()data_transformed = data.loc[:, selector.get_support()] 返回数据框的方法,但我怀疑它不受支持。

但是,您可以更加干净地对数据进行子集化,如下所示:

plugins: [
    new Webpack.optimize.UglifyJsPlugin({
      compress: {
        drop_console: true,
      }
    }
]

答案 3 :(得分:2)

由于我对Jarad的功能有一些问题,我把它与pteehan的解决方案混在一起,我发现它更可靠。我还添加了NA替换作为标准,因为VarianceThreshold不喜欢NA值。

def variance_threshold_select(df, thresh=0.0, na_replacement=-999):
    df1 = df.copy(deep=True) # Make a deep copy of the dataframe
    selector = VarianceThreshold(thresh)
    selector.fit(df1.fillna(na_replacement)) # Fill NA values as VarianceThreshold cannot deal with those
    df2 = df.loc[:,selector.get_support(indices=False)] # Get new dataframe with columns deleted that have NA values

    return df2

答案 4 :(得分:1)

这个代码怎么样?

columns = [col for col in df.columns]

low_var_cols = []

for col in train_file.columns:
if statistics.variance(df[col]) <= 0.1:
    low_var_cols.append(col)

然后从数据框中删除列?

答案 5 :(得分:0)

您也可以使用熊猫作为阈值

data_new = data.loc[:, data.std(axis=0) > 0.75]