我有这个功能,我试图根据方差阈值减少:
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)
我该如何解决?
答案 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]