簡體   English   中英

Keras MLP分類器不學習

[英]Keras MLP classifier not learning

我有這樣的數據 在此輸入圖像描述

在此輸入圖像描述

有29列,其中我必須預測winPlacePerc (數據幀的極端),它在1 (高perc)到0 (低perc)之間

2925中的數值數據3是ID( 對象 )1的分類

我刪除了所有Id列 (因為它們都是唯一的)並且還將分類 (matchType)數據編碼一個熱編碼

完成所有這些后,我留下了41列(一個熱后)

經過一次熱門​​編碼

這就是我創建數據的方式

X = df.drop(columns=['winPlacePerc'])
#creating a dataframe with only the target column
y = df[['winPlacePerc']]

現在我的X有40列,這是我的標簽數據

> y.head()

winPlacePerc
0   0.4444
1   0.6400
2   0.7755
3   0.1667
4   0.1875

我也碰巧有大量的數據,比如400k數據,所以為了測試目的,我正在訓練它的一小部分,用sckit來做

X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.997, random_state=32)

它提供了近13k的訓練數據

對於模型我使用Keras順序模型

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dense, Dropout, Activation
from keras.layers.normalization import BatchNormalization
from keras import optimizers

n_cols = X_train.shape[1]

model = Sequential()

model.add(Dense(40, activation='relu', input_shape=(n_cols,)))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='mean_squared_error',
              optimizer='Adam',
              metrics=['accuracy'])

model.fit(X_train, y_train,
          epochs=50,
          validation_split=0.2,
          batch_size=20)

由於我的y標簽數據在0和1之間,我使用sigmoid層作為我的輸出層

這是培訓和驗證損失和准確性情節

在此輸入圖像描述 在此輸入圖像描述

我還嘗試使用步進函數和二進制交叉熵損失函數將標簽轉換為二進制

之后,y標簽數據看起來像

> y.head()

winPlacePerc
0   0
1   1
2   1
3   0
4   0

和改變損失的功能

model.compile(loss='binary_crossentropy',
              optimizer='Adam',
              metrics=['accuracy'])

在此輸入圖像描述

這種方法比以前更糟糕

因為你可以看到它在某個時代之后沒有學習,即使我正在獲取所有數據而不是它的一小部分,這也會發生

在此之后不起作用我也使用了dropout並嘗試添加更多圖層 ,但這里沒有任何作用

現在我的問題是,我在這里做錯了是錯誤的層或數據如何才能改進這一點?

清除問題 - 這是一個回歸問題,因此使用准確性並沒有多大意義,因為你永遠無法預測0.23124的確切值。

首先,您肯定希望在將值傳遞給網絡之前將其標准化(而不是熱編碼的值)。 嘗試使用StandardScaler作為開始。

其次,我建議更改輸出層中的激活功能 - 嘗試使用linear並且作為一種損失, mean_squared_error應該沒問題。

為了驗證您的模型“精確度”,將預測與實際情況一起繪制 - 這應該讓您有機會在視覺上驗證結果。 然而,據說你的損失看起來相當不錯。

查看這篇文章 ,應該讓你很好地掌握什么(激活和丟失功能)以及何時使用。

from sklearn.preprocessing import StandardScaler

n_cols = X_train.shape[1]
ss = StandardScaler()
X_train = ss.fit_transform(X_train)

model = Sequential()    
model.add(Dense(128, activation='relu', input_shape=(n_cols,)))
model.add(Dense(64, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(1))

model.compile(loss='mean_squared_error',
              optimizer='Adam',
              metrics=['mean_squared_error'])

model.fit(X_train, y_train,
          epochs=50,
          validation_split=0.2,
          batch_size=20)
  • 規范化數據
  • 為您的網絡添加更多深度
  • 使最后一層變為線性

准確性不是回歸的良好指標。 我們來看一個例子吧

predictions: [0.9999999, 2.0000001, 3.000001]
ground Truth: [1, 2, 3]

Accuracy = No:of Correct / Total => 0 /3 = 0

准確度為0 ,但預測非常接近基本事實。 另一方面,MSE將非常低,指出預測與基本事實的偏差非常小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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