content: # This code is supporting material for the book
  # Building Machine Learning Systems with Python
  # by Willi Richert and Luis Pedro Coelho
  # published by PACKT Publishing
  #
  # It is made available under the MIT License
  
  import numpy as np
  from sklearn.datasets import load_svmlight_file
  from sklearn.cross_validation import KFold
  from sklearn.linear_model import ElasticNetCV, ElasticNet
  from sklearn.metrics import mean_squared_error, r2_score
  from matplotlib import pyplot as plt
  
  data, target = load_svmlight_file('data/E2006.train')
  
  # Edit the lines below if you want to switch method:
  # from sklearn.linear_model import Lasso
  # met = Lasso(alpha=0.1)
  met = ElasticNet(alpha=0.1)
  
  kf = KFold(len(target), n_folds=5)
  pred = np.zeros_like(target)
  for train, test in kf:
      met.fit(data[train], target[train])
      pred[test] = met.predict(data[test])
  
  print('[EN 0.1] RMSE on testing (5 fold), {:.2}'.format(np.sqrt(mean_squared_error(target, pred))))
  print('[EN 0.1] R2 on testing (5 fold), {:.2}'.format(r2_score(target, pred)))
  print('')
  
  # Construct an ElasticNetCV object (use all available CPUs)
  met = ElasticNetCV(n_jobs=-1)
  
  kf = KFold(len(target), n_folds=5)
  pred = np.zeros_like(target)
  for train, test in kf:
      met.fit(data[train], target[train])
      pred[test] = met.predict(data[test])
  
  print('[EN CV] RMSE on testing (5 fold), {:.2}'.format(np.sqrt(mean_squared_error(target, pred))))
  print('[EN CV] R2 on testing (5 fold), {:.2}'.format(r2_score(target, pred)))
  print('')
  
  met.fit(data, target)
  pred = met.predict(data)
  print('[EN CV] RMSE on training, {:.2}'.format(np.sqrt(mean_squared_error(target, pred))))
  print('[EN CV] R2 on training, {:.2}'.format(r2_score(target, pred)))
  
  
  # Construct an ElasticNetCV object (use all available CPUs)
  met = ElasticNetCV(n_jobs=-1, l1_ratio=[.01, .05, .25, .5, .75, .95, .99])
  
  kf = KFold(len(target), n_folds=5)
  pred = np.zeros_like(target)
  for train, test in kf:
      met.fit(data[train], target[train])
      pred[test] = met.predict(data[test])
  
  
  print('[EN CV l1_ratio] RMSE on testing (5 fold), {:.2}'.format(np.sqrt(mean_squared_error(target, pred))))
  print('[EN CV l1_ratio] R2 on testing (5 fold), {:.2}'.format(r2_score(target, pred)))
  print('')
  
  
  fig, ax = plt.subplots()
  y = target
  ax.scatter(y, pred, c='k')
  ax.plot([-5,-1], [-5,-1], 'r-', lw=2)
  ax.set_xlabel('Actual value')
  ax.set_ylabel('Predicted value')
  fig.savefig('Figure_10k_scatter_EN_l1_ratio.png')
  
  