def evaluate(self, data, predictions=False, measure=None): """ Evalúa el AutoEncoder sobre un conjunto de datos, lo que equivale a medir su desempeño en reconstruir dicho conjunto de entrada. :param data: list de LabeledPoint o instancia de :class:`~learninspy.utils.data.LabeledDataSet`. :param predictions: si es True, retorna las predicciones (salida reconstruida por el AutoEncoder). :param measure: string, key de alguna medida implementada en :class:`~learninspy.utils.evaluation.RegressionMetrics`. :return: resultado de evaluación, y predicciones si se solicita en *predictions* """ if isinstance(data, LabeledDataSet): actual = data.features if type(data) is DistributedLabeledDataSet: predicted = actual.map(lambda f: self.predict(f).matrix.T).collect() # Notar la transposición de matrix actual = actual.collect() else: predicted = map(lambda f: self.predict(f).matrix.T, actual) else: actual = map(lambda lp: lp.features, data) predicted = map(lambda f: self.predict(f).matrix.T, actual) 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): """ Evalúa el AutoEncoder sobre un conjunto de datos, lo que equivale a medir su desempeño en reconstruir dicho conjunto de entrada. :param data: list de LabeledPoint o instancia de :class:`~learninspy.utils.data.LabeledDataSet`. :param predictions: si es True, retorna las predicciones (salida reconstruida por el AutoEncoder). :param measure: string, key de alguna medida implementada en :class:`~learninspy.utils.evaluation.RegressionMetrics`. :return: resultado de evaluación, y predicciones si se solicita en *predictions* """ if isinstance(data, LabeledDataSet): actual = data.features if type(data) is DistributedLabeledDataSet: predicted = actual.map(lambda f: self.predict( f).matrix.T).collect() # Notar la transposición de matrix actual = actual.collect() else: predicted = map(lambda f: self.predict(f).matrix.T, actual) else: actual = map(lambda lp: lp.features, data) predicted = map(lambda f: self.predict(f).matrix.T, actual) 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 test_regression_metrics(): logger.info("Testeando métricas de evaluación para regresión...") # Ejemplos para testear regresión dim = 100 # Tamaño del muestreo x = np.linspace(-4, 4, dim) # Eje x clean = np.sinc(x) # Función sinc (labels) np.random.seed(123) noise = np.random.uniform(0, 0.1, dim) # Ruido para ensuciar la sinc (error en la predicción) signal = clean + noise # Señal resultante del ruido aditivo (predict) metrics = RegressionMetrics(zip(signal, clean)) assert np.allclose(metrics.r2(), 0.9708194315829859, rtol=1e-4) assert np.allclose(metrics.explained_variance(), 0.9943620888461356, rtol=1e-4) assert np.allclose(metrics.mse(), 0.0031164269743473839, rtol=1e-4) assert np.allclose(metrics.rmse(), 0.0558249673027, rtol=1e-4) assert np.allclose(metrics.mae(), 0.0501428880, rtol=1e-4) assert np.allclose(metrics.rmae(), 0.2239260770, rtol=1e-4) logger.info("OK")
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
hits_valid = neural_net.fit(train, valid, valid_iters=1, mini_batch=20, parallelism=0, stops=global_stops, optimizer_params=optimizer_params, measure='R2', keep_best=True, reproducible=False) 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 = RegressionMetrics(zip(predict, labels)) print "MSE: ", metrics.mse() print "RMSE: ", metrics.rmse() print "MAE: ", metrics.mae() print "RMAE: ", metrics.rmae() print "R-cuadrado: ", metrics.r2() print "Explained Variance: ", metrics.explained_variance() print zip(predict, labels)[:10] # --5) Ploteos plot_fitting(neural_net)
logger.info("Configuracion usada: %s", os.linesep+str(net_params)) # -- 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=20, parallelism=0, stops=global_stops, optimizer_params=optimizer_params, measure='R2', keep_best=True, reproducible=False) 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 = RegressionMetrics(zip(predict, labels)) print "MSE: ", metrics.mse() print "RMSE: ", metrics.rmse() print "MAE: ", metrics.mae() print "RMAE: ", metrics.rmae() print "R-cuadrado: ", metrics.r2() print "Explained Variance: ", metrics.explained_variance() print zip(predict, labels)[:10] # --5) Ploteos plot_fitting(neural_net)