Keras MLP分类器不学习

2024-09-29 00:16:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的数据 enter image description here

enter image description here

有29列,其中我必须预测winPlacePerc(数据帧的最末端),它介于1(高perc)到0(低perc)之间

29列中25数字数据3是ID(对象)1是分类的

我删除了所有Id列(因为它们都是唯一的),还将分类的(matchType)数据编码到一个热编码中

做完这一切后,我只剩下41列(一列热的之后)

after one hot encoded

这就是我创建数据的方式

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层作为我的输出层

这是培训和验证损失和准确性图

enter image description hereenter image description here

我还尝试使用step函数和二进制交叉熵损失函数将标签转换为二进制

在这之后,y标签数据看起来像

> y.head()

winPlacePerc
0   0
1   1
2   1
3   0
4   0

改变损失函数

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

enter image description here

这种方法比以前更糟

正如你所看到的,在某个特定的时代之后,它不会学习,即使我取的是所有的数据,而不是它的一小部分,这种情况也会发生

在这不起作用之后,我还使用了dropout并尝试添加更多层,但在这里没有任何效果

现在我的问题是,我做错了什么?是错误的层还是数据层?我该如何改进?你知道吗


Tags: 数据函数fromtestimportmodellayers分类
2条回答

为了澄清问题-这是一个回归问题,因此使用精度实际上没有意义,因为您永远无法预测0.23124的准确值。你知道吗

首先,在将值传递到网络之前,当然希望将值(而不是热编码的值)标准化。尝试使用^{}作为开始。你知道吗

其次,我建议更改输出层中的激活函数—尝试使用linear,作为损失mean_squared_error应该可以。你知道吗

为了验证模型的准确性,请将预测结果与实际结果绘制在一起,这样您就有机会直观地验证结果。不过,尽管如此,你的损失看起来已经相当不错了。你知道吗

检查this post,应该可以让您很好地掌握什么(激活和丢失函数)以及何时使用。你知道吗

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,但是预测非常接近实际情况。另一方面,均方误差将非常低,即预测值与地面真实值的偏差非常小。你知道吗

相关问题 更多 >