python - Keras MLP 分类器不学习
问题描述
有 29 列,其中我必须预测在1(高 perc)到0(低 perc)之间的winPlacePerc (数据帧的极端端)
在29列中,第25列是数字数据 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-label 数据介于 0 和 1 之间,因此我使用sigmoid层作为输出层
这是训练和验证损失和准确度图
我还尝试使用阶跃函数和二进制交叉熵损失函数将标签转换为二进制
之后 y-label 数据看起来像
> 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 的确切值。
首先,您当然希望在将值传递到网络之前对其进行规范化(不是热编码的值)。尝试使用 aStandardScaler
作为开始。
其次,我建议更改输出层中的激活函数 - 尝试使用linear
和 作为损失mean_squared_error
应该没问题。
为了验证您的模型“准确性”,将预测值与实际值一起绘制 - 这应该让您有机会直观地验证结果。但是,话虽如此,您的损失看起来已经相当不错了。
查看这篇文章,应该可以让您很好地掌握什么(激活和损失函数)以及何时使用。
推荐阅读
- c# - 重复的“Microsoft.AspNetCore.Razor.Hosting.RazorLanguageVersionAttribute”属性
- docker - 在 CentOS 8 上安装 docker
- bash - 如何在使用查找时列出没有绝对路径的目录中的所有文件及其文件大小
- java - spring boot 应用中根据请求头参数动态切换属性文件
- android - 等到所有权限都被授予
- java - Azure CLI 和 KubeCTL 的 Java 方式
- c# - 客户端 Blazor 中的自定义 IConfiguration 服务
- c++ - 如何避免这两个相互关联的线程之间的竞争条件
- google-apps-script - 滚动 Google Sheet 的脚本有效,直到我激活另一个单元格。为什么?
- phpunit - 于是,一个变种人逃了出来。怎么办?