我正在开发TFX中的加权Keras模型,以减轻模型中存在公平性问题的一个功能。如果我没记错的话,我相信根据此文档enter link description here,我正在寻找使用sample_weights吗?
def _keras_model_builder():
"""Build a keras model for COMPAS dataset classification."""
feature_columns = []
feature_layer_inputs = {}
for key in transformed_names(INT_FEATURE_KEYS):
feature_columns.append(tf.feature_column.numeric_column(key))
feature_layer_inputs[key] = tf.keras.Input(shape=(1,), name=key)
for key, num_buckets in zip(transformed_names(CATEGORICAL_FEATURE_KEYS),
MAX_CATEGORICAL_FEATURE_VALUES):
categorical_column = tf.feature_column.categorical_column_with_identity(
key, num_buckets=num_buckets)
feature_columns.append(
tf.feature_column.indicator_column(categorical_column))
feature_layer_inputs[key] = tf.keras.Input(
shape=(1,), name=key, dtype=tf.dtypes.int32)
feature_columns_input = tf.keras.layers.DenseFeatures(feature_columns)
feature_layer_outputs = feature_columns_input(feature_layer_inputs)
dense_layers = tf.keras.layers.Dense(
20, activation=tf.nn.relu, name='dense_1')(feature_layer_outputs)
dense_layers = tf.keras.layers.Dense(
10, activation=tf.nn.relu, name='dense_2')(dense_layers)
dense_layers = tf.keras.layers.Dense(
5, activation=tf.nn.relu, name='dense_3')(dense_layers)
dense_layers = tf.keras.layers.BatchNormalization()(dense_layers)
output = tf.keras.layers.Dense(
1, name='predictions')(dense_layers)
inputs = [v for v in feature_layer_inputs.values()]
sample_weights = tf.keras.layers.Input(
shape=[1], dtype=tf.float32, name='race_xf')
model = tf.keras.Model(inputs=inputs,
sample_weights=sample_weights,
outputs=output)
model.compile(
loss=tf.keras.losses.MeanAbsoluteError(),
optimizer=tf.optimizers.Adamax(learning_rate=_LEARNING_RATE))
return model
但是此代码会产生以下错误:
TypeError: ('Functional models may only specify `name` and `trainable` keyword arguments during initialization. Got an unexpected argument:', 'sample_weights')
这是一个分为两部分的问题,但是
非常感谢!
答案 0 :(得分:0)
对于初学者来说,sample_weights参数已被初始化(在初始化过程中传递给它),然后传递给Model的fit()方法。
第二,这用于降低任何给定样本对损失函数以及整个学习过程的重要性。
有多种方法可以最简单地“改善公平性”:完全放弃“不公平特征”。 更好的是,找到经过工程设计/组合/相乘的特征,当它们与“不公平特征”组合/相乘时,消除了“不公平特征”对偏差的影响(自行)。 第三:您可以尝试减少带有“不公平功能”的示例的权重,但是由于减少了从这些示例的其他方面的学习,因此可能会导致准确性下降。 我想说,如果有时间的话,通过乘以特征来选择工程特征的第二种选择是最好的,而完全放弃特征是第二好的选择。 我认为,如果您的目标/问题是公平的,那么加权并不是要走的路。但是,如果数据集不平衡,则使用sample_weights或Class_weights How to set class weights for imbalanced classes in Keras?