代码之家  ›  专栏  ›  技术社区  ›  ScalaBoy

ValueError:分类指标无法处理多标签指标和二进制目标的混合

  •  1
  • ScalaBoy  · 技术社区  · 6 年前

    我想申请 KerasCLassifier y 是一个热编码的,例如:

    0 1 0
    1 0 0
    1 0 0
    

    这是我的代码:

    from keras.models import Sequential
    from keras.layers import Dense
    from keras.wrappers.scikit_learn import KerasClassifier
    
    # Function to create model, required for KerasClassifier
    def create_model(optimizer='rmsprop', init='glorot_uniform'):
        # create model
        model = Sequential()
        model.add(Dense(2048, input_dim=X_train.shape[1], kernel_initializer=init, activation='relu'))
        model.add(Dense(512, kernel_initializer=init, activation='relu'))
        model.add(Dense(y_train_onehot.shape[1], kernel_initializer=init, activation='softmax'))
        # Compile model
        model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
        return model
    
    # create model
    model = KerasClassifier(build_fn=create_model, class_weight="balanced", verbose=2)
    
    # grid search epochs, batch size and optimizer
    optimizers = ['rmsprop', 'adam']
    epochs = [10, 50]
    batches = [5, 10, 20]
    init = ['glorot_uniform', 'normal', 'uniform']
    
    param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)
    grid = model_selection.GridSearchCV(estimator=model, param_grid=param_grid, scoring='accuracy')
    
    grid_result = grid.fit(X_train], y_train_onehot)
    

    当我运行最后一行代码时,它在10个纪元后抛出以下错误:

    准确度评分(y_真、y_pred、标准化、样本重量) 175#计算每个可能表示的精度 --&燃气轮机;176 y_类型,y_真,y_pred=_检查_目标(y_真,y_pred) 178如果y_type.startswith('multilabel'):

    /opt/conda/lib/python3.6/site-packages/sklearn/metrics/classification.py in_check_目标(y_true,y_pred) 80 raise VALUERROR(“分类度量无法处理{0}的混合” ---&燃气轮机;81“和{1}目标”。格式(type_true,type_pred)) 83#y#u type=>上不能有多个值;这台电视机不再需要了

    ValueError:分类指标无法处理以下组合 多标签指示器和二进制目标

    categorical_accuracy balanced_accuracy 而不是 accuracy

    1 回复  |  直到 6 年前
        1
  •  1
  •   MaxU - stand with Ukraine    6 年前

    下面是一个工作演示:

    import numpy as np
    from sklearn.model_selection import GridSearchCV
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.wrappers.scikit_learn import KerasClassifier
    
    N = 100
    X_train = np.random.rand(N, 4)
    Y_train = np.random.choice([0,1,2], N, p=[.5, .3, .2])
    
    # Function to create model, required for KerasClassifier
    def create_model(optimizer='rmsprop', init='glorot_uniform'):
        # create model
        model = Sequential()
        model.add(Dense(2048, input_dim=X_train.shape[1], kernel_initializer=init, activation='relu'))
        model.add(Dense(512, kernel_initializer=init, activation='relu'))
        model.add(Dense(len(np.unique(Y_train)), kernel_initializer=init, activation='softmax'))
        # Compile model
        model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizer, metrics=['sparse_categorical_accuracy'])
        return model
    
    # create model
    model = KerasClassifier(build_fn=create_model, class_weight="balanced", verbose=2)
    
    # grid search epochs, batch size and optimizer
    optimizers = ['rmsprop', 'adam']
    epochs = [10, 50]
    batches = [5, 10, 20]
    init = ['glorot_uniform', 'normal', 'uniform']
    
    param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)
    grid = GridSearchCV(estimator=model, param_grid=param_grid, scoring='accuracy')
    
    grid_result = grid.fit(X_train, Y_train)
    

    sparse_categorical_* 损失函数和度量。