哪个评级的损失函数

时间:2018-03-27 21:01:49

标签: neural-network keras

我有MovieLens 100k数据集并加入了电影&用户数据集在一起并将评级拆分为:

age                           49
gender                         1
year                        1997
unknown                        0
action                         0
adventure                      0
animation                      0
...
thriller                       0
war                            0
western                        0
occupation_administrator       0
occupation_artist              0
occupation_doctor              0
...
occupation_technician          0
occupation_writer              1

在目标表中,整数评级从1到5。

我目前正在设置这样的模型:

model = Sequential()
model.add(Dense(250, input_shape=(len(X.columns),),activation='relu'))
model.add(Dense(250, input_shape=(len(X.columns),),activation='relu'))
model.add(Dense(1, input_shape=(len(X.columns),),activation='softmax'))
model.compile(optimizer='adam',loss='mean_squared_error',metrics=['accuracy'])

但我也尝试用

绘制评分
target = pandas.get_dummies( Y )

然后做:

model.add(Dense(5, input_shape=(len(X.columns),),activation='softmax'))
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])

两者都会产生低精度。

在这种情况下使用的最佳功能是什么,因为它不是真正的类别。意思是如果模型预测1但目标实际上是5那么损失应该比模型预测的要高得多4.这就是为什么我认为用类别进行分类是一个坏主意。
但是我希望模型根据整数值计算它的准确性。意思是假设模型计算4.2并且目标是4,那么这应该被计算为正确(为了准确起见,而不是损失)。这可能吗?

1 个答案:

答案 0 :(得分:0)

我能看到的一个主要问题是:

model.add(Dense(1, input_shape=(len(X.columns),),activation='softmax'))

softmax 会将输出归一化为总和为1.由于您只有一个输出值,因此它始终为1,如果您的真相,则会产生20%的准确度值在[1,5]范围内均匀分布。

尝试对输出图层使用其他一些激活函数,您应该看到改进。

Mean Squared Error作为一种损失函数应该可以正常工作。令人惊讶的是,使用accuracy会不太准确,所以我不知道你为什么要这样做。但如果你坚持,你可以在最后添加一个圆形图层:

model.add(Lambda(lambda x: K.round(x)))