/hpbandster/optimizers/learning_curve_models/arif.py

https://github.com/automl/HpBandSter · Python · 157 lines · 152 code · 4 blank · 1 comment · 0 complexity · 3f0ed45d4b7673fa869f44e666632194 MD5 · raw file

  1. import sys
  2. sys.path.append("../../")
  3. import numpy as np
  4. from sklearn.ensemble import RandomForestRegressor as rfr
  5. from hpbandster.learning_curve_models.base import LCModel as lcm_base
  6. from IPython import embed
  7. class ARIF(lcm_base):
  8. """
  9. An 'Auto Regressive Integrated (Random) Forest'
  10. """
  11. def __init__(self, order=2, diff_order=0):
  12. """
  13. Parameters:
  14. -----------
  15. order: int
  16. the order of the 'autoregressiveness'
  17. diff_order: int
  18. the differencing order used
  19. TODO: Not used so far!
  20. """
  21. self.order = order
  22. self.diff_order = diff_order
  23. def apply_differencing(self, series, order=None):
  24. if order is None: order = self.diff_order
  25. for o in range(order):
  26. series = series[1:]-series[:-1]
  27. return series
  28. def invert_differencing(self, initial_part, differenced_rest, order=None):
  29. """
  30. function to invert the differencing
  31. """
  32. if order is None: order = self.diff_order
  33. # compute the differenced values of the initial part:
  34. starting_points = [ self.apply_differencing(initial_part, order=order)[-1] for order in range(self.diff_order)]
  35. actual_predictions = differenced_rest
  36. import pdb
  37. pdb.set_trace()
  38. for s in starting_points[::-1]:
  39. actual_predictions = np.cumsum(np.hstack([s, actual_predictions]))[1:]
  40. return(actual_predictions)
  41. def fit(self, losses, configs=None):
  42. if configs is None:
  43. configs = [[]]*len(times)
  44. # convert learning curves into X and y data
  45. X = []
  46. y = []
  47. for l,c in zip(losses, configs):
  48. l = self.apply_differencing(l)
  49. for i in range(self.order, len(l)):
  50. X.append(np.hstack([l[i-self.order:i], c]))
  51. y.append(l[i])
  52. self.X = np.array(X)
  53. self.y = np.array(y)
  54. self.rfr = rfr().fit(self.X,self.y)
  55. def extend_partial(self, obs_losses, num_steps, config=None):
  56. # TODO: add variance predictions
  57. if config is None:
  58. config = []
  59. d_losses = self.apply_differencing(obs_losses)
  60. for t in range(num_steps):
  61. x = np.hstack([d_losses[-self.order:], config])
  62. y = self.rfr.predict([x])
  63. d_losses = np.hstack([d_losses, y])
  64. prediction = self.invert_differencing( obs_losses, d_losses[-num_steps:])
  65. return(prediction)
  66. if __name__ == "__main__":
  67. sys.path.append("/home/sfalkner/repositories/bitbucket/learning_curve_prediction")
  68. from lc_prediction.utils import load_configs
  69. #data = load_configs("/home/sfalkner/repositories/bitbucket/learning_curve_prediction/data/conv_net_cifar10", 256+128)
  70. data = load_configs("/home/sfalkner/repositories/bitbucket/learning_curve_prediction/data/fc_net_mnist", 1024)
  71. #data = load_configs("/home/sfalkner/repositories/bitbucket/learning_curve_prediction/data/lr_mnist", 1024)
  72. data = (data[0], data[1][:,:40])
  73. import matplotlib.pyplot as plt
  74. #plt.plot(data[1].T)
  75. #plt.show()
  76. full_lcs = [ lc for lc in data[1]]
  77. T_max = len(full_lcs[0])
  78. learning_curves = [ lc[:np.random.randint(lc.shape[0]-8) + 8]for lc in data[1]]
  79. #learning_curves = [ lc[:4+ int(np.random.exponential(5))] for lc in data[1]]
  80. times = [np.arange(1, lc.shape[0]+1) for lc in learning_curves]
  81. lc_model = ARIF(order=3, diff_order=2)
  82. test_order = 2
  83. random_sequence = np.random.rand(5)
  84. tmp = lc_model.apply_differencing(random_sequence, order=test_order)
  85. for i in range(test_order+1):
  86. print(lc_model.apply_differencing(random_sequence, order=i))
  87. reconstruction = lc_model.invert_differencing(random_sequence[:1+test_order], tmp, order=test_order)
  88. embed()
  89. lc_model.fit(learning_curves, data[0])
  90. for i in range(16):
  91. pred_times = range(times[i][-1]+1, T_max)
  92. #pred = lc_model.extend_partial(learning_curves[i], min(10, T_max - len(learning_curves[i])), config=data[0][i])
  93. pred = lc_model.extend_partial(learning_curves[i], T_max - len(learning_curves[i]), config=data[0][i])
  94. plt.plot(full_lcs[i])
  95. plt.plot(range(len(learning_curves[i]), len(learning_curves[i])+ len(pred)), pred, '--')
  96. plt.show()
  97. embed()