传递误差的方差阈值形状

时间:2017-10-23 18:45:16

标签: python scikit-learn shape feature-selection dimensionality-reduction

我有这个功能,我试图根据方差阈值减少:

x2.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 120 entries, 0 to 119
Columns: 6083 entries, ADULT.EDUCATION to 1kmrecreacion intelectual / 1kmgeo
dtypes: float64(6083)
memory usage: 5.6 MB

我需要保留功能名称,所以我从另一个Stackoverflow问题中获得了这个函数:

def VarianceThreshold_selector(data):
    columns = data.columns
    selector = VarianceThreshold(.5)
    selector.fit_transform(data)
    labels = [columns[x] for x in selector.get_support(indices=True) if x]
    return pd.DataFrame(selector.fit_transform(data), columns=labels)

我申请:

VarianceThreshold_selector(x2)

我收到此错误:

  

传递值的形状是(4105,120),索引暗示(4104,120)

我该如何解决?

2 个答案:

答案 0 :(得分:0)

您的函数处理错误。我猜您在应用VarianceThreshold后只有4104个标签,但是您尝试传递具有4105列的pd.dataframe。

def VarianceThreshold_selector(data):
    columns = data.columns.values.tolist()
    selector = VarianceThreshold(.5)
    newdata = selector.fit_transform(data)
    labels = [columns[x] for x in selector.get_support(indices=True)]
    return pd.DataFrame(newdata, columns=labels)

答案 1 :(得分:0)

你不必创建一个很长的函数来做到这一点。拟合 VT 估计器后,您可以调用 .get_support() 属性,该属性提供一个布尔掩码。然后,您可以使用它来对原始数据帧进行子集化:

from sklearn.feature_selection import VarianceThresholding

vt = VarianceThresholding(.5)
_ = vt.fit(X_train, y_train)

mask = vt.get_support()

df_reduced = df_original.loc[:, mask]