Advertisement
Guest User

Untitled

a guest
Oct 17th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.56 KB | None | 0 0
  1. def validation_plot(title, classifier, X, y, param, param_range):
  2. train_scores, valid_scores = validation_curve(classifier, X, y, param, param_range, scoring=('roc_auc'), cv=5)
  3. val_results = pd.DataFrame(columns=['Param','Type','Score','Fold'])
  4. for i, p in enumerate(param_range):
  5. ts = pd.DataFrame()
  6. ts['Score'] = train_scores[i]
  7. ts['Type'] = 'train'
  8. ts['Fold'] = i
  9. ts['Param'] = p
  10. val_results = val_results.append(ts)
  11. vs = pd.DataFrame()
  12. vs['Score'] = valid_scores[i]
  13. vs['Type'] = 'valid'
  14. vs['Fold'] = i
  15. vs['Param'] = p
  16. val_results = val_results.append(vs)
  17.  
  18. sns.set(rc={'figure.figsize':(11.7,8.27)})
  19. ax = sns.pointplot(x='Param', y='Score', hue='Type', data=val_results)
  20. ax.set(xlabel=param)
  21. ax.set_title(title)
  22. plt.show()
  23.  
  24. def learning_plot(title, classifier, X, y, train_sizes):
  25. train_sizes, train_scores, valid_scores = learning_curve(
  26. classifier, X, y, train_sizes=train_sizes, scoring=('roc_auc'), cv=5
  27. )
  28. val_results = pd.DataFrame(columns=['n','Type','Score','Fold'])
  29. for i, p in enumerate(train_sizes):
  30. ts = pd.DataFrame()
  31. ts['Score'] = train_scores[i]
  32. ts['Type'] = 'train'
  33. ts['Fold'] = i
  34. ts['n'] = p
  35. val_results = val_results.append(ts)
  36. vs = pd.DataFrame()
  37. vs['Score'] = valid_scores[i]
  38. vs['Type'] = 'valid'
  39. vs['Fold'] = i
  40. vs['n'] = p
  41. val_results = val_results.append(vs)
  42.  
  43. sns.set(rc={'figure.figsize':(11.7,8.27)})
  44. ax = sns.pointplot(x='n', y='Score', hue='Type', data=val_results)
  45. ax.set_title(title)
  46. plt.show()
  47.  
  48.  
  49.  
  50.  
  51. ---------------
  52. Ejercicio 4.1
  53. warnings.filterwarnings(action='ignore')
  54. tree_classifier = create_decision_tree_classifier_with_params(grid_tree.best_params_)
  55. validation_plot('Tree classifier', tree_classifier, X_train_np, Y_train, 'max_depth', range(1,20))
  56.  
  57. unbounded_params = grid_tree.best_params_.copy()
  58. unbounded_params['max_leaf_nodes'] = None
  59. tree_classifier = create_decision_tree_classifier_with_params(unbounded_params)
  60. validation_plot('Tree classifier unbounded leaf param', tree_classifier, X_train_np, Y_train, 'max_depth', range(1,20))
  61.  
  62. svm_linear_classifier = sklearn.svm.LinearSVC(
  63. C=grid_svm_linear.best_params_['C'],
  64. loss=grid_svm_linear.best_params_['loss'],
  65. penalty=grid_svm_linear.best_params_['penalty'],
  66. dual=grid_svm_linear.best_params_['dual'],
  67. fit_intercept=grid_svm_linear.best_params_['fit_intercept'],
  68. verbose=0
  69. )
  70. validation_plot('SVM classifier', svm_linear_classifier, X_train_np, Y_train_np, 'C', [10**e for e in range(-3, 3)] + [5 * 10**e for e in range(-4, 3)])
  71. warnings.filterwarnings(action='always')
  72.  
  73.  
  74.  
  75. ---------------
  76.  
  77.  
  78. ### Resultado Ejercicio 4.1
  79. Puede verse en las curvas que la varianza se dispara en ambos casos con el crecimiento del C y la máxima profundidad del árbol. También como el sesgo disminuye, ya que se le permite al algoritmo ajustarse mejor a los datos.
  80. Al incrementar la máxima profundidad en el árbol de decisión es fácil ver que al ser más explícito y generalizar menos se puede ajustar al entrenamiento de mejor manera. Se estanca una vez llegado a profundidad 5 dado que la máxima cantidad de hojas posibles está seteada en 10. Si se le saca este parámetro el clasificador tiene peores resultados pero fitea perfectamente el set de entrenamiento.
  81. Lo mismo pasa con el parámetro C en svm, al casi no permitir errores en la separación lineal de los datos se hace mucho hincapié en instancias que pueden tener algun atributo con mucho ruido o ser un outlier.
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88. -------------
  89. Ejercicio 4.2
  90. warnings.filterwarnings(action='ignore')
  91. tree_classifier = create_decision_tree_classifier_with_params(grid_tree.best_params_)
  92. learning_plot('Tree classifier', tree_classifier, X_train_np, Y_train_np, np.linspace(0.1,1,10))
  93.  
  94. svm_linear_classifier = sklearn.svm.LinearSVC(
  95. C=grid_svm_linear.best_params_['C'],
  96. loss=grid_svm_linear.best_params_['loss'],
  97. penalty=grid_svm_linear.best_params_['penalty'],
  98.  
  99. dual=grid_svm_linear.best_params_['dual'],
  100. fit_intercept=grid_svm_linear.best_params_['fit_intercept'],
  101. )
  102. learning_plot('SVM classifier C=0.05', svm_linear_classifier, X_train_np, Y_train_np, np.linspace(0.1,1,10))
  103.  
  104. svm_linear_classifier = sklearn.svm.LinearSVC(
  105. C=0.005,
  106. loss=grid_svm_linear.best_params_['loss'],
  107. penalty=grid_svm_linear.best_params_['penalty'],
  108. dual=grid_svm_linear.best_params_['dual'],
  109. fit_intercept=grid_svm_linear.best_params_['fit_intercept'],
  110. )
  111. learning_plot('SVM classifier C=0.005', svm_linear_classifier, X_train_np, Y_train_np, np.linspace(0.1,1,10))
  112. warnings.filterwarnings(action='always')
  113.  
  114.  
  115. ------------------
  116. ### Resultado Ejercicio 4.2
  117. Parece que agregando más datos de entrenamiento al clasificador de árboles de decisión se achicaría la varianza y mejoraría el score sobre validación.
  118. En cuanto al SVM, parece bastante estancado. Eligiendo el C como se indica en el Ejercicio 4.1 se obtiene una varianza mucho mejor pagando con un mayor sesgo.
  119.  
  120.  
  121. ------------------
  122. Ejercicio 4.3
  123.  
  124. rf = RandomForestClassifier(n_estimators=200)
  125.  
  126. warnings.filterwarnings(action='ignore')
  127. validation_plot('Random Forest classifier max_depth=None', rf, X_train_np, Y_train_np, 'max_features', [1]+[ii for ii in range(25, 201,25)] )
  128. warnings.filterwarnings(action='always')
  129.  
  130. rf = RandomForestClassifier(n_estimators=200, max_depth=3)
  131.  
  132. warnings.filterwarnings(action='ignore')
  133. validation_plot('Random Forest classifier max_depth=3', rf, X_train_np, Y_train_np, 'max_features', [1]+[ii for ii in range(25, 201, 25)] )
  134. warnings.filterwarnings(action='always')
  135.  
  136.  
  137. ------------------
  138.  
  139. Al no tener un límite máximo de altura, los árboles parecían adaptarse mucho a los datos de entrenamiento y se tenía una varianza muy alta.
  140. Se bajó la altura de los árboles máxima para ver si se podía incrementar un poco el sesgo y bajar la varianza, pero no pareció funcionar.
  141. Esperabamos que al incrementar max_features la varianza aumente y el sesgo baje, sin embargo, no se obtuvieron estos resultados.
  142.  
  143.  
  144. -----------------
  145.  
  146.  
  147. rf = RandomForestClassifier()
  148. rf_arguments = [
  149. {
  150. 'n_estimators': np.arange(10,201,50),
  151. 'max_depth': [2, 3, 4],
  152. 'max_features': np.arange(0.01,1,0.1),
  153. 'n_jobs': [-1]
  154. }
  155. ]
  156.  
  157.  
  158. warnings.filterwarnings(action='ignore')
  159. grid_rf = apply_grid_search_on_classifier_and_parameters(rf, rf_arguments, X_train_np, Y_train_np, error_score='raise')
  160. warnings.filterwarnings(action='always')
  161. top_results(grid_rf, 10)
  162. __df = pd.DataFrame(grid_rf.cv_results_["params"])
  163. __df["mean_score_validation"] = grid_rf.cv_results_["mean_test_score"]
  164. __df["mean_score_training"] = grid_rf.cv_results_["mean_train_score"]
  165. plt.figure(figsize=(10,10))
  166. line = np.linspace(0.45, 1.0,30)
  167. sns.scatterplot(__df["mean_score_training"], __df["mean_score_validation"])
  168. sns.lineplot(x=line, y=line)
  169.  
  170.  
  171. ---------------
  172. Ejercicio Extra
  173. gbc = GradientBoostingClassifier()
  174. gbc_arguments = [
  175. {
  176. 'loss': ['deviance', 'exponential'],
  177. 'learning_rate': uniform(loc=0, scale=1),
  178. 'n_estimators': randint(1, 400),
  179. 'max_depth': randint(2, 5),
  180. 'max_features': uniform(loc=0, scale=1),
  181. 'subsample': uniform(loc=0, scale=0.5)
  182. }
  183. ]
  184. warnings.filterwarnings(action='ignore')
  185. random_search_gradient_boosting = random_search_on_classifier_and_parameters(gbc, gbc_arguments, X_train_np, Y_train_np, error_score='raise', n_iter=100)
  186. warnings.filterwarnings(action='always')
  187. top_results(random_search_gradient_boosting, 10)
  188. __df = pd.DataFrame(random_search_gradient_boosting.cv_results_["params"])
  189. __df["mean_score_validation"] = random_search_gradient_boosting.cv_results_["mean_test_score"]
  190. __df["mean_score_training"] = random_search_gradient_boosting.cv_results_["mean_train_score"]
  191. plt.figure(figsize=(10,10))
  192. line = np.linspace(0.45, 1.0,30)
  193. sns.scatterplot(__df["mean_score_training"], __df["mean_score_validation"])
  194. sns.lineplot(x=line, y=line)
  195.  
  196. -----------
  197.  
  198. Si bien los score obtenidos son bastante buenos, no encontramos una buena combinación de parámetros que permita minimizar la varianza a un valor que nos agrade.
  199.  
  200. ----------
  201.  
  202. ### Resultado Ejercicio 4.3 && Extra
  203. Si bien random forest y gradient boosting obtuvieron buenos scores en lineas generales, no pudimos reducir la varianza de los mismos haciendo que generalicen mejor y no pudimos establecer que clasificador funciona mejor.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement