Плоский выходной вектор для нейронной сети простого классификатора с keras / scikit-learn - PullRequest
0 голосов
/ 13 мая 2019

Я хочу построить простую нейронную сеть для простой задачи классификации.Я только что обнаружил классы-оболочки keras / scikit-learn, но поведение не совсем такое, как ожидалось.

from keras.wrappers.scikit_learn import KerasClassifier

KerasClassifier ожидает функцию сборки для сети:

def build_perceptron():
    net = keras.models.Sequential(
        [
            keras.layers.Dense(10, input_dim=4, activation="relu", kernel_initializer='random_uniform'),
            keras.layers.Dense(1, activation="sigmoid"),
        ]
    )
    net.compile(
        optimizer="adam",
        loss="binary_crossentropy",
        metrics=["binary_accuracy"]
    )
    return net

Теперь я могу использовать его следующим образом:

model = KerasClassifier(
    build_fn=build_perceptron,
    epochs=100, 
    batch_size=5,
)

Сеть учится отлично классифицировать.Тем не менее, прогнозы имеют форму (n_samples, 1) вместо (n_samples,), как и ожидалось для scikit-learn:

y_pred = model.predict(X_test)

array([[1],
       [0],
       [1],
       [1],
       [0],
       [1], 

Я попытался использовать функции scikit-learn и получил 0,0 балла F1 за классификатор, который должен иметьF1 примерно 1,0.

cross_val_score(
    KerasClassifier(
        build_fn=build_perceptron,
        epochs=100, 
        batch_size=5,
    ),
    X=X,
    y=y,
    scoring=make_scorer(f1_score, greater_is_better=True),
)

Нужно ли настраивать сеть по-разному, чтобы получить правильную форму вывода?

Это несколько сбивает с толку, так как обучающие метки были одномерным вектором и не было никаких претензий к форме.

...