머신러닝, AI

Chapter 2. 사이킷 런으로 시작하는 머신러닝 스터디 1주차 정리

쟈누이 2020. 3. 9. 11:12
반응형

1)    사이킷런 특징

- 사이킷런은 파이썬 머신러닝 라이브러리 중 가장 많이 사용되는 라이브러리

- 파이썬 기반의 머신러닝을 위한 가장 쉽교 효율적인 개발 라이브러리를 제공

- 가장 파이썬 스러운 API 제공

- 기본적으로 아나콘다를 설치할 때 기본적으로 설치됨

 

2)    첫번째 머신러닝 만들어보기- 붓꽃 품종 예측하기

첫번째로 만들어 볼 붓꽃 데이터 세트, 붓꽃의 품종을 분류(classification) 하는 것.

붓꽃(iris) 데이터는 꽃잎의 길이와 너비, 꽃받침의 길이와 너비 feature 기반으로 꽃의 품종을 예측하기 위한 것

 

** 분류(classification) **

대표적인 지도학습(Supervised Learning) 방법의 하나.

 

** 지도학습(Supervised Learning) **

지도학습은 학습을 위한 다양한 피처와 분류 결정값인 레이블(Label) 데이터로 모델을 학습한 뒤, 별도의 테스트 데이 터 세트에서 미지의 레이블을 예측하는 것. , 명확한 정답이 주어진 데이터를 먼저 학습한 뒤 미지의 정답을 예측하는 방식. 이 때, 학습을 위해 주어진 데이터 세트를 학습 데이터 세트, 머신러닝 모델의 예측 성능을 평가하기 위해 별도로 주어진 데이터 세트를 테스트 데이터 세트로 지칭

 

학습데이터로 학습된 모델이 얼마나 뛰어난 성능을 가지는지 평가하려면 테스트 데이터 세트 분리가 반드시 필요함.

이를 위해 별도로 train_test_split ()  api 를 제공함

Random_state 는 수행할때마다 동일한 데이터 세트로 분리하게 지정해주는 숫자(random 값을 만드는 seed) 와 같음

Fit(x_train, y_train) 함수를 통해 모델을 학습시킬 수 있음.

Predict(x_test) 의 예측은 반드시 학습 데이터가 아닌 다른 데이터를 이용하며, 일반적으로 테스트 데이터 세트를 이용

모델의 정확도를 확인하고 싶을 때는 accuracy_score( ) 함수를 사용하여 모델의 예측도를 평가

 

진행 프로세스

가) 데이터 세트 분리 : 데이터를 학습 데이터와 테스트 데이터로 분리

나) 모델 학습 : 학습 데이터를 기반으로 ML 알고리즘 적용해 모델 학습

다) 예측 수행 : 학습된 ML 모델을 이용해 테스트 데이터의 분류를 예측

라) 평가 : 이렇게 예측된 결괏값과 테스트 데이터의 실제 결괏값을 비교해 ML 모델 성능 형가

 

3)    사이킷런의 이해 및 fit( ), predict( ) 메서드

사이킷은 API 일관성과 개발 편의성을 제공하기 위한 노력이 엿보임. 사이킷런은 ML 모델 학습을 위해 fit( ), 학습된 모델의 예측을 위해 predict( ) 메서드 제공

 

Classifier : 분류 알고리즘을 구현한 클래스

- DecisionTreeClassifier / RandomForestClassifier / GradientBoostingClassifier / GaussianNB / SVC

 

Regressor: 회귀 알고리즘을 구현한 클래스

- LinearRegression / Ridge / Lasso / RandomForestRegressor/ GradientBoostingRregressor

Estimator: 많은 유형의 분류/회귀 모델을 구현한 클래스

- 학습 : fit( )  / 예측 : predict( )

 

GridSearchCV: 하이퍼 파라미터 튜닝을 지원하는 클래스

비지도 학습인 차원축소, 클러스터링, 피처추출(feature extraction) 등을 구현한 클래스 역시 fit( ) transform( ) 을 적용

 

사이킷런 주요 모듈

분류

모듈명

설명

예제 데이터

sklearn.dataset

사이킷런에 내장되어 예제로 제공하는 데이터 세트

피처처리

Sklearn.preprocessing

데이터 전처리에 필요한 다양한 가공 기능 제공(문자열을 숫자형 코드 값으로 인코딩, 정규화, 스케일링 등)

Sklearn.feature_selection

알고리즘에 큰 영향을 미치는 피처를 우선순위대로 셀렉션 작업을 수행하는 다양한 기능 제공

Sklearn.frature.extraction

텍스트 데이터나 이미지 데이터의벡터화된 피처를 추출하는 데 사용. 예를 들어 텍스트 데이터에서 count vectorizer tf-idf vectorizer 제공

텍스트 데이터의 피처추출은 sklearn.feature_extraction.text 모듈에, 이미지 데이터의 피처 추출은 sklearn.feature_extraction.image 모듈에 지원 api 존재

피처처리&차원 축소

Sklearn.decomposition

차원 축소와 관련된 알고리즘을 지원하는 모듈, PCA,NMF(음수미포함 행렬분해), Truncated SVD 등을 통해 차원 축소 기능을 수행할 수 있음

데이터분리,검증&

파라미터 튜닝

Sklearn.model_selection

교차 검증을 위한 학습용/테스트용 분리, 그리도 서치로 최적 파라미터 추출 등의 API 제공

평가

Sklearn.metrics

분류, 회귀, 클러스터링, 페어와이즈(pairwise) 에 대한

ML 알고리즘

Sklearn.ensemble

앙상블 알고리즘 제공

렌덤포레스트, 에이다 부스트, 그래

Sklearn.linear_model

주로 선형 회귀, 릿지(ridge), 라쏘(lasso), 및 로지스틱스 회귀 등 회귀 관련 알고리즘을 지원 또한 SGD(stochastic gradient descent) 알고리즘 지원

Sklearn.naive_bayes

나이브 베이즈 알고리즘 제공 가우시안NB, 다항분포NB

Sklearn.neighbors

최근접 이웃 알고리즘 제공, KNN

Sklearn.svm

서브 벡터 머신 알고리즘 제공

Skleran.tree

의사 결정 트리 알고리즘 제공

Sklearn.cluster

비지도 클러스터링 알고리즘 제공

(K-means, 계층형, DBSCAN )

유틸리티

Sklearn.pipeline

피처 처리 등의 변환과 ML 알고리즘 학습, 예측 등을 함께 묶어서 실행할 수 있는 유틸리티 제공

 

4) 내장된 예제 데이터 세트

사이킷 런에는 외부 웹사이트에서 데이터 세트를 내려받을 필요 없이 예제로 활용할 수 있는 간단하면서도 좋은 데이터 세트가 내장되어 있음.

API

설명

Datasets.load_boston( )

회귀 용도이며, 미국 보스턴의 집 피처들과 가격에 대한 데이터 세트

Datasets.load_breast_cancer( )

분류 용도이며, 위스콘신 유방암 피처들과 악성/.음성 레이블 데이터 세트

Datasets.load_diabetes( )

회귀 용도이며, 당뇨 데이터 세트

Datasets.load_digits( )

분류 용도이며, 0에서 9까지 숫자의 이미지 픽셀 데이터 세트

Datasets.load_iris( )

분류 용도이며, 붓꽃에 대한 피처를 가진 데이터 세트

그 외에도 fetch 계열의 데이터 셋이 잇는데 해당 계열의 명령은 패키지에 처음부터 내장되어 있지 않고 인터넷에서 내려받아 저장한 후 사용할 수 있는 데이터 셋임

 

표본 생성기

API

설명

Datasets.make_classifications( )

분류를 위한 데이터 세트를 만듭니다. 특히 높은 상관도, 불필요한 속성 등의 노이즈 효과를 위한 데이터를 무작위로 생성해 준다.

Datasets.make_blobs( )

클러스터링을 위한 데이터 세트를 무작위로 생성해 준다. 군집 지정 개수에 따라 여러가지 클러스터링을 위한 데이터 세트를 쉽게 만들어 준다

 

5) Model Selection 모듈 소개

사이킷 런의 model_selection 모듈은 학습 데이터와 테스트 데이터 세트를 분리하거나 교차 검증 분할 및 평가, 그리고 Estimator 의 하이퍼 파라미터를 튜닝하기 위한 다양한 함수와 클래스를 제공

 

- 학습/테스트 데이터 세트 분리 = train_test_split( )

 

사이킷 런의 train_test_split( ) 모듈을 통해 원본 데이터 세트에서 학습 및 테스트 데이터 세트를 쉽게 분리할 수 있음.

파라미터

설명

Test_size

전체 데이터에서 테스트 데이터 세트 크기를 얼마로 샘플링할 것인가 결정. 디폴트는 0.25

Train_size

전체 데이터에서 학습용 데이터 세트 크기를 얼마로 샘플링할 것인가를 결정. Test_size parameter 를 통상적으로 사용하기 때문에 잘 사용하지 않음

Shuffle

데이터를 분리하기 전에 데이터를 미리 섞을지 결정, 디폴트는 True, 데이터를 분산시켜서 좀 더 효율적인 학습 테스트 데이터 세트를 만드는 데 사용

Randoam_state

호출할때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어니는 난수값. Train_test_split 는 호출시 무작위로 데이터를 분리하므로 random_state 를 지정하지 않으면 수행할때마다 다른 학습/테스트 용 데이터를 생성한다.  이 책에서는 실습용 예제이므로 수행할 때마다 동일한 데이터 세트로 분리하기 위해 일정한 숫자값으로 지정

   

 

5-1) 교차 검증

알고리즘을 학습시키는 학습 데이터와 이에 대한 예측 성능을 평가하기 위한 별도의 테스트용 데이터가 필요하지만, 과적합(overfitting)에 취약할 수 있다. 과적합되는 학습 모델이 만들어져 다른 테스트용 데이터가 들어올 경우 성능이 저하되는 문제점을 개선하기 위해 교차 검증을 실시한다. 즉 본고사를 치르기 전에 모의 고사를 여러 번 보면서 많은 학습과 검증 세트에서 알고리즘 학습과 평가를 수행하는 것. 교차 검증은 이러한 데이터 편중을 막기 위해서 별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행하는 것. 각 세트에서 수행한 평가 결과에 따라 하이퍼 파라미터 튜닝 등의 모델 최적화를 더욱 손쉽게 할 수 있다.

테스트 데이터 이외에 별도의 검증 데이터 세트를 둬서 최종 평가 이전에 학습된 모델을 다양하게 평가하는 데 사용

 

가)  K-fold 교차 검증

가장 보편적으로 사용되는 교차 검증 기법. 먼저 K개의 데이터 폴드 세트를 만들어서 k번만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행

 

5폴드 교차 검정을 수행(k5), 5개의 폴드된 데이터 세트를 학습과 검증을 위한 데이터 세트로 변경하면서 5번 평가를 수행한 되, 5개의 평가를 평균한 결과를 가지고 예측한 성능을 평가한다. 먼저 데이터 세트를 k 등분 한다음 첫번째 반복에서는 처음부터 4개 등분을 학습 데이터 세트, 마지막 5번재 등분 하나를 검증 데이터 세트로 설정하고 학습 데이터 세트에서 학습 수행, 검증 데이터 세트에서 평가를 수행. 첫번재 평가를 수행하고 나면 이제 두번재 반복에서 다시 비슷한 평가작업 수행..k 번째 수행가지 이어지면서 학습과 검정을 수행하는 것이 바로 k 폴드 교차 검증. K 개의 예측 평가를 구했으면 이를 평균해서 k 폴드 평가 결과로 반영하면 됨.

 

k폴드 객체를 생성한 후, 생성된 kfold 객체의 split( )를 호출해 전체 아이리스 데이터를 5개의 폴드 데이터 세트로 분리한다. 예를 들면, 전체 데이터는 150개이므로 학습 데이터세트는 4/5120, 검증 테스트 데이터 세트는 1/530개로 분할. Splits( ) 를 호출하면 학습/검증용 데이터로 분할할 수 있는 인덱스를 반환. 실제로 학습/검증용 데이터 추출은 반환된 인덱스를 기반으로 개발 코드에서 직접 수행해야함.

교차시마다 인덱스가 달라진다는 점을 알 수 있다. 학습 데이터 세트의 인덱스는 수가 많아서 출력하지 않았지만 검증 세트의 인덱스를 보면 교차 검증시마다 split( ) 함수가 어떻게 인덱스를 할당하는지 알 수 있다. 각각 30개의 검증 세트 인덱스를 생성했고, 이를 기반으로 검증 세트를 추출하게 된다.

 

나)  Stratified K 폴드

불균형한(imblanced) 분포도를 가진 레이블(결정 클래스) 데이터 집합을 위한 k 폴드 방식불균형한 분포도를 가진 레이블 데이터 집합은 특정 레이블 값이 특이하게 많거나 매우 적어서 값의 분포가 한쪽으로 치우치는 것을 말함

 

Stratified k 폴드는 이처럼 k 폴드가 레이블 데이터 집합이 원본 데이터 집합의 레이블 분포를 학습 및 테스트 세트에 제대로 분배하지 못하는 경우의 문제를 해결해준다. 이를 위해 stratified k 폴드는 원본 데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습과 검증 데이터 세트를 분배 하며, 먼저 k 폴드가 어떤 문제를 가지고 잇는지 확인한다.

 

교차 검증시마다 3개의 폴드 세트로 만들어지는 학습 레이블과 검증 레이블이 완전히 다른 값으로 추출될 수가 있따. 예를 들어 첫 번재 교차 검증에서는 학습 레이블의 1,2 값이 각각 50개가 추출되었고, 검증 레이블의 0값이 50개 추출되면 학습 레이블은 1,2 밖에 없으므로 0의 경우는 전혀 학습하지 못하게 된다.

반대로 검증 레이블은 0밖에 없으므로 학습모델은 절대 0을 예측하지 못한다. 이런 유형으로 교차 검증 데이터 세트를 분할하면 검증 예측 정확도는 0이 될 수 밖에 없다.

 

Straitified K폴드는 이렇게 KFOLD 로 분할된 레이블 데이터 세트가 전체 레이블 값의 분포도를 반영하지 못하는 문제를 해결해 주는 장점이 있다.  교차 검증에서 학습 레이블은 0,1,2 값이 각각 33개로, 레이블별로 동일하게 할당됐고 검증 레이블 역시 0,1,2 값이 각각 17개로 레이블별로 동일하게 되는 것인데,  이렇게 분할이 되어야 레이블 값 0,1,2를 모두 학습할 수 있고, 이에 기반해 검증을 수행할 수 있다.

 

Stratified k 폴드의 경우 원본 데이터의 레이블 분포도 특성을 반영한 학습 및 검증 데이터 세트를 만들 수 있으므로 왜곡된 레이블 데이터 세트에서는 반드시 stratified k폴드를 이용해 교차 검증해야 한다.

사실,

 

일반적으로 분류(classification)에서의 교차 검증은 k폴드가 아니라 stratified k 폴드로 분할돼야 합니다.

회귀(regression)에서는 stratified k 폴드가 지원되지 않는다는 점 참고!

 

이유는 간단하다. 회귀의 결정값은 이산값 형태의 레이블이 아니라 연속된 숫자값이기 때문에 결정값별로 분포를 정하는 의미가 없기 때문입니다.

 

다)  교차 검증을 보다 간편하게 – cross_val_score( )

사이킷 런은 교차 검증을 좀 더 편리하게 수행할 수 있게 해주는 api 를 제공합니다. 대표적인 것이 cross_val_score( ) 이다.

 

Cross_val_score 의 피처

(Estimator : 사이킷런의 분류 알고리즘 클래스인 classifier 또는 회귀 알고리즘인 regressor 를 의미

X : 피처 데이터 세트

Y=None : 레이블 데이터 세트

Scoring=None : 예측 성능 평가 지표 기술

Cv=None : 교차 검증 폴드의 수

N_jobs=1 :

Verbose=0,

fit_params=None

pre_dispatch=’2*n_jobs’)

 

Cross_val_score( ) cv로 지정된 횟수만큼 scoring 파라미터로 지정된 평가 지표로 평가 결괏값을 배열 반환한다.

 

라)  GridSearchCV – 교차 검증과 최적 하이퍼 파라미터 튜닝을 한번에

하이퍼 파라미터는 머신러닝 알고리즘을 구성하는 주요 구성 요소이며, 이 값을 조정해 알고리즘의 예측 성능을 개선할 수 있다.

사이킷런은 GridSearchCV API 를 이용하여 classifier 또는 regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할 수 있는 방안을 제공하는데, 여러 하이퍼 파라미터를 순차적으로 변경하면서 최고 성능을 가지는 파라미터 조합을 찾고자 한다면 파라미터의 집합을 만들고 이를 순차적으로 적용하면서 최적화를 수행할 수 있다.

 

GridSearchCV 는 교차검증을 기반으로 하이퍼 파라미터의 최적값을 찾게 해준다. 사용자가 튜닝하고자 하는 여러 종류의 하이퍼 파라미터를 다양하게 테스트하면서 최적의 파라미터를 편리하게 찾게 해주지만 동시에 순차적으로 파라미터를 테스트하므로 수행시간이 상대적으로 오래 걸리는 것에 유의해야만 한다.

 

주요 파라미터

- estimator : classifier, regressor, pipeline이 사용됨

- param_grid : key + 리스트 값을 가지는 딕셔너리가 주어짐. Estimator의 튜닝을 위해 파라미터명과 사용될 여러 파라미터 값을 지정

- scoring : dPcmr 성능을 측정할 평가 방법 지정. 보통 사이킷런의 성능 평가 지표를 지정하는 문자열(정확도:accuracy)로 지정하나 별도의 성능 평가 지표 함수도 지정가능

- cv : 교차 검증을 위해 분할되는 학습/테스트 세트의 개수 지정

- refit : 디폴트가 true 이며 true로 생성시 가장 최적의 하이퍼 파라미터를 찾은 뒤 입력된 estimator 객체를 해당 파라미터로 재 학습시킴

 

일반적으로 학습 데이터를 GirdSearchCV를 이용해 최적 하이퍼 파라미터 튜닝을 수행한 뒤에 별도의 테스트 세트에서 이를 평가하는 것이 일반적인 머신러닝 모델 적용방법이다.

 

6)    데이터 전처리

데이터 전처리는 ML 알고리즘만큼 중요합니다. ML 알고리즘은 데이터에 기반하고 있기 때문에 어떤 데이터를 입력으로 가지느냐에 따라 크게 결과가 달라질 수 있다.

 

** 미리 처리해야할 몇가지 사항 **

1. Null, NaN 값은 허용되지 않는다.

2. 사이킷런의 머신러닝 알고리즘은 문자열 값을 입력값으로 허용하지 않음.

    모든 문자열 값은 인코딩돼서 숫자 형으로 변환해야 함.

 

가)  데이터 인코딩

- 레이블 인코딩

레이블 인코딩은 카테고리 피처를 코드형 숫자로 변환하는 것

사이킷 런의 레이블 인코딩은 LabelEncoder 클래스로 구현

 

레이블 인코딩은 간단하게 문자열 값을 숫자형 카테고리 값으로 변환. 하지만 레이블 인코딩이 일괄적인 숫자 값으로 변환이 되면서 몇몇 ML 알고리즘에는 이를 적용할 경우 예측 성능이 떨어지는 경우가 발생할 가능성 있음이는 숫자의 크고 작음에 대한 특성이 작용하기 때문인데, (ML 알고리즘에서 가중치가 더 부여되거나 더 중요하게 인식 가능성 발생)

레이블 인코딩은 이러한 이유로 선형회귀와 같은 ML 알고리즘에 적용하면 안됨

 

- 원핫 인코딩(ONE-HOT encoding)

-핫 인코딩은 피처 값의 유형에 다라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지는 0을 표시하는 방식.

-핫 인코딩은 사이킷런에서 OneHotEncoder 클래스로 쉽게 변환이 가능하다...

 

** 주의할 점 **

1. OneHotEncoder로 변환하기 전에 모든 문자열 값이 숫자형 값으로 변횐돼야 함

2. 입력 값으로 2차원 데이터가 필요함

 

판다스에는 원-핫 인코딩을 더 쉽게 지원하는 api 가 있음. Get_dummies( )를 이용하면 됩니다. 사이킷 런의 OneHotEncoder 와 다르게 문자열 카테고리 값을 숫자 형으로 변환할 필요 없이 바로 변환 가능

 

나)  피처 스케일링과 정규화

서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업을 피처 스케일링이라고 하는데, 대표적인 방법으로 표준화(standardization)와 정규화(normalization)가 있다

 

- 표준화(Standardization)

표준화는 데이터의 피처 각각이 평균이 0이고 분산이 1인 가우시안 정규분포를 가진 값으로 변환하는 것을 의미

StandardScalar 는 표준화를 쉽게 지원하기 위한 클래스. , 개별 피처를 평균이 0이고, 분산이 1인 값으로 변환. 사이킷 런에서 구현한 RBF 커널을 이용하는 서포트 백터 머신(SVM), 선현회귀(Linear Regression), 로지스틱 회귀(Logistic Regression)에서는 데이터가 가우시안 분포를 가지고 있다고 가정하고 구현되서 표준화를 적용하는 것이 예측 성능 향상에 중요한 요소

모든 칼럽의 값의 평균이 0에 아주 가까운 값으로, 그리고 분산은 1에 아주 가까운 값으로 변환됐음을 알 수 있음.

 

- 정규화(Nomarlization)

서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념

사이킷런의 정규화는 선형대수에서의 정규화 개념이 적용, 개별 벡터의 크기를 맞추기 위해 변환하는 것을 의미

MinMaxScaler 는 데이터 값을 01 사이의 범위값으로 변환(음수 값이 있으면 -1 1로 변환) 데이터의 분포가 가우시안 분포가 아닐 경우에 Min, Max scale 를 적용가능.

 

모든 피처에 0에서 1사이 값으로 변환되는 스케일링이 적용됨

 

역량 증대를 위해서는 머신러닝 알고리즘이나 이들 api 에 대한 사용법 못지 않게 데이터 분석에 대한 감을 강화하는 것이 중요

반응형