def test_plotting(): # Test of plotting confusion matrix logger.info("Testeando plot de matriz de confusion...") predict = [0, 1, 0, 2, 2, 1] labels = [0, 1, 1, 2, 1, 0] metrics = ClassificationMetrics(zip(predict, labels), 3) plot_confusion_matrix(metrics.confusion_matrix(), show=False) logger.info("OK") return
def evaluate(self, data, predictions=False, measure=None): """ Evaluación de un conjunto de datos etiquetados, midiendo la salida real o de predicción contra la esperada mediante una métrica definida en base a la tarea asignada para la red. :param data: instancia de :class:`.LabeledDataSet` o list de *pyspark.mllib.regression.LabeledPoint* :param predictions: bool, si es True se deben retornar también las predicciones hechas sobre *data* :param measure: string, key de alguna medida implementada en alguna de las métricas diponibles en :mod:`~learninspy.utils.evaluation`. :return: float, resultado de aplicar la medida dada por *measure*. Si *predictions* es True se retorna además una lista de *numpy.ndarray* (predicciones). """ if isinstance(data, LabeledDataSet): actual = data.labels if type(data) is DistributedLabeledDataSet: actual = actual.collect() predicted = data.features.map(lambda f: self.predict(f).matrix).collect() else: predicted = map(lambda f: self.predict(f).matrix, data.features) else: actual = map(lambda lp: lp.label, data) predicted = map(lambda lp: self.predict(lp.features).matrix, data) if self.params.classification is True: # En problemas de clasificacion, se determina la prediccion por la unidad de softmax que predomina predicted = map(lambda p: float(np.argmax(p)), predicted) n_classes = self.params.units_layers[-1] # La cant de unidades de la ult capa define la cant de clases metrics = ClassificationMetrics(zip(predicted, actual), n_classes=n_classes) if measure is None: measure = 'F-measure' else: metrics = RegressionMetrics(zip(predicted, actual)) if measure is None: measure = 'R2' # Evaluo en base a la medida elegida (key perteneciente al dict 'metrics.measures') hits = metrics.evaluate(measure=measure) if predictions is True: # Devuelvo ademas el vector de predicciones ret = hits, predicted else: ret = hits return ret
def evaluate(self, data, predictions=False, measure=None): """ Evaluación de un conjunto de datos etiquetados, midiendo la salida real o de predicción contra la esperada mediante una métrica definida en base a la tarea asignada para la red. :param data: instancia de :class:`.LabeledDataSet` o list de *pyspark.mllib.regression.LabeledPoint* :param predictions: bool, si es True se deben retornar también las predicciones hechas sobre *data* :param measure: string, key de alguna medida implementada en alguna de las métricas diponibles en :mod:`~learninspy.utils.evaluation`. :return: float, resultado de aplicar la medida dada por *measure*. Si *predictions* es True se retorna además una lista de *numpy.ndarray* (predicciones). """ if isinstance(data, LabeledDataSet): actual = data.labels if type(data) is DistributedLabeledDataSet: actual = actual.collect() predicted = data.features.map(lambda f: self.predict(f).matrix).collect() else: predicted = map(lambda f: self.predict(f).matrix, data.features) else: actual = map(lambda lp: lp.label, data) predicted = map(lambda lp: self.predict(lp.features).matrix, data) if self.params.classification is True: # En problemas de clasificacion, se determina la prediccion por la unidad de softmax que predomina predicted = map(lambda p: float(np.argmax(p)), predicted) n_classes = self.params.units_layers[-1] # La cant de unidades de la ult capa define la cant de clases metrics = ClassificationMetrics(zip(predicted, actual), n_classes=n_classes) if measure is None: measure = 'F-measure' else: metrics = RegressionMetrics(zip(predicted, actual)) if measure is None: measure = 'R2' # Evaluo en base a la medida elegida (key perteneciente al dict 'metrics.measures') hits = metrics.evaluate(measure=measure) if predictions is True: # Devuelvo ademas el vector de predicciones ret = hits, predicted else: ret = hits return ret
neural_net = NeuralNetwork(net_params) logger.info("Entrenando red neuronal ...") hits_valid = neural_net.fit(train, valid, valid_iters=1, mini_batch=10, parallelism=2, stops=global_stops, optimizer_params=optimizer_params, keep_best=True, reproducible=True) hits_test, predict = neural_net.evaluate(test, predictions=True) logger.info("Hits en test: %12.11f", hits_test) # --4) Evaluacion de desempeño logger.info("Metricas de evaluación en clasificacion: ") labels = map(lambda lp: float(lp.label), test.collect()) metrics = ClassificationMetrics(zip(predict, labels), 3) logger.info("F1-Score: %12.11f", metrics.f_measure(beta=1)) logger.info("Precision: %12.11f", metrics.precision()) logger.info("Recall: %12.11f", metrics.recall()) logger.info("Matriz de confusion: %s", os.linesep + str(metrics.confusion_matrix())) # --5) Ploteos plot_fitting(neural_net)
def test_classification_metrics(): logger.info("Testeando métricas de evaluación para clasificación...") # Ejemplos para testear evaluación sobre 3 clases predict = [0, 1, 0, 2, 2, 1] labels = [0, 1, 1, 2, 1, 0] metrics = ClassificationMetrics(zip(predict, labels), 3) # Generales assert metrics.accuracy() == 0.5 assert (metrics.confusion_matrix() == np.array([[1, 1, 0], [1, 1, 1], [0, 0, 1]])).all() # Por etiqueta assert metrics.precision(label=0) == metrics.precision(label=1) == metrics.precision(label=2) == 0.5 assert (metrics.recall(label=0) == 0.5 and metrics.recall(label=1) == 0.3333333333333333 and metrics.recall(label=2) == 1.0) # Micro and macro assert metrics.precision(macro=True) == metrics.precision(macro=False) == 0.5 assert (metrics.recall(macro=True) == 0.611111111111111 and metrics.recall(macro=False) == 0.5) # F-measure variando Beta assert metrics.f_measure(beta=1) == 0.5499999999999999 # F1-score, igual ponderación assert metrics.f_measure(beta=0.5) == 0.5188679245283019 # F0.5 score, prioriza precision en lugar de recall assert metrics.f_measure(beta=2) == 0.5851063829787233 # F2-score, prioriza recall en lugar de precision logger.info("OK")
# -- 3) Construcción y ajuste de red neuronal neural_net = NeuralNetwork(net_params) logger.info("Entrenando red neuronal ...") hits_valid = neural_net.fit(train, valid, valid_iters=1, mini_batch=10, parallelism=2, stops=global_stops, optimizer_params=optimizer_params, keep_best=True, reproducible=True) hits_test, predict = neural_net.evaluate(test, predictions=True) logger.info("Hits en test: %12.11f", hits_test) # --4) Evaluacion de desempeño logger.info("Metricas de evaluación en clasificacion: ") labels = map(lambda lp: float(lp.label), test.collect()) metrics = ClassificationMetrics(zip(predict, labels), 3) logger.info("F1-Score: %12.11f", metrics.f_measure(beta=1)) logger.info("Precision: %12.11f", metrics.precision()) logger.info("Recall: %12.11f", metrics.recall()) logger.info("Matriz de confusion: %s", os.linesep+str(metrics.confusion_matrix())) # --5) Ploteos plot_fitting(neural_net)