Walk Forward Optimization & Scikit-Learn
After looking over Scikit-Learns documention, I realized that there wasn’t a cross validation iterator for walk forward optimization.
Someone on Github attempted to merge this feature, but I thought the implementation was too complicated.
So I wrote my own:
class WalkForward(object):
def __init__(self, timestamps, fold_count=1, pretraining_size=None, is_verbose=False):
self.n = len(timestamps)
self.fold_count = fold_count
self.pretraining_size = pretraining_size or int(self.n / (self.fold_count + 1.0))
self.is_verbose = is_verbose
def __iter__(self):
cv_end = self.pretraining_size
fold_length = math.ceil(float(self.n - self.pretraining_size) / self.fold_count)
for k in range(self.fold_count):
cv_start = cv_end
cv_end = min(int(cv_start + fold_length), self.n)
train = np.arange(0, cv_start)
cv = np.arange(cv_start, cv_end)
if self.is_verbose:
print len(train), len(cv)
yield train, cv
def __len__(self):
if self.pretraining_size > 0:
return self.fold_count + 1
else:
return self.fold_count