【发布时间】:2019-10-24 16:49:12
【问题描述】:
有 29 列,其中我必须预测 winPlacePerc(数据帧的极端端)介于 1(高 perc ) 到 0(低 perc)
29 列中 25 是 数字 数据 3 是 ID(object) 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
我也碰巧有非常大量的数据,比如 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 层作为我的 输出层
这是训练和验证损失和准确度图
我还尝试使用 step 函数和 binary cross entropy 损失函数将标签转换为 binary
之后 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 和 1,因为我使用的是二进制交叉熵,现在我将尝试均方损失原始标签数据
-
尝试添加更多层,将数值列标准化为-1、1,尝试使用学习率。
标签: python machine-learning keras classification data-science