我想为一个简单的分类问题构建一个简单的神经网络。我刚刚发现了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函数,为应该具有大约1.0的F1的分类器获得0.0 F1分数。
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),
)
我是否需要以其他方式配置网络以获得正确的输出形状?
这有点令人困惑,因为训练标签是一维矢量,并且对形状没有抱怨。