对于我的问题,我想预测客户评论分数,范围从1到5 。 我认为将其作为回归问题来实施将是一件好事,因为模型预测的1表示真实值,而5表示真实值应该比4预测“差”。 还希望该模型能够以某种方式对于所有评论得分类别都同样好。 因为我的数据集高度不平衡,所以我想创建一个指标/损耗,该指标/损耗可以捕获此指标(我认为就像F1进行分类)。 因此,我创建了以下指标(目前仅与mse相关):
def custom_metric(y_true, y_pred):
df = pd.DataFrame(np.column_stack([y_pred, y_true]), columns=["Predicted", "Truth"])
class_mse = 0
#class_mae = 0
print("MAE for Classes:")
for i in df.Truth.unique():
temp = df[df["Truth"]==i]
mse = mean_squared_error(temp.Truth, temp.Predicted)
#mae = mean_absolute_error(temp.Truth, temp.Predicted)
print("Class {}: {}".format(i, mse))
class_mse += mse
#class_mae += mae
print()
print("AVG MSE over Classes {}".format(class_mse/len(df.Truth.unique())))
#print("AVG MAE over Classes {}".format(class_mae/len(df.Truth.unique())))
现在是一个预测示例:
import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error, mean_absolute_error
# sample predictions: "model" messed up at class 2 and 3
y_true = np.array((1,1,1,2,2,2,3,3,3,4,4,4,5,5,5))
y_pred = np.array((1,1,1,2,2,3,5,4,3,4,4,4,5,5,5))
custom_metric(y_true, y_pred)
现在我的问题是:它能够创建一个自定义的张量流损失函数,该函数能够以类似的方式起作用吗?我还研究了尚未实现张量流但可能更相似的实现:
def custom_metric(y_true, y_pred):
mse_class = 0
num_classes = len(np.unique(y_true))
stacked = np.vstack((y_true, y_pred))
for i in np.unique(stacked[0]):
y_true_temp = stacked[0][np.where(stacked[0]==i)]
y_pred_temp = stacked[1][np.where(stacked[0]==i)]
mse = np.mean(np.square(y_pred_temp - y_true_temp))
mse_class += mse
return mse_class/num_classes
但是,我仍然不确定如何在for循环中解决类似tensorflow的定义。
在此先感谢您的帮助!
答案 0 :(得分:1)
for循环应该通过张量上的numpy / tensorflow操作来精确处理。
自定义指标示例为:
from keras import backend as K
def custom_mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
其中y_true是地面真实标签,y_pred是您的预测。您可以看到没有显式的for循环。
不使用for循环的动机是矢量化操作(同时存在于numpy和tensorflow中)利用了现代CPU体系结构的优势,将多个迭代操作转换为矩阵操作。考虑到numpy中的点积实现比Python中常规的for循环要少大约30倍。