多标签不平衡数据集分类
Multi Label Imbalanced dataset classification
我目前正在处理一个高度不平衡的多标签时尚项目数据集
我尝试使用 class_weights 来解决它,但每个时期的准确度仍然停留在 0.7556。有什么办法,我可以避免这个问题。我是否以错误的方式实施了 class 权重?我也尝试过使用数据扩充。
我在火车集中有 224 个独特的 classes。有的只有一个例子,很郁闷
也尝试借助此 notebook 解决问题,但我无法获得相同的准确度分数。看起来,在这个笔记本中没有考虑数据集不平衡的可能性。
def calculating_class_weights(classes,df):
number_dim = np.shape(classes)[0]
weights = np.empty([number_dim, 2])
for i in range(len(classes)):
weights[i] = compute_class_weight(class_weight='balanced', classes=[0.,1.], y=df[classes[i]])
return weights
def get_weighted_loss(weights):
def weighted_loss(y_true, y_pred):
y_true = tf.cast(y_true, tf.float32)
return K.mean((weights[:,0]**(1-y_true))*(weights[:,1]**(y_true))* K.binary_crossentropy(y_true, y_pred), axis=-1)
return weighted_loss
weights=calculating_class_weights(train_labels,train_df)
train_dataGen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range = 0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest',
)
valid_dataGen = ImageDataGenerator(rescale=1./255)
model = keras.models.Sequential([
keras.layers.Conv2D(filters=96, kernel_size=(11,11), strides=(4,4), activation='relu', input_shape=(256,256,3)),
keras.layers.BatchNormalization(),
keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
keras.layers.Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), activation='relu', padding="same"),
keras.layers.BatchNormalization(),
keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
keras.layers.BatchNormalization(),
keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
keras.layers.BatchNormalization(),
keras.layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
keras.layers.BatchNormalization(),
keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
keras.layers.Flatten(),
keras.layers.Dense(4096, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(4096, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(224, activation='sigmoid')
])
model.compile(loss=get_weighted_loss(weights), optimizer='adam', metrics=['accuracy'])
model.fit(train_generator,
epochs=10,
validation_data=valid_generator,
callbacks=[tensorboard_cb,lrr])
首先,Precision和Recall等指标只关注正class,避免了class多class关注指标遇到的问题】 失衡。因此,如果我们继续考虑所有指标,我们可能无法获得有关负面 class 表现的足够信息。 Haibo He 等人建议使用以下指标对这两项进行评分:
- 几何平均数。
- F-测量。
- 宏观平均准确度。
- 阈值指标的新组合:平均值-Class-加权精度、优化精度、调整几何平均值、平衡精度指数。
我的建议:
- 使用 PR 曲线和 F1 分数。
- 尝试使用几何变换、光度变换、随机遮挡(避免过度拟合)、SMOTE、Tomek 链接(对多数欠采样)等
- 随机欠采样可能会删除数据集的相关特征。同样,使用 KNN 和其他类似技术分析您的数据集。
- 查看这本书:H. He 和 Y. Ma,不平衡学习:基础、算法和应用,新泽西州霍博肯:Wiley-IEEE 出版社,2013 年。
我目前正在处理一个高度不平衡的多标签时尚项目数据集 我尝试使用 class_weights 来解决它,但每个时期的准确度仍然停留在 0.7556。有什么办法,我可以避免这个问题。我是否以错误的方式实施了 class 权重?我也尝试过使用数据扩充。
我在火车集中有 224 个独特的 classes。有的只有一个例子,很郁闷
也尝试借助此 notebook 解决问题,但我无法获得相同的准确度分数。看起来,在这个笔记本中没有考虑数据集不平衡的可能性。
def calculating_class_weights(classes,df):
number_dim = np.shape(classes)[0]
weights = np.empty([number_dim, 2])
for i in range(len(classes)):
weights[i] = compute_class_weight(class_weight='balanced', classes=[0.,1.], y=df[classes[i]])
return weights
def get_weighted_loss(weights):
def weighted_loss(y_true, y_pred):
y_true = tf.cast(y_true, tf.float32)
return K.mean((weights[:,0]**(1-y_true))*(weights[:,1]**(y_true))* K.binary_crossentropy(y_true, y_pred), axis=-1)
return weighted_loss
weights=calculating_class_weights(train_labels,train_df)
train_dataGen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range = 0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest',
)
valid_dataGen = ImageDataGenerator(rescale=1./255)
model = keras.models.Sequential([
keras.layers.Conv2D(filters=96, kernel_size=(11,11), strides=(4,4), activation='relu', input_shape=(256,256,3)),
keras.layers.BatchNormalization(),
keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
keras.layers.Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), activation='relu', padding="same"),
keras.layers.BatchNormalization(),
keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
keras.layers.BatchNormalization(),
keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
keras.layers.BatchNormalization(),
keras.layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
keras.layers.BatchNormalization(),
keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
keras.layers.Flatten(),
keras.layers.Dense(4096, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(4096, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(224, activation='sigmoid')
])
model.compile(loss=get_weighted_loss(weights), optimizer='adam', metrics=['accuracy'])
model.fit(train_generator,
epochs=10,
validation_data=valid_generator,
callbacks=[tensorboard_cb,lrr])
首先,Precision和Recall等指标只关注正class,避免了class多class关注指标遇到的问题】 失衡。因此,如果我们继续考虑所有指标,我们可能无法获得有关负面 class 表现的足够信息。 Haibo He 等人建议使用以下指标对这两项进行评分:
- 几何平均数。
- F-测量。
- 宏观平均准确度。
- 阈值指标的新组合:平均值-Class-加权精度、优化精度、调整几何平均值、平衡精度指数。
我的建议:
- 使用 PR 曲线和 F1 分数。
- 尝试使用几何变换、光度变换、随机遮挡(避免过度拟合)、SMOTE、Tomek 链接(对多数欠采样)等
- 随机欠采样可能会删除数据集的相关特征。同样,使用 KNN 和其他类似技术分析您的数据集。
- 查看这本书:H. He 和 Y. Ma,不平衡学习:基础、算法和应用,新泽西州霍博肯:Wiley-IEEE 出版社,2013 年。