본문 바로가기

머신러닝 공부

사이킷런 프레임워크(fit, predict) 와 K-Fold

SMALL

사이킷런의 개발적인 부분에 대해서 공부를 해보고자 합니다.

 

사이킷런 기반 프레임워크 - Estimator와 fit(), predict()

fit과 predict는 사이킷런의 핵심 메소드입니다. 특히 사이킷런의 지도학습인 경우에 분류와 회귀로 구성이 되어 있는데 이 분류 알고리즘을 구현한 다양한 클래스들이 있습니다.

또한 회귀 알고리즘을 구현한 다양한 클래스들도 여러 있습니다.

사진에서 보듯이 이런 분류,회귀 구현 클래스들을 모두 Estimator라고 부릅니다. 어떻게 보면 최상위 부모 클래스라고 보면 될 것 같습니다. 그리고 분류면 Classifier라는 이름이 주어지고 회귀는 Regressor라고 이름이 주어집니다.

이런 분류든 회귀든 모든 학습은 fit()로, 예측은 predict()로 진행이됩니다.

 

내장 예제 데이터 셋 구성

데이터 셋 구성은 딕셔너리 형태로 구성이 되어 있는데 대략적인 모습은 다음과 같습니다.

 

data는 피처데이터셋을 나타내고, feature_names는 column을 나타냅니다. target값(label값)은 말 그대로 값 자체를 나타내고 target_names는 target값에 따라서 어떤 값을 의미하는지를 보여줍니다

 

실습을 할 때 load_iris()를 진행 후에 데이터 타입을 보면 Bunch라고 결과가 나옵니다. 이건 클래스 타입인데 파이썬의 딕셔너리와 비슷하다고 보면 됩니다. 따라서 key가 있고 value가 있습니다.

iris_data = load_iris()를 하며 iris_data.keys()의 반환값은 붓꽃 데이터 셋의 키들이 나오게 됩니다.

 

 

교차검증 

좀더 학습데이터를 분할해서 학습 데이터 셋과 검증 데이터 셋으로 분할을 시킵니다. 검증 데이터 세트에서 학습데이터 세트에서 학습한 모델을 다시한번 검증하여 미리 테스트를 해보는 것입니다. 그리고 또 검증 데이터 셋을 바꿉니다. 그래서 미리 실제 테스트 데이터에 적용하기 전에 미리 성능 검증이라던가 모델의 다양성을 테스트해보는 것입니다.

그래서 머신러닝이라는 모델 자체가 데이터에 굉장히 의존적입니다.

 

K 폴드 교차 검증

K번의 학습과 검증 평가 반복을 수행하게 하는 방법입니다. 이렇게 만든 폴드셋을 학습하고 검증하는 과정에서 교차 검증의 최종 평가를 낼 수 있게 합니다. 만약 K를 높인다면 수행시간은 많이 걸리고 검증 세트의 수도 줄어지게 됩니다. (1/K) 

 

K폴드 교차 검증은 2가지로 나뉠 수 있는데 하나는 일반 K 폴드이고 다른 하나는 Stratified K 폴드입니다.

Stratified K 폴드는 불균형한 분포도를 가진 레이블 (결정 클래스) 데이터 집합을 위한 K 폴드 방식입니다.

학습데이터와 검증 데이터 세트가 가지는 레이블 분포도가 유사하도록 검증 데이터 추출을 합니다. 

 

사이킷런은 KFold라는 클래스를 지원합니다. 따라서 from sklearn.model_selection import KFold로 클래스 지원을 해주면 됩니다. 이후 기본 설정은 iris = load_iris() , features = iris.data, label = iris.target으로 설정을 해주고 dt_clf = DecisionTreeClassifier(random_state = 156)과 같이 세팅을 해주겠습니다.

그리고 KFold를 만들기 위해서는 인자로 n_splits가 들어가야 합니다.

 만약 KFold = KFold(n_splits=5)를 한다면 5개의 폴드 세트로 분리하는 KFold 객체를 생성한다는 의미입니다.

cv_accuracy는 나중에 정확도 평가를 하기위해서 미리 만들어줍니다.

다음과 같이 KFold객체의 split()을 호출하여 폴드 별 학습용, 검증용 테스트의 로우 인덱스를 array로 반환시켜줍니다. 

앞서 반복문은 총 5번을 실행되면서 X_train,X_test,y_train,y_test를 각각 인덱스를 설정을 해주고 dt_clf.fit()을 이용하여서 학습을 시켜주고 predict메소드를 이용하여 예측을하여줍니다. 교차 검증이 진행될때마다 정확도, 학습데이터 크기, 검증데이터 크기를 표시시켜주며(shape로 크기 표시 및 accuracy로 정확도 표시) 검증 데이터 세트 인덱스를 리스트 형태로 표현하면서 KFold가 실행될떄 어떤 식으로 검증데이터를 반복해서 실행하는지 이에 따른 교차 검증 정확도가 어떻게 다른지를 보여줍니다. 마지막으로 cv_accuracy.append(accuracy)를 이용해서 평균 정확도를 np.mean()을 사용해 불러옵니다.

 

Stratified K-Fold

 

다음은 간단하게 KFold와 StraifiedKFold의 차이를 보이는 실습을 하겠습니다. 다음과 같이 pandas를 통해 iris.data를 데이터 기반으로 DataFrame을 만들어주었습니다. 이떄 15번째 줄에 보이는 실행화면이 다음과 같습니다.

이후 일반 kfold를 진행한다면 반복이 될 때마다 학습 데이터랑 검증데이터와 별개로 학습과 검증이 반복됩니다.

마치 수학과 영어를 공부하고 국어를 시험치는 모습과 비슷하여 이때는 kfold를 쓰는 것보단 Straified를 사용하는 것이 좋습니다.

이를 이해한 바탕으노 skfold 를 진행하여 교차 검증을 한다면 결과는 다음과 같이 나옵니다.

LIST

'머신러닝 공부' 카테고리의 다른 글

Scikit-Learn (사이킷런)  (0) 2023.02.05
Pandas (판다스) - Index  (0) 2023.02.04
Pandas(판다스) - DataFrame  (0) 2023.02.04
Pandas(판다스) - value_counts method  (0) 2023.02.03
판다스(pandas) - 기본 API (2)  (0) 2023.02.03