Я хочу построить простую нейронную сеть для простой задачи классификации.Я только что обнаружил классы-оболочки 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),
)
Нужно ли настраивать сеть по-разному, чтобы получить правильную форму вывода?
Это несколько сбивает с толку, так как обучающие метки были одномерным вектором и не было никаких претензий к форме.