如何从数据集中过滤非常稀疏的特征
How to filter very sparse features from a data set
我正在尝试预处理一个数据集,我想通过设置一个阈值来删除非常稀疏的列,以便删除值小于该阈值的条目的列。
下面的代码应该可以完成工作,但我不明白它是如何工作的,请协助解释或建议我如何完成这项工作。谢谢!
sparse_col_idx = ((x_sparse > 0).mean(0) > 0.05).A.ravel()
x_sparse 有暗淡的 (12060, 272776)
让我们将其分解为几个步骤。假设 x_sparse 是一个 DataFrame,那么 x_sparse > 0
将 return 一个具有完全相同维度、索引和列的 DataFrame,每个值根据给定的条件为 True 或 False(这里是值的位置> 0)
.mean(0)
这取每列的平均值。由于 False 的计算结果为 0 而 True 的计算结果为 1,因此 mean()
returns 是满足条件的列的百分比。此时你进入了一个系列,其中列名是索引,值是满足条件的百分比。
> 0.05
现在,这会将之前的 Series 更改为与满足条件的列名称相匹配的布尔值系列。
.A.ravel()
这看起来没有必要。我将在下面想出一个简单的例子来展示这些步骤。
创建一个具有随机正常值的 DataFrame
np.random.seed(3)
x_sparse = pd.DataFrame(data=np.random.randn(100, 5), columns=list('abcde'))
print(x_sparse.head())
输出:
a b c d e
0 1.788628 0.436510 0.096497 -1.863493 -0.277388
1 -0.354759 -0.082741 -0.627001 -0.043818 -0.477218
2 -1.313865 0.884622 0.881318 1.709573 0.050034
3 -0.404677 -0.545360 -1.546477 0.982367 -1.101068
4 -1.185047 -0.205650 1.486148 0.236716 -1.023785
# the argument 0 is unnecessary. The default is get average of columns
(x_sparse > 0).mean()
输出
a 0.48
b 0.52
c 0.44
d 0.55
e 0.45
# create a threshold
threshold = .5
(x_sparse > 0).mean() > threshold
输出
a False
b True
c False
d True
e False
保留特定列
threshold = .5
keep = (x_sparse > 0).mean() > threshold
x_sparse[x_sparse.columns[keep]]
输出
b d
0 0.436510 -1.863493
1 -0.082741 -0.043818
2 0.884622 1.709573
3 -0.545360 0.982367
4 -0.205650 0.236716
我正在尝试预处理一个数据集,我想通过设置一个阈值来删除非常稀疏的列,以便删除值小于该阈值的条目的列。
下面的代码应该可以完成工作,但我不明白它是如何工作的,请协助解释或建议我如何完成这项工作。谢谢!
sparse_col_idx = ((x_sparse > 0).mean(0) > 0.05).A.ravel()
x_sparse 有暗淡的 (12060, 272776)
让我们将其分解为几个步骤。假设 x_sparse 是一个 DataFrame,那么 x_sparse > 0
将 return 一个具有完全相同维度、索引和列的 DataFrame,每个值根据给定的条件为 True 或 False(这里是值的位置> 0)
.mean(0)
这取每列的平均值。由于 False 的计算结果为 0 而 True 的计算结果为 1,因此 mean()
returns 是满足条件的列的百分比。此时你进入了一个系列,其中列名是索引,值是满足条件的百分比。
> 0.05
现在,这会将之前的 Series 更改为与满足条件的列名称相匹配的布尔值系列。
.A.ravel()
这看起来没有必要。我将在下面想出一个简单的例子来展示这些步骤。
创建一个具有随机正常值的 DataFrame
np.random.seed(3)
x_sparse = pd.DataFrame(data=np.random.randn(100, 5), columns=list('abcde'))
print(x_sparse.head())
输出:
a b c d e
0 1.788628 0.436510 0.096497 -1.863493 -0.277388
1 -0.354759 -0.082741 -0.627001 -0.043818 -0.477218
2 -1.313865 0.884622 0.881318 1.709573 0.050034
3 -0.404677 -0.545360 -1.546477 0.982367 -1.101068
4 -1.185047 -0.205650 1.486148 0.236716 -1.023785
# the argument 0 is unnecessary. The default is get average of columns
(x_sparse > 0).mean()
输出
a 0.48
b 0.52
c 0.44
d 0.55
e 0.45
# create a threshold
threshold = .5
(x_sparse > 0).mean() > threshold
输出
a False
b True
c False
d True
e False
保留特定列
threshold = .5
keep = (x_sparse > 0).mean() > threshold
x_sparse[x_sparse.columns[keep]]
输出
b d
0 0.436510 -1.863493
1 -0.082741 -0.043818
2 0.884622 1.709573
3 -0.545360 0.982367
4 -0.205650 0.236716