Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def validation_plot(title, classifier, X, y, param, param_range):
- train_scores, valid_scores = validation_curve(classifier, X, y, param, param_range, scoring=('roc_auc'), cv=5)
- val_results = pd.DataFrame(columns=['Param','Type','Score','Fold'])
- for i, p in enumerate(param_range):
- ts = pd.DataFrame()
- ts['Score'] = train_scores[i]
- ts['Type'] = 'train'
- ts['Fold'] = i
- ts['Param'] = p
- val_results = val_results.append(ts)
- vs = pd.DataFrame()
- vs['Score'] = valid_scores[i]
- vs['Type'] = 'valid'
- vs['Fold'] = i
- vs['Param'] = p
- val_results = val_results.append(vs)
- sns.set(rc={'figure.figsize':(11.7,8.27)})
- ax = sns.pointplot(x='Param', y='Score', hue='Type', data=val_results)
- ax.set(xlabel=param)
- ax.set_title(title)
- plt.show()
- def learning_plot(title, classifier, X, y, train_sizes):
- train_sizes, train_scores, valid_scores = learning_curve(
- classifier, X, y, train_sizes=train_sizes, scoring=('roc_auc'), cv=5
- )
- val_results = pd.DataFrame(columns=['n','Type','Score','Fold'])
- for i, p in enumerate(train_sizes):
- ts = pd.DataFrame()
- ts['Score'] = train_scores[i]
- ts['Type'] = 'train'
- ts['Fold'] = i
- ts['n'] = p
- val_results = val_results.append(ts)
- vs = pd.DataFrame()
- vs['Score'] = valid_scores[i]
- vs['Type'] = 'valid'
- vs['Fold'] = i
- vs['n'] = p
- val_results = val_results.append(vs)
- sns.set(rc={'figure.figsize':(11.7,8.27)})
- ax = sns.pointplot(x='n', y='Score', hue='Type', data=val_results)
- ax.set_title(title)
- plt.show()
- ---------------
- Ejercicio 4.1
- warnings.filterwarnings(action='ignore')
- tree_classifier = create_decision_tree_classifier_with_params(grid_tree.best_params_)
- validation_plot('Tree classifier', tree_classifier, X_train_np, Y_train, 'max_depth', range(1,20))
- unbounded_params = grid_tree.best_params_.copy()
- unbounded_params['max_leaf_nodes'] = None
- tree_classifier = create_decision_tree_classifier_with_params(unbounded_params)
- validation_plot('Tree classifier unbounded leaf param', tree_classifier, X_train_np, Y_train, 'max_depth', range(1,20))
- svm_linear_classifier = sklearn.svm.LinearSVC(
- C=grid_svm_linear.best_params_['C'],
- loss=grid_svm_linear.best_params_['loss'],
- penalty=grid_svm_linear.best_params_['penalty'],
- dual=grid_svm_linear.best_params_['dual'],
- fit_intercept=grid_svm_linear.best_params_['fit_intercept'],
- verbose=0
- )
- 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)])
- warnings.filterwarnings(action='always')
- ---------------
- ### Resultado Ejercicio 4.1
- 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.
- 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.
- 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.
- -------------
- Ejercicio 4.2
- warnings.filterwarnings(action='ignore')
- tree_classifier = create_decision_tree_classifier_with_params(grid_tree.best_params_)
- learning_plot('Tree classifier', tree_classifier, X_train_np, Y_train_np, np.linspace(0.1,1,10))
- svm_linear_classifier = sklearn.svm.LinearSVC(
- C=grid_svm_linear.best_params_['C'],
- loss=grid_svm_linear.best_params_['loss'],
- penalty=grid_svm_linear.best_params_['penalty'],
- dual=grid_svm_linear.best_params_['dual'],
- fit_intercept=grid_svm_linear.best_params_['fit_intercept'],
- )
- learning_plot('SVM classifier C=0.05', svm_linear_classifier, X_train_np, Y_train_np, np.linspace(0.1,1,10))
- svm_linear_classifier = sklearn.svm.LinearSVC(
- C=0.005,
- loss=grid_svm_linear.best_params_['loss'],
- penalty=grid_svm_linear.best_params_['penalty'],
- dual=grid_svm_linear.best_params_['dual'],
- fit_intercept=grid_svm_linear.best_params_['fit_intercept'],
- )
- learning_plot('SVM classifier C=0.005', svm_linear_classifier, X_train_np, Y_train_np, np.linspace(0.1,1,10))
- warnings.filterwarnings(action='always')
- ------------------
- ### Resultado Ejercicio 4.2
- 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.
- 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.
- ------------------
- Ejercicio 4.3
- rf = RandomForestClassifier(n_estimators=200)
- warnings.filterwarnings(action='ignore')
- 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)] )
- warnings.filterwarnings(action='always')
- rf = RandomForestClassifier(n_estimators=200, max_depth=3)
- warnings.filterwarnings(action='ignore')
- 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)] )
- warnings.filterwarnings(action='always')
- ------------------
- 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.
- 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.
- Esperabamos que al incrementar max_features la varianza aumente y el sesgo baje, sin embargo, no se obtuvieron estos resultados.
- -----------------
- rf = RandomForestClassifier()
- rf_arguments = [
- {
- 'n_estimators': np.arange(10,201,50),
- 'max_depth': [2, 3, 4],
- 'max_features': np.arange(0.01,1,0.1),
- 'n_jobs': [-1]
- }
- ]
- warnings.filterwarnings(action='ignore')
- grid_rf = apply_grid_search_on_classifier_and_parameters(rf, rf_arguments, X_train_np, Y_train_np, error_score='raise')
- warnings.filterwarnings(action='always')
- top_results(grid_rf, 10)
- __df = pd.DataFrame(grid_rf.cv_results_["params"])
- __df["mean_score_validation"] = grid_rf.cv_results_["mean_test_score"]
- __df["mean_score_training"] = grid_rf.cv_results_["mean_train_score"]
- plt.figure(figsize=(10,10))
- line = np.linspace(0.45, 1.0,30)
- sns.scatterplot(__df["mean_score_training"], __df["mean_score_validation"])
- sns.lineplot(x=line, y=line)
- ---------------
- Ejercicio Extra
- gbc = GradientBoostingClassifier()
- gbc_arguments = [
- {
- 'loss': ['deviance', 'exponential'],
- 'learning_rate': uniform(loc=0, scale=1),
- 'n_estimators': randint(1, 400),
- 'max_depth': randint(2, 5),
- 'max_features': uniform(loc=0, scale=1),
- 'subsample': uniform(loc=0, scale=0.5)
- }
- ]
- warnings.filterwarnings(action='ignore')
- 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)
- warnings.filterwarnings(action='always')
- top_results(random_search_gradient_boosting, 10)
- __df = pd.DataFrame(random_search_gradient_boosting.cv_results_["params"])
- __df["mean_score_validation"] = random_search_gradient_boosting.cv_results_["mean_test_score"]
- __df["mean_score_training"] = random_search_gradient_boosting.cv_results_["mean_train_score"]
- plt.figure(figsize=(10,10))
- line = np.linspace(0.45, 1.0,30)
- sns.scatterplot(__df["mean_score_training"], __df["mean_score_validation"])
- sns.lineplot(x=line, y=line)
- -----------
- 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.
- ----------
- ### Resultado Ejercicio 4.3 && Extra
- 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