2016-11-26 1 views
0

현재 교차 회귀 분석을 사용하여 회귀 네트워크를 학습 중입니다. 레이블이 없지만 특정 출력에 매핑해야하는 특정 입력은 네트워크에서 매핑을 생성해야합니다. 폴드 방법에 문제가있는 것 같습니다. 정의되고있다.각 k 폴드의 크기는 어떻게 정의됩니까?

내가 crossvalidation을 할 방법은 다음과 같이이다 :이 코드

############################### Training setup ################################## 

#Define 10 folds: 
seed = 7 
np.random.seed(seed) 
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) 
print "Splits" 
cvscores_loss = [] 

for train, test in kfold.split(train_set_data_vstacked_normalized,train_set_output_vstacked): 

    print "Model definition!" 
    model = Sequential() 

    #act = PReLU(init='normal', weights=None) 
    model.add(Dense(output_dim=400,input_dim=400, init="normal",activation=K.tanh)) 

    #act1 = PReLU(init='normal', weights=None) 
    model.add(Dense(output_dim=400,input_dim=400, init="normal",activation=K.tanh)) 

    #act2 = PReLU(init='normal', weights=None) 
    model.add(Dense(output_dim=400, input_dim=400, init="normal",activation=K.tanh)) 

    act4=ELU(10000) 
    model.add(Dense(output_dim=13, input_dim=300, init="normal",activation=act4)) 

    print "Compiling" 
    model.compile(loss='mean_squared_error', optimizer='RMSprop', metrics=["accuracy"]) 
    print "Compile done! " 

    print '\n' 

    print "Train start" 
    model.fit(train_set_data_vstacked_normalized[train],train_set_output_vstacked[train], nb_epoch=10, verbose=1) 

    loss, accuracy = model.evaluate(x=train_set_data_vstacked_normalized[test],y=train_set_output_vstacked[test],verbose=1) 
    print 
    print('loss: ', loss) 
    print('accuracy: ', accuracy) 
    print() 
    print model.summary() 
    print "New Model:" 
    cvscores_loss.append(loss) 


print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores_loss), numpy.std(cvscores_loss))) 

문제는 내가 ... 인쇄 그것은되고 있습니다 .. 루프의 입력하지 "분할"후 경고 메시지가 결코 것입니다. 그것은, 입력 및 출력 크기는? 내 신경 네트워크의 무엇을 알고 어떻게 kfold 질문 할

Splits 
/home/k/.local/lib/python2.7/site-packages/sklearn/model_selection/_split.py:579: Warning: The least populated class in y has only 1 members, which is too few. The minimum number of groups for any class cannot be less than n_splits=10. 

...

내가 어딘가를 정의해야 하는가? 또는 ...?

답변

1

메시지는 문제를 알려줍니다. 대상 클래스 중 하나에 멤버가 하나뿐입니다. 그것이 10 배로 계층화 될 때 각 접이에 1을 넣을 수 있도록 각 클래스의 최소 10 명의 구성원이 필요합니다.

문제가되는 클래스를 찾아서 제거하려면 대상 클래스의 수를 확인해야합니다.

+0

그것을

from keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import StratifiedKFold from sklearn.model_selection import cross_val_score 

모델을 정의하는 기능을 만듭니다 회귀 문제. 그래서 수업이 없어 .. 나는 특정 네트워크에 특정 출력을 올바르게 매핑하도록 네트워크를 훈련 중이다. 어떤 출력물은 라벨이 아니라 길이 13의 원시 피처입니다. 또한'train_set_output_vstacked [0]'도 출력됩니다. –

+1

StratifiedKFold에는 클래스가 필요합니다. 회귀 분석에는 KFold를 사용하십시오. 또는 cross_val_score를 사용하는 경우 회귀 또는 분류 중 어떤 것을 기반으로할지 선택합니다. – simon

0

나는 이것을 복잡하게 생각합니다. Keras 모델에서 교차 유효성 검사를 수행해야하는 경우 keras scikit-learn API을 사용할 수 있습니다. 이렇게하려면 다음을 수행해야합니다

가져 오기 몇 가지 물건 : 래퍼

def model_creation(): 
    model = Sequential() 
    model.add(...) 
    ... 
    model.compile(...) 
    return model 

및 사용 :

model = KerasClassifier(build_fn=model_creation, nb_epoch=100, batch_size=100, verbose=0) 
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42) 
results = cross_val_score(model, X, y, cv=kfold) 
관련 문제