python-Keras MLP分类器不学习
作者:互联网
有29列,其中我必须预测winPlacePerc(数据帧的最末端)在1(高perc)到0(低perc)之间
在29列25中,数字数据3是ID(对象)1是类别
我删除了所有Id列(因为它们都是唯一的),并且还将categorical(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
我也碰巧有大量数据,例如40万个数据,因此出于测试目的,我正在训练其中的一部分,使用sckit进行
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.997, random_state=32)
可提供将近13,000的训练数据
对于模型,我正在使用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,我正在使用S形层作为输出层
这是培训和培训验证损失和精度图
我还尝试使用步进函数和二进制交叉熵损失函数将标签转换为二进制
之后,y标签数据看起来像
> y.head()
winPlacePerc
0 0
1 1
2 1
3 0
4 0
和改变损失函数
model.compile(loss='binary_crossentropy',
optimizer='Adam',
metrics=['accuracy'])
这种方法比以前更糟糕
如您所见,在某个时期之后它没有学习,即使我正在获取所有数据而不是其中的一部分数据,也会发生这种情况
在这不起作用之后,我还使用了辍学并尝试添加更多层,但是这里没有任何作用
现在我的问题是,我在这里做错了什么是错误的层或数据,如何对此进行改进?
解决方法:
为了解决这个问题-这是一个回归问题,因此使用准确性实际上没有任何意义,因为您永远无法预测0.23124的确切值.
首先,您当然要在将值传递到网络之前对其进行标准化(而不是热编码的值).尝试使用StandardScaler
作为开始.
其次,我建议您在输出层中更改激活函数-尝试使用linear,因为损失均值_平方误差应该可以.
为了验证您对模型的“准确性”进行建模,可以将预测值与实际值一起绘制-这应该使您有机会直观地验证结果.但是,话虽如此,您的损失看起来已经相当不错了.
检查this post,应该使您对什么(激活和丢失功能)以及何时使用有了很好的了解.
标签:data-science,keras,machine-learning,classification,python 来源: https://codeday.me/bug/20191210/2104328.html