[英]Can the sigmoid activation function be used to solve regression problems in Keras?
我用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)
如您所見,我使用MaxMinScaler來綁定變量,從而將輸出綁定在0和1之間。
當我生成150個時期時,諸如mean_squared_error和mean_absolute_error之類的值非常低。 但是,mean_absolute_percentage_error非常高 - 但我懷疑在評估sigmoid輸出時這不是一個好的度量標准。
將輸出變量綁定在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()
將輸出變量綁定在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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.