【问题标题】:Quantifying the quality of predictions of the neural network python量化神经网络python的预测质量
【发布时间】:2018-11-06 14:06:11
【问题描述】:


今天我想请你帮忙看看我的神经网络的质量。 我一直在从事一个预测冶金参数的项目。 为了确保我的神经网络以正确的方式运行,我尝试使用“Scikit-learn”的一些功能,如“score”和“r^2”,但没有成功。

在实际代码中,我的“r²”是 -10.42239374572942,这个值是不真实的,因为每个人都知道 r² 必须在 -1 和 1 之间。

有人对评估我的神经网络有什么建议吗? 为什么我的代码不起作用?

谢谢各位。 再见。

按照上面我的代码:

# coding: utf-8

import pandas as pd
import numpy as np

#modulo de plot
import matplotlib.pyplot as plt

#modulo da rede propriamente dita
from sklearn.neural_network import MLPRegressor

#para testar a rede neural
from sklearn.model_selection import train_test_split

#para normalização
from sklearn.preprocessing import StandardScaler

#para testar a qualidade da rede neural
from sklearn.metrics import mean_squared_error, r2_score

#buscando o CSV com os dados do AF1-Gerdau
df = pd.read_csv('Rede3.03.11.17_MOACIR_b.csv', delimiter=';', encoding = "ISO-8859-1" )

df2 = df.dropna(how='all')


# ## Definindo as variáveis inputs e a resposta

X = df2.drop(['Fuel Rate'], axis=1) #deixando todas as colunas exceto a variável resposta "Fuel Rate"
y = df2['Fuel Rate'] #variável respota "Fuel Rare"

# ## Normalizando os dados para uma melhor convergência

scaler = StandardScaler()
X_train, X_test, y_train, y_test = train_test_split(X, y)

# Treinamento apenas com os dados de treino
scaler.fit(X_train)

# Aplicando a transformação de normalização dos dados:
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

# ## Criando os parametros da RNA
rna = MLPRegressor(hidden_layer_sizes=(13,13,13), max_iter=2000)

# ## Treinando a RNA
rna.fit(X_train,y_train)

# ## Testando a rede
y_predicted = rna.predict(X_test)

# The coefficients
print('Coefficients: \n', r2_score(y_test, y_predicted))

【问题讨论】:

  • 查看sklearn docs for r2_score:“与大多数其他分数不同,R^2 分数可能为负数(它实际上不必是数量 R 的平方)。”另外,关于“每个人都知道 r² 必须在 -1 和 1 之间”——你可能会想到 r,而不是 R^2(和 r^2,即使在线性回归的特殊情况下,is not bounded by -1)。

标签: python pandas scikit-learn neural-network evaluation


【解决方案1】:

首先,r2_score() 指标可以任意低。它不必介于 -1 和 1 之间,也不对应于 pearson 相关系数。 〜-10 的分数仅意味着该模型的性能明显低于输出平均值的模型(对应于 r2 分数为 0)。

您选择的r2_score() 是您模型的一个很好的初步指标。输出看起来很奇怪,不是因为度量有问题,而是因为模型有问题。在当前状态下,改进r2_score() 可能会改进任何其他感兴趣的指标。您可能还对测试集上的指标和训练集上的指标之间的相似性感兴趣——它们越相似,您的模型就越有可能很好地泛化(在流形假设或任何其他避免没有免费午餐定理的框架)。根据预期的应用,您可能会关心最坏的情况——如果最坏的情况是自动驾驶汽车将行人误认为是保险箱,那么您的 r2 是否为 0.999 可能并不重要开车的地方。您可能对范围广泛的校准分数感兴趣——如果您的模型以良好的准确度预测强模式,但residuals 显示模型中有很大的偏差,那么很可能有问题。一般来说,模型的质量很大程度上取决于它的预期应用,你的指标应该反映你的最终目标。以The Case for Learned Index Structures 为例,有时泛化是一件坏事,而不是你想要的。

您的方法中存在几个潜在问题。我不太确定冶金学,但许多化学问题都具有混沌的相互作用动力学,并且不容易用简单的方法建模,它只是将模型添加到输入数据上(这里的简单并不是负面的 - - 幼稚的方法通常是一个很好的起点,可以完全满足手头的要求。

根据经验,您会发现大部分收益将来自特征工程。在化学问题的情况下,这可能涉及从问题的标准解决方案中获取输出(这显然是不够的,因为您要直接进行机器学习)并将它们视为神经网络中的特征。这个想法是,即使没有一个单独的模型是完美的,它们也经常是正确的,并且在不同的方面是错误的,因此神经网络能够弄清楚如何将它们组合在一起以创建更好的答案。这是一种集成技术。

您做过哪些数据可视化/分析?您是否知道哪些特征对应于您要预测的输出?您的输入甚至可能没有足够的信息来预测您想要的输出。您是否在删除 NaN 值之前检查了数据?更好的插补方法会产生额外的收益吗?你的模型编码很好。 了解您的数据很容易成为手头最重要的任务。

Scikit-learn 在优化每层节点数量较少的网络时可能会遇到问题。帮助确定最佳参数的网格搜索和交叉验证过程可以显着改善您的模型。该解决方案可能对公差和其他此类参数很敏感。

【讨论】:

  • 你知道评估神经网络的最佳方法是什么吗? r^2 的语法是什么? r^2 有哪些好的值?
  • 当然。 1秒。忘记回答那部分了。
猜你喜欢
  • 2017-12-02
  • 2020-01-24
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2017-12-28
相关资源
最近更新 更多