可以使用sigmoid激活函数来解决Keras中的回归问题吗?

时间:2018-02-25 17:32:49

标签: python tensorflow neural-network keras

我用R实现了简单的神经网络,但这是我第一次使用Keras这样做,所以我会很感激一些建议。

我在Keras开发了一个神经网络功能来预测汽车销售(数据集可用here)。 CarSales 是因变量。

据我所知,Keras用于开发神经网络用于分类目的而不是回归。在我到目前为止看到的所有例子中,输出都在0和1之间。

这是我开发的代码,您将看到我正在使用'sigmoid'函数进行输出:

from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense
from tensorflow.python.keras.wrappers.scikit_learn import KerasRegressor
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler

import os;
path="C:/Users/cars.csv"
os.chdir(path)
os.getcwd()

#Variables
dataset=np.loadtxt("cars.csv", delimiter=",")
x=dataset[:,0:5]
y=dataset[:,5]
y=np.reshape(y, (-1,1))
scaler = MinMaxScaler()
print(scaler.fit(x))
print(scaler.fit(y))
xscale=scaler.transform(x)
yscale=scaler.transform(y)

model = Sequential()
model.add(Dense(12, input_dim=5, kernel_initializer='normal', activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.summary()

model.compile(loss='mse', optimizer='adam', metrics=['mse','mae','mape','cosine','accuracy'])
model.fit(xscale, yscale, epochs=150, batch_size=50,  verbose=1, validation_split=0.2)

正如您所看到的,我使用MaxMinScaler来绑定变量,从而将输出绑定在0和1之间。

Output

当我生成150个纪元时, mean_squared_error mean_absolute_error 等值非常低。但是,mean_absolute_percentage_error非常高 - 但我怀疑在评估sigmoid输出时这不是一个好的指标。

将输出变量绑定在0和1之间,然后运行模型是否可以尝试使用神经网络预测区间变量?

1 个答案:

答案 0 :(得分:1)

  

将输出变量绑定在0和1之间,然后运行模型是否可以尝试使用神经网络预测区间变量?

如果您知道输出可以提前采用的值范围,我认为这可以工作。这当然不常见。

使用以下代码,您实际上是在作弊。您正在使用所有数据(训练和验证)来计算缩放器的边界,而只应使用训练数据。

dataset=np.loadtxt("cars.csv", delimiter=",")
x=dataset[:,0:5]
y=dataset[:,5]
y=np.reshape(y, (-1,1))
scaler = MinMaxScaler()
print(scaler.fit(x))
print(scaler.fit(y))
xscale=scaler.transform(x)
yscale=scaler.transform(y)

如果你没有这样作弊,你可能会在验证数据中获得超出界限的值。如果你仍然使用sigmoid,你将无法做出正确的预测(如果根据训练数据确定的界限进行缩放,则应该在[0, 1]之外)。

如Hemen建议的那样,简单地以回归任务的线性层结束更为常见。

您的学习过程仍然可以将训练数据中的输出扩展到[0, 1],但是,如果训练数据外部的输出略微超过在1.1中观察到的所有值,则可以将其映射到html { background: linear-gradient(45deg, #17ead9, #6078ea); height: 100vh; margin: 0; background-attachment: fixed; } 。培训数据。