使用分箱技术离散化连续数据

我有一个如下数据集,

第1到6列

1.0000         0    0.9954   -0.0589    0.8524    0.02311.0000         0    1.0000   -0.1883    0.9304   -0.36161.0000         0    1.0000   -0.0336    1.0000    0.00491.0000         0    1.0000   -0.4516    1.0000    1.00001.0000         0    1.0000   -0.0240    0.9414    0.06531.0000         0    0.0234   -0.0059   -0.0992   -0.11951.0000         0    0.9759   -0.1060    0.9460   -0.2080     0         0         0         0         0         01.0000         0    0.9636   -0.0720    1.0000   -0.1433

我正在尝试使用二元分割构建决策树,其中一个问题是数据是连续的,而我的当前实现由于保持数据原样并进行分割而变得计算密集。如果你只是构建一个分类器,这可能还不算太糟糕。

在我的情况下,我正在进行十折交叉验证,并将分类器数量从5增加到50(装袋法)。我考虑使用分箱方法,将数据分成0.2的区间,但我意识到其中有负数。我使用Matlab进行实现。我是Matlab的新手,不确定是否有预定义的方法来处理这种情况。


回答:

不确定这是否完全解决了你的问题,但如果你的问题是动态定义“区间”,你可以这样做:

% 查找矩阵的最小值和最大值Mmin = min(M(:));Mmax = max(M(:));% 假设你有一个包含正负值的矩阵M,并希望将其分成0.2的区间buckets = Mmin:0.2:Mmax;% 或者假设你希望将它们均匀分布在固定数量的区间中,比如100buckets = linspace(Mmin,100,Mmax);

编辑:

假设你想根据某一列的值(比如第3列)来划分矩阵,你可以这样做:

% 将相关列定义为向量以便于处理v = M(:,3);% 假设你希望将它们均匀分布在固定数量的区间中,比如100buckets = linspace(min(v),100,max(v));% 现在查看每一行属于哪个区间bucket_idx = ones(size(v));for i = 2:length(buckets)    bucket_idx(v>buckets(i-1)&(v<buckets(i)) = i;end

这会告诉你每一行属于哪个区间,虽然最好能将这个过程向量化,但目前这是我能想到的最快的解决方案。我认为一旦你知道每样东西属于哪个区间,你应该能够解决剩下的问题。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注