量化神经网络python的预测质量

时间:2018-05-28 03:02:13

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


今天我想请教一些关于神经网络质量的帮助。 我一直在研究预测冶​​金学参数的项目。 为了确保我的神经网络以正确的方式运行,我尝试使用“Scikit-learn”的一些功能,如“得分”和“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))

1 个答案:

答案 0 :(得分:0)

首先,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在每层中使用少量节点优化网络时可能会遇到问题。有助于确定最佳参数的网格搜索和交叉验证程序可以大大改善您的模型。解决方案可能对公差和其他此类参数敏感。