下面均以二分类问题为例子说明上述问题。
一、关于模型输出层激活函数的选择
如果样本序号使用的序号编码,如使用sklearn.preprocessing中的LabelEncoder样样本编码,那么输出层的激活函数应如下所示:
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
预测值是1个值,一般人为小于0.5是第一个类,大于0.5是第二类;
如果使用独热编码OneHot Encoding,这输出的是1个列表包含两个值(这里是二分类),哪个值大就是属于哪个类别,其输出层激活函数应如下所示:
model.add(Dense(2, activation='softmax'))
其他多分类的也与此相同。
二、关键模型编译中精度评级指标和loss方法的选择
如果是二分类loss选择二元交叉熵 (binary crossentropy)即可,如果是多分类可以采用类别交叉熵 (categorical crossentropy)。
另外,模型编译中的metrics除了常用的‘accuracy’,还可以使用自定义metrics,比如F1-score指标,这需要先定义该指标评价函数:
def f1_score(yTrue, yPred):
"""
计算F1 score.
"""
tp = tf.keras.backend.sum(tf.keras.backend.round(tf.keras.backend.clip(yTrue * yPred, 0, 1)))
# tn = tf.keras.backend.sum(tf.keras.backend.round(tf.keras.backend.clip((1 - yTrue) * (1 - yPred), 0, 1)))
fp = tf.keras.backend.sum(tf.keras.backend.round(tf.keras.backend.clip((1 - yTrue) * yPred, 0, 1)))
fn = tf.keras.backend.sum(tf.keras.backend.round(tf.keras.backend.clip(yTrue * (1 - yPred), 0, 1)))
precision = tp / (tp + fp + tf.keras.backend.epsilon())
recall = tp / (tp + fn + tf.keras.backend.epsilon())
f1_score = 2 * precision * recall / (precision + recall + tf.keras.backend.epsilon())
return f1_score
然后在模型编译时调用该函数即可,如下所示:
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.003),
loss='binary_crossentropy',
metrics=[f1_score])