我在pandas DataFrame上使用sklearn进行方差阈值功能选择。为了避免特征选择产生偏差 - VarianceThreshold只是第一步 - 我将原始数据集划分为特征选择部分( X_selection ,< strong> 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 数组的关系被破坏了,因为这里的行顺序没有变化。感谢您提供任何意见,如何解决或隐藏我的错误。
答案 0 :(得分:0)
我不知道的事实是,在将生成的转换数组再次转换为pandas DataFrame时,pandas会将新索引(从0开始,递增1)分配给DataFrame:
X_model = pd.DataFrame(selector.transform(X_model), columns = X_columns)
在使用&#34; old&#34;来询问行的子集时行索引,这给出了以前的其他值。所以,序列仍然是相同的。但是,我想保留原始的行索引。因此,我现在根据仍保留在 y_model 中的旧索引设置索引。
X_model = X_model.set_index(y_model.index)