묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
DNN GridsearchCV시 score가 좀 이상합니다
안녕하세요, 딥러닝 모델을 sklearn GridsearchCV를 통해 튜닝하고 있습니다. 모델과 GridsearchCV는 아래와 같이 정의되어 있습니다. def create_model(n_filter_1st_conv, conv_n_filter, conv_kernel_sizes, n_params_1st_dense, dense_layer_sizes, dropout, lr, l1, l2): model = Sequential() model.add(BatchNormalization()) model.add(Conv2D(filters=n_filter_1st_conv, activation=tf.nn.leaky_relu, kernel_size=(conv_kernel_sizes, conv_kernel_sizes), padding='same', strides=(1, 1), kernel_initializer='he_normal', bias_initializer='he_normal', kernel_regularizer=regularizers.l1_l2(l1=l1, l2=l2), activity_regularizer=regularizers.l1_l2(l1=l1, l2=l2))) for n_filters in conv_n_filter: model.add(Conv2D(filters=n_filters, activation=tf.nn.leaky_relu, kernel_size=(conv_kernel_sizes, conv_kernel_sizes), padding='same', strides=(1, 1), kernel_initializer='he_normal', bias_initializer='he_normal', kernel_regularizer=regularizers.l1_l2(l1=l1, l2=l2), activity_regularizer=regularizers.l1_l2(l1=l1, l2=l2))) model.add(MaxPooling2D(pool_size=(4, 2))) model.add(Dropout(dropout)) model.add(Flatten()) model.add(Dense(n_params_1st_dense, activation=tf.nn.leaky_relu, kernel_initializer='he_normal', bias_initializer='he_normal', kernel_regularizer=regularizers.l1_l2(l1=l1, l2=l2), activity_regularizer=regularizers.l1_l2(l1=l1, l2=l2))) model.add(Dropout(dropout)) for layer_sizes_2 in dense_layer_sizes: model.add(Dense(layer_sizes_2, activation=tf.nn.leaky_relu, kernel_initializer='he_normal', bias_initializer='he_normal', kernel_regularizer=regularizers.l1_l2(l1=l1, l2=l2), activity_regularizer=regularizers.l1_l2(l1=l1, l2=l2))) model.add(Dense(1, activation='sigmoid', kernel_initializer='he_normal', bias_initializer='he_normal')) model.compile(loss=tf.keras.losses.BinaryCrossentropy(), optimizer=Adam(learning_rate=lr), metrics=[tf.keras.metrics.BinaryCrossentropy(), tf.keras.metrics.Accuracy(), tf.keras.metrics.BinaryAccuracy(), tf.keras.metrics.AUC()]) return modelClassification_model = KerasClassifier(build_fn=create_model)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=rand_st)parameters = { 'n_filter_1st_conv': [16], 'conv_kernel_sizes': [2], 'conv_n_filter': [(16, 32, 64)], 'n_params_1st_dense': [1000], 'dense_layer_sizes': [(64, 8)], 'lr': [1e-3], 'dropout': [0.25], 'l1': [1e-3], 'l2': [1e-3], 'batch_size': [64], 'epochs': [100],}grid_search = GridSearchCV(estimator=Classification_model, param_grid=parameters, refit=False, scoring='accuracy', return_train_score=True, cv=2, error_score="raise")with tf.device('/GPU:1'): grid_search = grid_search.fit(X_train, y_train, verbose=1)# gridesearch 결과print("최고의 파라미터 :", grid_search.best_params_)print("최고 평균 accuracy : ", grid_search.best_score_) (문제를 해결하기 위해 cv=2로 두고, parameter들을 하나씩 하여 단순화해두었습니다. ) CV가 진행 중에는 아래와 같이 accuracy와 auc가 높게 나오다가, CV 1/2 Epoch 100/100 2/2 [==============================] - 0s 8ms/step - loss: 34.9196 - binary_crossentropy: 0.3310 - accuracy: 0.0000e+00 - binary_accuracy: 0.9829 - auc: 0.9911 CV 2/2 Epoch 100/100 2/2 [==============================] - 0s 10ms/step - loss: 38.7264 - binary_crossentropy: 0.3268 - accuracy: 0.0000e+00 - binary_accuracy: 0.9744 - auc_1: 0.9958 CV가 끝난 후 grid_search.best_score_로 accuracy를 뽑을 때는 아래처럼 낮은 accuracy가 나오는 것을 확인하였습니다. 최고 평균 accuracy : 0.6196581196581197 제가 알기로는 best_score_는 metric에 지정된 값에 대한 평균이라고 알고있는데.. 제가 생각하기로는 1. model compile에 넣어준 Keras loss 및 Keras metric과 GridsearchCV에서 사용하는 sklearn metric이 작동하는 방식이 달라 생기는 문제 2. CV부분에서 출력되는 loss와 metric들이 training set의 것 이라서 일어나는 게 아닐까 생각만 하고 있는데, 혹시 왜 이런 일이 일어나는지 알고계시는 분 계시면 답변 부탁드립니다.
-
미해결
gridsearchCV result score가 동일하게 나옵니다.
import numpy from sklearn.model_selection import GridSearchCV from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasClassifier #load data data = pd.read_csv('~/all.csv') df - data.iloc[:, 4:] X = pd.DataFrame(df.values) Y = pd.DataFrame(data, columns=['number']) X_train, X_test, Y_train, Y_test = train_test_split(X.values, Y.values, test_size=0.1, random_state=42) # Function to create model, required for KerasClassifier def create_model(neurons=256): # create model model = Sequential() model.add(Dense(neurons, input_dim=8192, activation='sigmoid')) model.add(Dense(neurons, activation='sigmoid')) model.add(Dense(neurons, activation='sigmoid')) model.add(Dense(neurons, activation='sigmoid')) model.add(Dense(1, activation='linear')) # Compile model model.compile(loss='mae', optimizer='adam') return model # fix random seed for reproducibility seed = 7 numpy.random.seed(seed) model = KerasClassifier(build_fn=create_model, verbose=0, batch_size = 8) # define the grid search parameters neurons = [256] epochs = [32, 64] param_grid = dict(neurons=neurons, epochs=epochs) grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=3, scoring='r2') grid_result = grid.fit(X_train, Y_train) # summarize results print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_)) means = grid_result.cv_results_['mean_test_score'] stds = grid_result.cv_results_['std_test_score'] params = grid_result.cv_results_['params'] for mean, stdev, param in zip(means, stds, params): print("%f (%f) with: %r" % (mean, stdev, param)) 코드입니다. 이렇게 실행시키면 결과값이 모두 동일한 값이 나와요. Best: -16.710561 using {'epochs': 32, 'neurons': 256} -16.710561 (5.419502) with {'epochs': 32, 'neurons': 256} -16.710561 (5.419502) with {'epochs': 64, 'neurons': 256} 위 값 뿐만아니라 mean_test_socre 등 모든 값이 동일하게 나와 최적의 parameter를 구할수 없습니다. 무엇이 문제인지 알려주세요.
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
안녕하세요:) 질문이 있습니다.
안녕하세요:) 강의 너무 잘 듣고 있습니다. 다름이 아니라 scikitlearn wrapper를 이용하여 XGboost 하이퍼파라미터 서치를 수행하고 있는데요..! 아래와 같이 gridsearchCV에 CV는 데이터 수가 적어 leave-one-out cross validation을 적용하여 사용하려고 합니다. early_stopping 기준은 어떻게 줘야할지 잘 모르겠어서 100으로 현재 준 상태입니다. # set data X = df.iloc[:, 1:-1] y = df["Y"] # define fit_params fit_params = {'early_stopping_rounds': 100, 'eval_set':[(X,y)]} # define grid_search model_grid_cv = GridSearchCV(estimator=model, param_grid=param_grid, scoring="accuracy", cv=loo, n_jobs=-1, verbose=True) # fit_model model_grid_cv.fit(X, y, **fit_params) LightGBM의 경우 아래와 코드를 수행했을 때 1시간만에 결과가 잘 나왔는데 XGBoost는 20시간 가까이 계속 코드가 돌고 있더라고요,,,, 그냥 기다리는 것이 좋을 까요? 아니면 early_stopping을 낮게 줘서라도 수렴을 하는 것을 확인해야할까요? 너무 낮게 줘버리면 성능이 잘 나오지 않을 것 같아서 난해한 상황이라 선생님의 의견을 듣고 싶습니다. 감사합니다!