我在pandas DataFrame上使用sklearn进行方差阈值特征选择。为了避免特征选择产生偏差 - VarianceThreshold只是第一步 - 我将原始数据集划分为特征选择部分(X_selection,y_selection)和建模部分(X_model,y_model)。然而,它们以相同的顺序包含相同的列。所以,我开始定义选择器并在之后拟合数据:
# get column names
X_columns = X_selection.columns
# doing the variance threshold feature selection
selector = VarianceThreshold()
selector.fit(X_selection)
# filtering the selected column names
X_columns = X_columns[selector.get_support()]
# transform original data according to selector
X_selection = pd.DataFrame(selector.transform(X_selection), columns = X_columns)
X_model = pd.DataFrame(selector.transform(X_model), columns = X_columns)
不幸的是,我遇到了生成的X_selection和X_model中的行混乱。例如,在转换之前,我已经获得了X_model中的一些示例性行:
COL_X
0 0.000000
1 0.000000
2 0.000000
10 0.000000
25 0.185185
150 0.037037
3333 0.000000
16000 0.000000
转换后,调用X_model的相同行索引给了我:
COL_X
0 0.000000
1 0.000000
2 0.111111
10 0.000000
25 0.000000
150 0.000000
3333 0.000000
16000 0.111111
在我的理解中,变换以一种未知的方式将行排列在一起。虽然与类标签的y_model数组的关系被破坏了,因为这里的行顺序没有变化。感谢您提供任何意见,如何解决或隐藏我的错误。
我不知道的事实是,当将得到的转换数组再次转换为pandas DataFrame时,pandas会将新索引(从0开始,递增1)分配给DataFrame:
X_model = pd.DataFrame(selector.transform(X_model), columns = X_columns)
当要求具有“旧”行索引的行的子集时,这给出了比以前更多的其他值。所以,序列仍然是相同的。但是,我想保留原始的行索引。因此,我现在根据仍保留在y_model中的旧索引设置索引。
X_model = X_model.set_index(y_model.index)