有29列,其中我必须预测winPlacePerc(数据帧的最末端),它介于1(高perc)到0(低perc)之间
在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标签数据在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'])
这种方法比以前更糟
正如你所看到的,在某个特定的时代之后,它不会学习,即使我取的是所有的数据,而不是它的一小部分,这种情况也会发生
在这不起作用之后,我还使用了dropout并尝试添加更多层,但在这里没有任何效果
现在我的问题是,我做错了什么?是错误的层还是数据层?我该如何改进?你知道吗
为了澄清问题-这是一个回归问题,因此使用精度实际上没有意义,因为您永远无法预测0.23124的准确值。你知道吗
首先,在将值传递到网络之前,当然希望将值(而不是热编码的值)标准化。尝试使用^{} 作为开始。你知道吗
其次,我建议更改输出层中的激活函数—尝试使用
linear
,作为损失mean_squared_error
应该可以。你知道吗为了验证模型的准确性,请将预测结果与实际结果绘制在一起,这样您就有机会直观地验证结果。不过,尽管如此,你的损失看起来已经相当不错了。你知道吗
检查this post,应该可以让您很好地掌握什么(激活和丢失函数)以及何时使用。你知道吗
准确度不是回归的好指标。让我们看一个例子
准确度是
0
,但是预测非常接近实际情况。另一方面,均方误差将非常低,即预测值与地面真实值的偏差非常小。你知道吗相关问题 更多 >
编程相关推荐