dew's CSE Studying
Ch02 사이킷런으로 시작하는 머신러닝 본문
01 사이킷런 소개와 특징
사이킷런(scikit-learn)은 파이썬 머신러닝 라이브러리 중 가장 많이 사용되는 라이브러리!
설치 후 버젼 확인을 해줬다
02 첫 번째 머신러닝 만들어 보기 - 붓꽃 품종 예측하기
sklearn.datasets: 사이킷런에서 자체적으로 제공하는 데이터 세트를 생성하는 모듈의 모임
sklearn.tree: 트리 기반 ML 알고리즘을 구현한 클래스의 모임
sklearn.model_selection: 학습 데이터와 검증 데이터, 예측 데이터로 데이터를 분리하거나 최적의 hyper parameter으로 평가하기 위한 다양한 모듈의 모임
- 사이킷런에서 사용할 모듈을 import
- load_iris()함수를 이용하여 붓꽃 데이터 세트를 로딩
- 붓꽃 데이터를 dataframe으로 변환했다
학습용데이터와 테스트용 데이터를 분리해보자.
train_test_split(): 학습데이터와 데이터를 test_size 파라미터 입력값의 비율로 쉽게 분리한다
X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, test_size=0.2, random_state=11)
이제 이 데이터를 기반으로 의사결정트리를 이용해 학습과 예측을 수행해보자
정리를 해보면,
- 데이터셋 분리: 데이터=학습데이터+테스트 데이터
- 모델학습: 학습 데이털르 기반으로 ML 알고리즘을 적용해 모델을 학습시킨다
- 예측수행: 학습된 ML 모델을 이용해 테스트 데이터의 분류를 예측한다
- 평가: 이렇게 예측된 결괏값과 테스트 데이터의 실제 결괏값을 비교해 ML 모델 성능을 평가한다
03 사이킷런의 기반 프레임워크 익히기
Estimator 이해 및 fit(), predict() 메서드
fit(): 모델학습을 위한 메서드
predict(): 학습된 모델의 예측을 위한 메서드
Classifier와 Regressor을 합쳐서 estimator 클래스라고 부른다. 즉, 지도학습의 모든 알고리즘을 구현한 클래스를 통칭해서 Estimator라고 부른다.
데이터키는 피처들의 데이터 값을 가리킨다.
data | feature의 데이터셋 |
target | 분류: 레이블 값/ 회귀: 숫자 결괏값 데이터셋 |
target_names | 개별 레이블의 이름 |
feature_names | feature의 이름 |
DESCR | 데이터셋에 대한 설명과 각 feature의 설명 |
04 Model Selection 모듈 소개
학습/테스트 데이터 셋 분리 - train_test_split()
데이터셋 분리의 이유: 같은 데이터로 학습과 테스트를 진행하면 이미 학습한 학습데이터셋을 기반으로 예측하기 때문에 정확도가 1.0
학습을 위한 데이터의 양을 일정 수준 이상으로 보장하는 것도 중요하지만, 학습된 모델에 대해 다양한 데이터를 기반으로 예측 성능을 평가해보는 것도 매우 중요하다
교차 검증
-overfitting을 방지하기 위함
-데이터 편중을 막기 위해 별도의 여러 세트로 구성된 학습 데이터셋과 검증데이터셋에서 학습과 평가를 수행하는 것
-데이터셋을 세분화해서 학습, 검증, 테스트 데이터셋으로 나눈다.
K-폴드 교차검증
먼저 K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행하는 방법
전체 붓꽃 데이터가 모두 150개여서 4/5인 120개가 학습데이터, 1/5인 30개가 검증 테스트 데이터셋의 개수가 된다
Stratified K 폴드
-불균형한(imbalanced) 분포도를 가진 레이블(결정 클래스) 데이터 집합을 위한
*불균형한 분포도를 가진 레이블 데이터 집합은 특정 레이블 값이 특이하게 많거나 매우 적어서 값의 분포가 한쪽으로 치우치는 것을 말한다
-K폴드가 레이블 데이터 집합이 원본 데이터 집합의 레이블 분포를 학습 및 테스트 세트에 제대로 분배하지 못하는 경우의 문제를 해결
-원본 데이터의 레이블 분포를 먼저 고려 -> 이 분포와 동일하게 학습과 검증 데이터 세트를 분배
먼저 붓꽃 데이터세트를 간단하게 DataFrame으로 생성하고 레이블 값의 분포도를 확인해보자.
모두 50개로 동일하다.
이렇게 해버리면 자기가 검증 레이블인 경우 학습에서 완전히 그 케이스가 제외되어버리는 문제가 발생한다
StratifiedKFold는 이렇게 KFold로 분할된 레이블 데이터 세트가 전체 레이블 값의 분포도를 반영하지 못하는 문제를 해결해준다
이번엔 stratifiedkfold를 이용해보자
출력 결과를 보면 학습 레이블과 검증 레이블 데이터 값의 분포가 거의 동일하게 할당됐음을 알 수 있다. 이렇게 분할되면 레이블 값 0,1,2를 모두 학습할 수 있고, 이에 기반해 검증을 수행할 수 있다.
교차 검증을 보다 간편하게 - cross_val_score
KFold로 데이터를 학습하고 예측하는 코드를 보면
- 폴드 세트를 설정하고
- for 루프에서 반복으로 학습 및 테스트 데이트의 인덱스를 추출한 뒤
- 반복적으로 학습과 예측을 수행하고 예측 성능을 반환했다
GridSearchCV - 교차 검증과 최적 하이퍼 파라미터 튜닝을 한 번에
05 데이터 전처리
데이터 인코딩
레이블 인코딩(Label Encoding)
:카테고리 피처를 코드형 숫자값으로 변환하는 것
문제점: 특정 ML알고리즘에서 변환된 숫자 값에 따라 가중치가 부여되거나 순서, 중요도로 인식되는 경우 발생
원-핫 인코딩(One-hot Encoding)
:feature값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시하는 방식.
-사이킷런의 OneHotEncoder 클래스로 변환 가능
-변환한 값이 sparse matrix 형태이므로 얘를 다시 toarray() 메서드를 이용해 dense matrix으로 변환해야 한다
get_dummies()를 이용하면 문자열 카테고리를 숫자형으로 변환할 필요 없이 바로 변환할 수 있다
피처 스케일링(feature scaling)과 정규화(normalization)
피처 스케일링: 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업
대표적인 방법: 표준화(standardization), 정규화(normalization)
표준화: 데이터의 피처 각각이 평균이 0이고 분산이 1인 가우시안 정규분포를 가진 값으로 변환하는 것
정규화: 서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념
StandardScaler
-표준화 지원
-예측성능 향상에 중요한 요소
모든 칼럼 값의 평균이 0에 아주 가까운 값으로, 모든 분산이 1에 아주 가까운 값으로 변환된 것을 확인 가능!
MinMaxScaler
-데이터값을 0과 1사이 범위의 값으로 변환한다(음수값의 경우 -1에서 1값으로 변환)
-데이터 분포가 가우시안 분포가 아닐 경우에
학습 데이터와 테스트 데이터의 스케일링 변환 시 유의점
-학습 데이터로 fit()이 적용된 스케일링 기준 정보를 그대로 테스트 데이터에 적용해야한다(달라지면XX)
fit(), transform(), fit_transform()을 이용해 스케일링 변환 시
- 가능하다면 전체 데이터의 스케일링 변환을 적용한 뒤 학습과 테스트 데이터로 분리
- 1이 여의치 않다면 테스트 데이터 변환 시에는 fit()이나 fit_transform()을 적용하지 않고 학습 데이터로 이미 fit()된 Scaler 객체를 이용해 transform으로 변환
06 사이킷런으로 수행하는 타이타닉 생존자 예측