Python 学习区间的并集

Python 学习区间的并集,python,machine-learning,scikit-learn,decision-tree,Python,Machine Learning,Scikit Learn,Decision Tree,假设我有N一维点xi及其标签yi=1/0。我想学习一组k间隔,这样,当标签1被赋予这些间隔中的所有点时,误差最小化。i、 e.如果数据集是: 1: 0 2: 0 3: 1 4: 1 5: 0 6: 1 7: 1 8: 1 9: 0 10: 0 11: 0 如果k=1,则最佳间隔为[3,8]。随着k的增加,它变得更加复杂 在scikit学习中是否有一些通用的算法,或者是对决策树算法的一些修改?仅仅使用直接决策树算法是行不通的,因为您无法控制k,只能控制深度,并且分支的顺序可能导致次优的最终间隔集

假设我有
N
一维点
xi
及其标签
yi=1/0
。我想学习一组
k
间隔,这样,当标签1被赋予这些间隔中的所有点时,误差最小化。i、 e.如果数据集是:

1: 0
2: 0
3: 1
4: 1
5: 0
6: 1
7: 1
8: 1
9: 0
10: 0
11: 0
如果
k=1
,则最佳间隔为
[3,8]
。随着
k
的增加,它变得更加复杂


在scikit学习中是否有一些通用的算法,或者是对决策树算法的一些修改?仅仅使用直接决策树算法是行不通的,因为您无法控制
k
,只能控制深度,并且分支的顺序可能导致次优的最终间隔集。如果需要,scikit学习中没有的东西也可以。

我相信您可以将其重新表述为整数规划问题

让我们:

以及:

最后:

a_k = Total # of 1's in the interval [0, k]
b_k = Total # of 0's in the interval [0, k]
那么,以下内容就相当于您的问题:

maximize sum_ijk (   a_j * y_ij - a_k - x_ik     # Ones inside 
                   - b_j * y_ij - b_k - x_ik     # Zeros inside
                   + b_j * x_ij - b_k - y_(i-1)k # Zeros outside
                   - a_j * x_ij - a_k - y_(i-1)k # Ones outside
         )
with respect to the constraints
    sum_j x_ij = 1 for each i
    sum_j y_ij = 1 for each i
    0 <= x_ij <= 1 for each i, j
    0 <= y_ij <= 1 for each i, j
    sum_j * y_ij - j * x_ij > 0 for each i
    sum_j * x_(i+1)j - j * y_ij > 0 for each i
i
上的总和是所有间隔。每个术语
a_j*y_ij
仅对j的一个值(该区间的右端点)为“开”。与
a_j*x_ij
相同。然后差异是某个
a_k-a_r
,这是间隔中1的总数。同样,其他三个术语统计正确和不正确分类的出现次数

对于约束条件:

sum_j x_ij = 1 for each i
sum_j y_ij = 1 for each i
假设间隔必须各有一个左端点和一个右端点,并且

sum j * y_ij - j * x_ij > 0 for each i
sum j * x_(i+1)j - j * y_ij > 0 for each i

表示左端点必须位于右端点的左侧,
i+1
st区间的右端点必须位于
i
th区间的右端点的左侧。

Hmmm。。。好吧,我喜欢这个想法,但它是线性规划,目标函数需要代表错误分类错误,而不是正确分类的1的总数。否则你可以对每个间隔说[-infinity,infinity],每次都得到所有的1,对吧?耶!我在做晚饭的时候就想到了!你可以很容易地把它改成里面的1个数+外面的0个数-里面的0个数-外面的1个数,这与错误分类率成正比。我试图修正目标函数的陈述来反映这一点。
maximize sum_ijk ( a_j * y_ij - a_k - x_ik )
sum_j x_ij = 1 for each i
sum_j y_ij = 1 for each i
sum j * y_ij - j * x_ij > 0 for each i
sum j * x_(i+1)j - j * y_ij > 0 for each i