我有这样的数据:
在29列中,我需要预测位于数据帧末尾的winPlacePerc,它取值范围在1(高百分比)到0(低百分比)之间。
在29个列中,其中25个是数字数据,3个是ID(对象),1个是分类数据。
我删除了所有的ID列(因为它们都是唯一的),并将分类数据(matchType)编码成独热编码(one hot encoding)。
在进行所有这些操作后,我剩下41列(经过one hot编码后)。
这就是我创建数据的方式。
现在我的X有40列,这是我的标签数据的样子。
![enter image description here](https://istack.dev59.com/UY2SB.webp)
![enter image description here](https://istack.dev59.com/9NWlN.webp)
在29个列中,其中25个是数字数据,3个是ID(对象),1个是分类数据。
我删除了所有的ID列(因为它们都是唯一的),并将分类数据(matchType)编码成独热编码(one hot encoding)。
在进行所有这些操作后,我剩下41列(经过one hot编码后)。
![after one hot encoded](https://istack.dev59.com/y9PO0.webp)
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 之间,我使用 sigmoid 层作为输出层。
这是训练和验证的损失和准确率图。
我还尝试将标签转换为二进制,并使用 step 函数和二元交叉熵损失函数。
之后,y 轴标签数据看起来像这样。
> y.head()
winPlacePerc
0 0
1 1
2 1
3 0
4 0
并改变损失函数
model.compile(loss='binary_crossentropy',
optimizer='Adam',
metrics=['accuracy'])
这种方法比以前更糟糕了。
正如您可以看到的那样,在某些 epoch 后它不再学习,即使我使用全部数据而不是其中的一部分也会出现此问题。
在此方法无效后,我还尝试了dropout和添加更多层次,但都没有起作用。
现在我的问题是,我在哪里做错了?是层次结构错误还是数据错误?我该如何改进这个问题?