• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

GridSearchCV

23.01.27 14:08 작성 조회수 146

0

GridSearchCV 에 y_test 값을 주지 않아도 알아서 정확도를 추론해 내는 걸 보니,

굳이 GridSearchCV 의 인자로 X_train 과 y_train 을 줘야할 이유가 있을까요?

그냥 titanic_df의 피처값과 타겟값을 GridSearchCV 의 인자로 던져주는 것이 우리의 목표인 accuracy를 향상시키는 방법 아닌가요?

답변 2

·

답변을 작성해보세요.

0

25mgsong님의 프로필

25mgsong

질문자

2023.01.30

아 제가 잘못 얘기했네요

1) GridSearchCV객체의 fit() 메소드의 인자로 x_train, y_train을 줄때 GridSearchCV객체가 알아서 최적 하이퍼 파라미터를 추론해낸다는 말은 GridSearchCV 객체 내부에서 fit 매소드의 인자로 들어온 x_train과 y_train을 다시 트레인셋과 테스트셋으로 쪼개어서 성능 평가를 진행하나요?

2) 만약 1번 질문이 답변이 YES 라면, titanic_df 의 전체 레이블값과 전체 타겟값을 인자로 주면, GridSearchCV 객체 내부에서 fit 매소드를 이용하여 이 두 인자를 트레인셋과 테스트셋으로 쪼개어서 성능 평가를 진행한다는 말이 됩니다.

그럼, 굳이 x_train과 y_train을 인자로 주어야 하는지요? 정확도 (scoring = "accuracy")를 극대화 할려면 위의 방식이 더 적합한 것 같습니다만...

from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
import random

random_num = 0
fit_all = 0
fit_trains = 0
for i in range(1000):
    random_num = random.randint(1, 1000)
    X_train, X_test, y_train, y_test = train_test_split(label, target, test_size=0.2, random_state=random_num)

    parameters = {'max_depth':[2,3,5,10],
                 'min_samples_split':[2,3,5], 'min_samples_leaf':[1,5,8]}

    grid_dtc = GridSearchCV(dtc, param_grid=parameters, scoring="accuracy", cv=5)
    grid_dtc.fit(label, target)
    best_dtc = grid_dtc.best_estimator_
    pred = best_dtc.predict(X_test)
    fit_all += accuracy_score(pred, y_test)
    
    grid_dtc = GridSearchCV(dtc, param_grid=parameters, scoring="accuracy", cv=5)
    grid_dtc.fit(X_train, y_train)
    best_dtc = grid_dtc.best_estimator_
    pred = best_dtc.predict(X_test)
    fit_trains+= accuracy_score(pred, y_test)

print("fit_all 평균 정확도:", np.round(fit_all/1000,4))
print("fit_trains 평균 정확도:", np.round(fit_trains/1000,4))
------------------------------------
fit_all 평균 정확도: 0.8368
fit_trains 평균 정확도: 0.8066

1) GridSearchCV객체의 fit() 메소드의 인자로 x_train, y_train을 줄때 GridSearchCV객체가 알아서 최적 하이퍼 파라미터를 추론해낸다는 말은 GridSearchCV 객체 내부에서 fit 매소드의 인자로 들어온 x_train과 y_train을 다시 트레인셋과 테스트셋으로 쪼개어서 성능 평가를 진행하나요?

=> x_train과 y_train은 학습과 검증 데이터로 fold 방식으로 번갈아 가면서 쪼개어 성능 평가를 진행합니다. 말씀하신 테스트 세트가 검증 세트를 의미하는건지요? 아님 정말 모델의 최종 평가를 위한 테스트 데이터 세트인지요. GridSearchCV는 x_train과 y_train을 테스트 데이터가 아닌 학습과 검증 데이터로 쪼갭니다.

2) 만약 1번 질문이 답변이 YES 라면, titanic_df 의 전체 레이블값과 전체 타겟값을 인자로 주면, GridSearchCV 객체 내부에서 fit 매소드를 이용하여 이 두 인자를 트레인셋과 테스트셋으로 쪼개어서 성능 평가를 진행한다는 말이 됩니다.

그럼, 굳이 x_train과 y_train을 인자로 주어야 하는지요? 정확도 (scoring = "accuracy")를 극대화 할려면 위의 방식이 더 적합한 것 같습니다만...

=> 음.. 여기서 제가 잘 이해를 못하겠군요.

전체 레이블 값과 전체 타겟값의 차이가 무엇인지요? 레이블과 타겟은 통상 같은 의미로 받아들여 집니다. 그리고 피처 데이터인 x_train을 넣지 않고도 쪼개질 수 있다고 생각하시는 근거가 무엇인지요?

더불어 GridSearchCV의 fit( ) 인자로 x_train과 y_train을 넣어주지 않고도 학습과 검증 데이터로 쪼개질 수 있다고 생각하시는 바는 어떤 것인지요?

 

0

안녕하십니까,

음, 질문을 잘 이해하지 못했습니다.

GridSearchCV의 생성 인자로 x_train, y_train을 주지 않습니다.

GridSearchCV객체의 fit() 메소드의 인자로 x_train, y_train을 줍니다.

그리고 GridSearchCV 에 y_test 값을 주지 않아도 알아서 정확도를 추론해 낸다는 것은 어떤 의미인지요?

GridSearchCV는 학습할 모델 객체와 튜닝 파라미터 리스트, Cross validation 횟수, 그리고 이들을 기반으로 Cross validation 시 최적 성능 지표를 인자로 받으며, GridSearchCV를 실제로 구동하는 것은 fit() 메소드를 통해서 이며 이때 학습과 평가에 사용될 x_train과 y_train을 인자로 주게 되어 있습니다.

원하시는 답변이 아니면 질문 내용을 보다 상세하게 기재 부탁드립니다.

감사합니다.