我最近发现了folds参数in xgb.cv,它允许指定验证集的索引.xgb.cv.mknfold然后在xgb.cv其中调用辅助函数,然后将每个折叠的剩余索引作为相应折叠的训练集的索引.
问题:我可以通过xgboost接口中的任何接口指定训练和验证索引吗?
我的主要动机是执行时间序列交叉验证,我不希望将"非验证"索引自动指定为训练数据.举例说明我想做的事情:
# assume i have 100 strips of time-series data, where each strip is X_i
# validate only on 10 points after training
fold1: train on X_1-X_10, validate on X_11-X_20
fold2: train on X_1-X_20, validate on X_21-X_30
fold3: train on X_1-X_30, validate on X_31-X_40
...
Run Code Online (Sandbox Code Playgroud)
目前,使用该folds参数将迫使我使用剩余的示例作为验证集,这极大地增加了误差估计的方差,因为剩余数据大大超过训练数据并且可能具有与训练数据非常不同的分布,尤其是对于训练数据.较早的折叠.这就是我的意思:
fold1: train on X_1-X_10, validate on X_11-X100 # huge error
...
Run Code Online (Sandbox Code Playgroud)
如果它们方便(即不要求我撬开源代码)并且不会使原始xgboost实现中的效率无效,我对其他软件包的解决方案持开放态度.
我试图实现一个简单的邻接矩阵来跟踪哪些节点连接到无向图中的哪些节点.但是,我的邻接矩阵通过改变整个列而不是单个单元格而不断搞砸.这是我的代码:
def setup_adj_matrix(size, edges):
# initialize matrix with zeros
adj_matrix = [[0] * size] * size
# edges is a list of tuples, representing 2 nodes connected by an edge
for edge in edges:
v1 = edge[0]
v2 = edge[1]
adj_matrix[v1][v2] = 1
adj_matrix[v2][v1] = 1
for row in adj_matrix:
print row
Run Code Online (Sandbox Code Playgroud)
对于有3个节点(0,1,2)和边[(0,1),(0,2),(1,2)]的图形,我应该得到
[[0,1,1],
[1,0,1],
[1,1,0]]
Run Code Online (Sandbox Code Playgroud)
但是,我得到的都是1.任何可能出现问题的想法?
我想从给定日期(2015 年 7 月 31 日)向后生成一系列日期。我没有得到四月的最后一天,而是得到五月的第一天,如下所示:
> seq(as.Date('2015-07-31'), as.Date('2014-09-30'), by = '-3 month')
[1] "2015-07-31" "2015-05-01" "2015-01-31" "2014-10-31"
Run Code Online (Sandbox Code Playgroud)
我也尝试传入-quarter该by选项,但出现以下错误:
> seq(as.Date('2015-07-31'), as.Date('2014-09-30'), by = '-quarter')
Error in seq.Date(as.Date("2015-07-31"), as.Date("2014-09-30"), by = "-quarter") :
invalid string for 'by'
Run Code Online (Sandbox Code Playgroud)
虽然我可以检查当月的某一天并在日期被过度调整到错误的月份时进行相应的更正,但我想知道是否存在一个简洁的代码片段来执行上述操作?