Category/빅데이터&파이썬

데이터셋 나누기 / 특성 스케일 조정 / 그리드서치 / SVM

sumin 2022. 3. 6. 19:33
728x90
반응형

 

 

데이터셋을 훈련 데이터셋과 테스트 데이터셋으로 나누기

 

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = (X,y, test_size = 0.3 , random_state=0 , stratify=y )

 

갓이키런의 model_selection 모듈에 있는 train_test_split 함수를 사용하면 데이터셋을 랜덤한 훈련 데이터셋과 테스트 데이터셋으로 나눌 수 있다.

test_size = 0.3 으로 설정했기 때문에, 샘플의 30%가 X_test와 y_test에 할당된다.

stratify = y 으로 설정하면 훈련 데이터셋과 테스트 데이터셋에 있는 클래스 비율이 원본 데이터셋과 동일하게 유지된다.

 

특성 스케일 조정

 

전처리 파이프라인에서 잊어버리기 쉽지만 중요한 단계다. ( 난 데린이라 잊어버린다. )

 

결정 트리와 랜덤 포레스트는 특성 스케일 조정에 대해 걱정할 필요가 없는 몇 안되는 머신 러닝 알고리즘 중 하나이다 !

( 내가 가장 선호하는 알고리즘이 랜덤 포레스트다. 그래서 잘 몰랐다 라고 합리화했따. )

 

사이킷런에 구현된 스케일 변환 기능은 최소-최대 / 표준화 / 정규화 등등이 있고 표준화를 위한 클래스와 코드만 적어봤다.

 

from sklearn.preprocessing import StandardScaler

stdsc = StandardScaler()

X_train_std = stdsc.fit_transform(X_train)

X_test_std = stdsc.transform(X_test)

 

과대적합

 

만약 모델이 테스트 데이터셋보다 훈련 데이터셋에서 성능이 훨씬 높다면 어떤 상황일까 ? -> 안좋은상황이다.

 

이러한 경우를 overfitting(과대적합)이라고 하고, 데이터 엔지니어로서 해결해줘야 한다.

 

1. 더 많은 훈련 데이터를 모은다.

2. 규제를 통해 복잡도를 제한한다.

3. 파라미터 개수가 적은 간단한 모델을 선택한다.

4. 데이터 차원을 줄인다. ( 이전 업로드한 글에서 있던 것 같은데, 프로 블로거라면 링크를 걸었겠지만, 나는 아니다. )

 

차원 축소에 대해 이야기를 해보자.

 

차원 축소 기법에는 특성 선택 / 특성 추출이 있다.

특성 선택은 원본 특성에서 일부를 선택하고, 특성 추출은 일련의 특성에서 얻은 정보로 새로운 특성을 만든다.

 

소위 그리디 알고리즘에 속하는 순차 특성 선택이 있다.

 

특성 추출은 주성분 분석 / 선형 판별 분석 / 커널 PCA 등이 있고, 교재에서도 위 세가지를 차례대로 설명하고 있다.

 

이 부분은 썩 끌리는 부분도 아니고, 이해하려면 너무 시간이 오래 걸릴 것 같아서 넘어갔다.

꽤 많이 공부한 줄 알았는데, 이제 6장이고 교재의 26%밖에 오지 않았따 에휴.

 

그리드 서치를 사용한 머신 러닝 모델 세부 튜닝

 

머신 러닝에는 두 종류의 파라미터가 있다. 하나는 훈련 데이터에서 학습되는 파라미터이다.( 예를 들어 로지스틱 회귀의 가중치인데, 나는 이 부분을 건드려본 적이 없다.)

다른 하나는 별도로 최적화되는 학습 알고리즘의 파라미터이며, 모델의 튜닝 파라미터이자, 하이퍼파라미터라고도 부른다.

 

그리드 서치라는 인기 있는 하이퍼파라미터 최적화 기법을 알아보자. 하이퍼파라미터 값에 대한 최적의 조합을 찾음으로써 모델 성능을 향상시키는 데 큰 도움이 된다.

 

from sklearn.model_selection import GridSearchCV

from sklearn.svm import SVC

 

pipe_svc = make_pipeline(StandardScaler(), SVC(random_state=1))

param_range = [0.0001, 0.001, 0.01, 0.1, 1.0, 10.0, 100.0 , 1000.0]

paran_grid = [{'svc___C': param_range, 'svc__kernel': ['linear']}, {'svc__C' : param_range, 'svc__gamma' : param_range, 'svc__kernel': ['rbf']}]

 

gs = GridSearchCV(estimator = pipe_svc, param_grid = param_grid , scoring ='accuracy', cv=10, refit=True, n_jobs=-1)

 

gs = gs.fit(X_train, y_train)

print(gs.best_score)

 

param_grid에 튜닝하려는 매개변수를 딕셔너리의 리스트로 지정한다. 선형 SVM의 경우 C만 튜닝 / RBF 커널 SVMdptjsms C,gamma 매개변수를 튜닝한다. param_grid에서 알 수 있는건 svc__gamma 매개변수는 커널 SVM에만 해당된다는 것이다.

 

훈련 데이터셋을 사용하여 그리드 서치를 수행한 후 최상의 모델 점수는 best_score_ 속성에서 얻고 이 모델의 매개변수는 best_params_ 속성에서 파악이 가능하다. ( 가령 print(gs.best_params_) 코드를 치면 나올 것이다. )

 

마지막으로 독립적인 테스트 데이터셋을 사용하여 최고 모델의 성능을 추정한다.

best_estimator_ 속성에서 얻을 수 있다.

 

clf = gs.best_estimator_

clf.fit(X_train, y_train)

print('테스트 정확도: %.3f' %clf.score(X_test,y_test))

 

* 그리드 서치가 최적의 매개변수 조합을 찾을 수 있는 강력한 도구이지만 비용이 매우 많이 든다.

사이킷런에는 여러 가지 매개변수 조합을 샘플링하는 다른 방법으로 랜덤 서치가 있으니, 궁금하다면 구글링 추천한다.

 

앞에서 설명한 그리드 서치와 이제 설명할 k-겹 교차 검증을 함께 사용하면 머신 러닝 모델의 성능을 세부 튜닝하기에 좋다.

 

gs = GridSearchCV(estimator = pipe_svc , param_grid = param_grid, scoring='accuracy', cv=2)

scores = cross_val_score(gs, X_train, y_train, scoring='accuracy', cv=5)

 

위와 동일한 방법으로 단일 결정 트리 분류기의 max_depth 매개변수를 튜닝해보자.

 

from sklearn.tree import DecisionTreeClassifier

 

gs = GridSearchCV(estimator = DecisionTreeClassifier(random_state=0), param_grid=[{'max_depth':[1,2,3,4,5,6,7,None]}],scoring='accuracy',cv=2)

 

scores = cross_val_score(gs, X_train, y_train, scoring='accuracy', cv=5)

 

SVM 모델의 중첩 교자 검증 성능(97.4%)은 결정 트리의 성능(93.4%)보다 뛰어나다.

위와 같은 예시에서 알 수 있는 결과는 그리드서치와 중첩 교차 검증을 해보니, SVM모델의 성능이 결정 트리의 성능 보다 좋아서,

이 데이터셋과 동일 분포에서 발생되는 새로운 데이터를 분류하기 위해서는 SVM이 더 좋은 선택이라고 할 수 있다.

 

여러 가지 성능 평가 지표

 

여태까지는 정확도를 사용하여 여러 머신 러닝 모델을 평가했다. 이외에도 정밀도, 재현율, F1-점수 등이 있다.

데이콘 대회를 나가보면, 어떤 데이터를 분석하냐에 따라 성능평가지표가 달라진다.

학습 알고리즘의 성능을 행렬로 펼쳐 놓은 오차 행렬이 있다. 이는 adsp 자격증을 취득할 때 암기했던 부분이라 쉽게 넘어갔다.

 

 

728x90
반응형