기존코드
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import StratifiedKFold
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import StratifiedKFold
estimator = KerasClassifier(build_fn=create_deep_learning_model, epochs=5, batch_size=5)
#위와 같이Kerasclassifier라는 sklearn의 wrapper 클래스를 통해서 estimator를 만든다 코드가 굉장히 간결하고 쉽다.
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=seed)
y_pred = cross_val_predict(estimator, x_train_res, y_train_res, cv=kfold)
validation_acc = y_pred.mean()*100
독립 변수의 개수가 많은 빅데이터에서는 과최적화가 쉽게 발생한다. 따라서 scikit-learn 의 model_selection 서브 패키지는 교차검증을 위한 다양한 명령을 제공한다.[출저,데이터 사이언스 스쿨]
train_test_split 명령은 데이터를 학습용 데이터와 검증용 데이터로 분리한다. 사용법은 다음과 같다.
train_test_split(data, data2, test_size, train_size, random_state)
data : 독립 변수 데이터 data2 : 종속 변수 데이터, test_size : 검증용 데이터 개수(1보다 작은 실수이면 비율) train_size, random_state :난수 시드
Kfold, StratifiedKFold, StratifiedShuffleSplit 각각이 무슨 차이를 가지고 있는지 알아보자
KFold는 각각의 테스트 셋이 섞이지 않을수는 있지만 절대 겹쳐서는 안된다. KFold와 셔플을 같이 사용하면 데이터는 처음 시작할때 셔플되고, 각 split으로 나뉘게 된다. 테스트 셋은 각 split중 하나가 되고 나머지가 트레인셋이된다.
SuffleSplit은 데이터가 매 순간 셔플되고 그 다음에 나뉜다. 이것은 테스트셋이 각 스플릿 간에 중복될 수 있음을 나타낸다.
참고문헌 : (stackoverflow - https://stackoverflow.com/questions/45969390/difference-between-stratifiedkfold-and-stratifiedshufflesplit-in-sklearn)
추가 설명을 덧붙이자면
StratifiedKFold는 KFold의 variation이다. 첫째로 StratifiedKFold는 데이터를 셔플하고 n_splits로 나눈다.
cross-validation 문서 참고가능! : https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation
위와 같이 코드를 작성하게 되면 메모리를 굉장히 많이 사용하게 된다. 그래서 많은 수의 독성 assay에 대한 모델을 각각 만들어야 하는데
10개정도 만들면 메모리가 꽉차 버리는 현상...
wrapping이 되어 있어서 메모리를 많이 먹는건지?? 8기가나 되는 메모리가 꽉차버린다.
한 멋진 대학원생 선배의 조언을 받아서 코드를 아래와 같이 수정했더니
100개 이상의 assay를 충분히 다 돌릴 수 있을 정도로 메모리 사용량이 줄었다.
바꾼코드
#cross validation 구현.
from sklearn.model_selection import KFold # import KFold
kf = KFold(n_splits=5, shuffle=True, random_state=seed ) # Define the split - into 2 folds
kf.get_n_splits(x_train_res) # returns the number of splitting iterations in the cross-validator
validation_acc_list = [0,0,0,0,0] # 각 단계에서 val_acc 저장할 배열
num = 0
sum_mat = [[0,0],[0,0]] #conf_mat 더할 배열.
for train_index, test_index in kf.split(x_train_res):
print("TRAIN:", train_index, "TEST:", test_index)
x_train, x_test = x_train_res[train_index], x_train_res[test_index]
y_train, y_test = y_train_res[train_index], y_train_res[test_index]
model.load_weights('model.h5') #가중치 초기화
model.fit(x_train,y_train, epochs =5, batch_size=5)
scores = model.evaluate(x_test,y_test)
validation_acc_list[num] = scores[1]*100
print(validation_acc_list[num])
pred_y = model.predict(x_test)
pred_y[0]
i = 0
for k in pred_y :
if(k<0.5) : pred_y[i] = 0
else : pred_y[i] = 1
i += 1
conf_mat = confusion_matrix(y_test,pred_y)
print(conf_mat)
sum_mat = sum_mat + conf_mat
print(sum_mat)