我有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,那么这应该被计算为正确(为了准确起见,而不是损失)。这可能吗?
答案 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)))