2017-10-05 345 views
0

我试图实现一个模型,该模型需要167个分类变量(0或1)的数组,并输出0和1之间的估计值。超过300个数据点可用。使用基本模型时,下面在sklearn/keras中使用cross_val_score时的负损失函数。当不使用k折叠

的样板工程:

classifier = Sequential() 
classifier.add(Dense(units = 80, kernel_initializer = 'uniform', activation = 'relu', input_dim = 167)) 
classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) 

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) 

classifier.fit(X_train, y_train, batch_size = 10, epochs = 200) 

y_pred = classifier.predict(X_test) 

输出类似于:

Epoch 105/200 
253/253 [==============================] - 0s - loss: 0.5582 - acc: 0.0079   
Epoch 106/200 
253/253 [==============================] - 0s - loss: 0.5583 - acc: 0.0079 

不幸的是,当我尝试使用交叉验证,模型停止工作,并损失功能变大而消极。代码如下:

def build_classifier(): 
    classifier = Sequential() 
    classifier.add(Dense(units = 80, kernel_initializer = 'uniform', activation = 'relu', input_dim = 167)) 
    classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) 
    classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) 
    return classifier 
classifier = KerasClassifier(build_fn = build_classifier, batch_size = 10, epochs = 100) 
accuracies = cross_val_score(estimator = classifier, X=X_train, y=y_train, cv=3,n_jobs=1) 

输出的样子:

Epoch 59/100 
168/168 [==============================] - 0s - loss: -1106.9519 - acc: 0.0060   
Epoch 60/100 
168/168 [==============================] - 0s - loss: -1106.9519 - acc: 0.0060 

我有不同的参数玩弄,但我似乎无法找到是什么原因造成的问题。仍在学习,所以任何帮助都非常感谢。

回答

0

如果数据稀疏,就会发生这种情况。许多NaN和Infs都可能导致此问题。如果您正在进行3次验证,则有可能在其中一次折叠中,所选数据中包含的信息不足。可能的解决方案可以是:

  1. 更改随机种子。
  2. 增加数据集。