簡體   English   中英

Sigmoid激活函數可以用來解決Keras的回歸問題嗎?

[英]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_errormean_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM