tensorflow - 多类分类问题中的不平衡类

标签 tensorflow machine-learning keras deep-learning neural-network

我正在尝试使用 TensorFlow 的 DNNClassifier 来解决我的 4 个不同类的多类(softmax)分类问题。我有一个具有以下分布的不平衡数据集:

  • 0 类:14.8%
  • 第 1 类:35.2%
  • 第 2 类:27.8%
  • 第 3 类:22.2%

  • 如何为 DNNClassifier 的 weight_column 分配权重每个类(class)?我知道如何对此进行编码,但我想知道我应该为每个类提供什么值。

    最佳答案

    有多种选项可以为不平衡分类问题构建权重。最常见的一种方法是直接使用训练中的类计数来估计样本权重。这个选项很容易通过 sklearn 计算出来. “平衡”模式使用 y 的值自动调整与类频率成反比的权重。

    我们在下面的示例中尝试做的是“合并”compute_sample_weight拟合我们的 DNNClassifier 的方法。作为标签分布,我使用了问题中表达的相同

    import numpy as np
    import pandas as pd
    import tensorflow as tf
    from sklearn.utils.class_weight import compute_sample_weight
    
    train_size = 1000
    test_size = 200
    columns = 30
    
    ## create train data
    y_train = np.random.choice([0,1,2,3], train_size, p=[0.15, 0.35, 0.28, 0.22])
    x_train = pd.DataFrame(np.random.uniform(0,1, (train_size,columns)).astype('float32'))
    x_train.columns = [str(i) for i in range(columns)]
    
    ## create train weights
    weight = compute_sample_weight(class_weight='balanced', y=y_train)
    x_train['weight'] = weight.astype('float32')
    
    ## create test data
    y_test = np.random.choice([0,1,2,3], test_size, p=[0.15, 0.35, 0.28, 0.22])
    x_test = pd.DataFrame(np.random.uniform(0,1, (test_size,columns)).astype('float32'))
    x_test.columns = [str(i) for i in range(columns)]
    
    ## create test weights
    x_test['weight'] = np.ones(len(y_test)).astype('float32') ## set them all to 1
    
    ## utility functions to pass data to DNNClassifier
    def train_input_fn():
        dataset = tf.data.Dataset.from_tensor_slices((dict(x_train), y_train))
        dataset = dataset.shuffle(1000).repeat().batch(10)
        return dataset
    
    def eval_input_fn():
        dataset = tf.data.Dataset.from_tensor_slices((dict(x_test), y_test))
        return dataset.shuffle(1000).repeat().batch(10)
    
    ## define DNNClassifier
    classifier = tf.estimator.DNNClassifier(
        feature_columns=[tf.feature_column.numeric_column(str(i), shape=[1]) for i in range(columns)],
        weight_column = tf.feature_column.numeric_column('weight'),
        hidden_units=[10],
        n_classes=4,
    )
    
    ## train DNNClassifier
    classifier.train(input_fn=lambda: train_input_fn(), steps=100)
    
    ## make evaluation
    eval_results = classifier.evaluate(input_fn=eval_input_fn, steps=1)
    

    考虑到我们的权重是作为目标的函数构建的,我们必须在我们的测试数据中将它们设置为 1,因为标签是未知的。

    关于tensorflow - 多类分类问题中的不平衡类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52383967/

    相关文章:

    python - 可以使用 Tensorflow Keras 函数式 API 模型训练 Tensorflow 变量吗?函数式 API 模型中可以使用 Tensorflow 操作吗?

    java - 将keras模型加载到java程序以预测新输入

    tensorflow - 平面一维数据上的一维卷积(即无时间序列)

    python - 在 keras fit_generator() 中未调用 on_epoch_end()

    python - Visual Studio 2015 中的 TensorFlow,使用 Canopy 作为 Python 环境

    tensorflow - 在恢复的对象: (root). Optimizer.iter中找不到检查点中的值

    tensorflow - 与线程/队列相比,tf.data.Dataset 输入管道提供了糟糕的结果

    python - (MNIST - GAN)第一次迭代后鉴别器和生成器误差下降到接近于零

    python - 如何处理猜数字游戏(带有扭曲)算法?

    machine-learning - 咖啡 |如何计算多个输入 blob 的按元素加权和?