如何创建用于回归的神经网络?

Posted

技术标签:

【中文标题】如何创建用于回归的神经网络?【英文标题】:How to create a neural network for regression? 【发布时间】:2018-08-07 01:33:05 【问题描述】:

我正在尝试使用 Keras 制作神经网络。我使用的数据是https://archive.ics.uci.edu/ml/datasets/Yacht+Hydrodynamics。我的代码如下:

import numpy as np
from keras.layers import Dense, Activation
from keras.models import Sequential
from sklearn.model_selection import train_test_split

data = np.genfromtxt(r"""file location""", delimiter=',')

model = Sequential()
model.add(Dense(32, activation = 'relu', input_dim = 6))
model.add(Dense(1,))
model.compile(optimizer='adam', loss='mean_squared_error', metrics = ['accuracy'])

Y = data[:,-1]
X = data[:, :-1]

从这里我尝试使用 model.fit(X, Y),但模型的准确性似乎保持在 0。我是 Keras 的新手,所以这可能是一个简单的解决方案,提前道歉。

我的问题是向模型添加回归以提高准确性的最佳方法是什么?提前致谢。

【问题讨论】:

【参考方案1】:

首先,您必须使用来自sklearn.model_selection 库的train_test_split 类将您的数据集 拆分为training 集和test 集。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.08, random_state = 0)

此外,您必须使用 StandardScaler 类来 scale 您的值。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

然后,您应该添加更多以获得更好的结果。

注意

通常最好应用以下公式来找出所需的隐藏层 的总数。

Nh = Ns/(α∗ (Ni + No))

在哪里

Ni = 输入神经元的数量。 否 = 输出神经元的数量。 Ns = 训练数据集中的样本数。 α = 任意比例因子,通常为 2-10。

所以我们的分类器变成:

# Initialising the ANN
model = Sequential()

# Adding the input layer and the first hidden layer
model.add(Dense(32, activation = 'relu', input_dim = 6))

# Adding the second hidden layer
model.add(Dense(units = 32, activation = 'relu'))

# Adding the third hidden layer
model.add(Dense(units = 32, activation = 'relu'))

# Adding the output layer
model.add(Dense(units = 1))

您使用的metric-metrics=['accuracy'] 对应于分类问题。如果您想做回归,请删除metrics=['accuracy']。也就是说,只需使用

model.compile(optimizer = 'adam',loss = 'mean_squared_error')

Here 是regressionclassificationkeras 指标列表

此外,您必须为 fit 方法定义 batch_sizeepochs 值。

model.fit(X_train, y_train, batch_size = 10, epochs = 100)

训练完network 后,您可以使用model.predict 方法predict 得到X_test 的结果。

y_pred = model.predict(X_test)

现在,您可以比较我们从神经网络预测中获得的y_predy_test 这是真实数据。为此,您可以使用matplotlib 库创建plot

plt.plot(y_test, color = 'red', label = 'Real data')
plt.plot(y_pred, color = 'blue', label = 'Predicted data')
plt.title('Prediction')
plt.legend()
plt.show()

看来我们的神经网络学得很好

这是plot 的外观。

这是完整的代码

import numpy as np
from keras.layers import Dense, Activation
from keras.models import Sequential
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# Importing the dataset
dataset = np.genfromtxt("data.txt", delimiter='')
X = dataset[:, :-1]
y = dataset[:, -1]

# Splitting the dataset into the Training set and Test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.08, random_state = 0)

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# Initialising the ANN
model = Sequential()

# Adding the input layer and the first hidden layer
model.add(Dense(32, activation = 'relu', input_dim = 6))

# Adding the second hidden layer
model.add(Dense(units = 32, activation = 'relu'))

# Adding the third hidden layer
model.add(Dense(units = 32, activation = 'relu'))

# Adding the output layer

model.add(Dense(units = 1))

#model.add(Dense(1))
# Compiling the ANN
model.compile(optimizer = 'adam', loss = 'mean_squared_error')

# Fitting the ANN to the Training set
model.fit(X_train, y_train, batch_size = 10, epochs = 100)

y_pred = model.predict(X_test)

plt.plot(y_test, color = 'red', label = 'Real data')
plt.plot(y_pred, color = 'blue', label = 'Predicted data')
plt.title('Prediction')
plt.legend()
plt.show()

【讨论】:

漂亮的答案! Brilliant @MihaiAlexandru-Ionut,你能解释一下缩放的必要性吗? @ES1927,很多机器学习算法都使用欧拉距离。因此需要标准化或缩放,以便所有输入都处于可比较的范围内。 我在识别预测图与实际图中的 x 轴代表什么时遇到了一些麻烦。首先我认为这是时代,但在我的数据中,我在时代中改变了什么并不重要,我得到相同的 x 轴范围。有人可以给我解释一下吗? 回答我自己上面的评论,是样本号=)

以上是关于如何创建用于回归的神经网络?的主要内容,如果未能解决你的问题,请参考以下文章

预测 - 用于回归的神经网络预测相同的值

如何用神经网络实现连续型变量的回归预测?

用于回归的 tensorflow 深度神经网络总是在一批中预测相同的结果

用于 R 中回归的 RandomForest

用于训练 CNN 网络进行回归任务的正态分布数据

您如何确定用于图像分类的卷积神经网络的参数?