emp*_*eon 3 python neural-network keras tensorflow
我已经用R实现了简单的神经网络,但是这是我第一次使用Keras这样做,所以请多多指教。
我在Keras中开发了神经网络功能来预测汽车销量(数据集可在此处获得)。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)
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在使用MaxMinScaler将变量(即输出)限制在0到1之间。
当我生成150个纪元时,诸如mean_squared_error和mean_absolute_error的值非常低。但是,mean_absolute_percentage_error很高-但我怀疑这不是评估S型输出时使用的好指标。
将输出变量限制在0和1之间,然后运行模型是否是尝试使用神经网络预测区间变量的可接受方法?
要使用神经网络执行回归,应在最终输出中使用线性激活函数。
尝试以下代码。
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='linear'))
model.summary()
Run Code Online (Sandbox Code Playgroud)
将输出变量限制在 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)
Run Code Online (Sandbox Code Playgroud)
如果您不这样做,您可能会在验证数据中得到超出您限制的值。如果您仍然使用 sigmoid,您将无法做出正确的预测([0, 1]如果仅根据训练数据确定的边界进行缩放,则预测应该位于外部)。
正如 Hemen 所建议的那样,更常见的是简单地以回归任务的线性层结束。
您的学习过程可能仍然会受益于将训练数据中的输出缩放到,但是如果训练数据之外的输出稍微超过训练数据中观察到的所有值,那么训练数据之外的[0, 1]输出可能会被映射到。1.1
| 归档时间: |
|
| 查看次数: |
2031 次 |
| 最近记录: |