BASHA TECH

Ch 2. 머신러닝 복습 : 사이킷런으로 시작하는 머신러닝 본문

Computer/Machine Learning

Ch 2. 머신러닝 복습 : 사이킷런으로 시작하는 머신러닝

Basha 2023. 4. 20. 17:25
728x90

1. 사이킷런 소개와 특징

 

2. 첫 번때 머신러닝 만들어 보기 

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

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

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

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

 

3. 사이킷런의 기반 프레임워크 익히기

1) Estimator 이해 및 fit( ), predict( ) 메소드

ML 모델 학습을 위해 fit( ), 학습된 모델의 예측을 위해 predict( ) 

사이킷 런에서 분류 알고리즘을 구현한 클래스를 Classifier, 회귀 알고리즘을 구현한 클래스를 Regressor로 지칭.

Classifier + Regressor => Estimator

2) 사이킷런 모듈

비지도 학습은 fit은 하는데 predict는 못함 fit해서 모델(식)은 만들어지지만 답이 없어서 예측 불가능. 하지만 transform은 가능하다. => 따라서, 비지도 학습은 ML 아님. 예측이 불가능 하므로.

 

4. Model Selection 모듈 소개

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

from sklearn.datasets import load_iris 
from sklearn.tree import DecisionTreeClassifier
from skelearn.metrics import accuracy_score

iris = load_iris()
dt_clf = DecisionTreeClassifier( 
train_data - iris.data 
train_label = iris, target
dt_clf.fit(train_data, train_label)

# 학습 데이터 세트으로 예측 수행
pred = dt_clf.predict(train_data)
print('예측 정확도:', accuracy_score(train_label, pred))

■     test_size:전체 데이터에서 테스트 데이터 세트 크기를 얼마로 샘플링할 것인가를 결정합니다. 디폴트는 0.25, 즉 25% 입니다.
■     train_size: 전체 데이터에서 학습용 데이터 세트 크기를 얼마로 샘플링할 것인가를 결정합니다. test_size parameter
를 통상적으로 사용하기 때무에 train size는 잘 사용되지 않습니다.
■     shuffle: 데이터를 분리하기 전에 데이터를 미리 섞을지를 결정합니다. 디폴트는 True입니다. 데이터를 분산시켜서 좀 더 효율적인 학습 및 테스트 데이터 세트를 만드는 데 사용됩니다.
■     random_state: random_state는 호출할 때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어자는 난수 값입니다. train_test_split()는 호출 시 무작위로 데이터를 분리하므로 random_state를 지정하지 않으면 수행할 때마다 다른 
학습/테스트 용 데이터를 생성합니다. 이 책에서 소개하는 예제는 실습용 예제이므로 수행할 때마다 동일한 데이터 세트로 
분리하기 위해 random_state를 일정한 숫자 값으로 부여하겠습니다.
■     train test split() 의 튜플 형태입니다. 순차적으로 학습용 데이터의 피처 데이터 세트 테스트용 데이터의 피처 데이터 세트, 학습용 데이터의 레이블 데이터 세트 테스트용 데이터의 레이블 데이터 세트가 반환됩니다.

 

2) 교차 검증

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

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

 

3) cross_val_ score : 교차검증을 편리하게 수행 할 수 있게 해주는 api

 

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

- estimator:classifier, regressor/pipeline이 사용될 수 있습니다.

- param_grid : key + 리스트 값을 가지는 딕셔너리가 주어집니다. 

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

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

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

 

5. 데이터 전처리

1) ML 알고리즘을 적용하기 전 데이터에 대해 미리 처리해야할 기본 사항

결손값 : NaN, Null 값은 허용되지 않음. 따라서 이러한 Null 값은 고정된 다른 값으로 변환해야 함. Null 값을 어떻게 처리해야 할지는 경우에 따른데 feature value 중 Null 값이 얼마 되지 않는다면 feature의 평균값 등으로 간단히 대체 가능. 하지만 Null 값이 얼마 되지 않는다면 feature는 drop 하는 것이 더 좋다. 가장 결정하기 힘든 부분이 Null 값이 일정 수준 이상 되는 경우이다. 정확히 몇 퍼센트까지를 일정 수준 이상이라고 한다는 기준은 없지만 해당 피처가 중요도가 높은 피처이고 Null을 단순히 피처의 평균값으로 대체할 경우 예측 왜곡이 심할 수 있다면 업무 로직 등을 상헤 검토해 더 정밀한 대체 값을 선정해야 함.

 

2) 문자열 피처 :  카테고리형 피처와 텍스트형 피처를 의미. (카테고리형 피처 : 코드 값, 텍스트형 피처 : feature vectorization 등의 기법)

 

3) 카테고리형 일때의 데이터 인코딩 : 레이블 인코딩과 원-핫 인코딩이 있다.

1_ 레이블 인코딩 : 카테고리 피처를 코드형 숫자 값으로 변환 하는 것.

ex) 상품 데이터의 상품 구분이 TV, Refrigerator, Microwave, Computer, Fan, Mixer 값으로 되어 있다면 TV:1, Refrigerator:2, Microwave:3, Computer:4, Fan:5, Mixer:6 과 같은 숫자형 값으로 변환 하는 것.

사이킷런의 레이블 인코딩은 LabelEncoder Class로 구현된다. LabelEncoder를 객체로 생성한 후 fit( )과 transform( )을 호출해 레이블 인코딩을 수행함. 즉, 문자열 값을 숫자형 카테고리 값으로 변환. 하지만 인코딩이 일괄적인 숫자 값으로 변환이 되면서 몇몇 ML 알고리즘에는 이를 적용할 경우 예측 성능이 떨어지는 경우가 발생 할 수 있다. 이는 숫자 값의 경우 크고 작음에 대한 특성이 작용하기 때문. (문자를 숫자로 의미없이 변환한 것임에도 불구하고 ML 숫자값이 큰 것에 의미를 부여해 학습을 더 해서(가중치가 부여됨) 예측 성능이 떨어질 수 있다.) 이러한 특성 때문에 레이블 인코딩은 선형 회귀와 같은 ML 알고리즘에는 적용 하지 않아야 함. 트리 계열의 ML 알고리즘은 숫자의 이러한 특성을 반영하지 않으므로 레이블 인코딩해도 상관 x

from sklearn.preprocessing import LabelEncoder

items = ['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '선풍기', '믹서', '믹서]

# LabelEncoder를 객체로 생성한 후, fit( )과 transform( )으로 레이블 인코딩 수행.
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print('인코딩 변환 값:', labels)

2_ 원-핫 인코딩 (분류의 신경망에서 많이 사용됨) : 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시 하고 나머지 칼럼에는 0을 표시하는 방식. 즉, 행 형태로 되어 있는 피처의 고유 값을 열 형태로 차원을 변환한 뒤, 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시한다. 원-핫 이코딩은 사이킷런에서 OneHotEncoder class로 변환이 가능. 단 LabelEncoder와 다르게 약간 주의할 점이 있는데 입력값으로 2차원 데이터가 필요하다는 것과, OneHotEncoder를 이용해 변환한 값이 희소행렬 형태이므로 이를 다시 toarray( ) 메소드를 이용해 밀집 행렬로 변환 해야 한다.

from sklearn.preprocessing import OneHotEncoder 
import numpy  as  np
items=['TV','냉장고', '전자레인지', '컴퓨터', '선풍기', '선풍기', '믹서', '믹서']

# 2차원 ndarray로 변환합니다.
items = np.array(items).reshape(-1, 1)

# 원-핫 인코딩을 적용합니다.
oh_encoder = OneHotEncoder()
oh_encoder.fit(items)
oh_labels = oh_encoder.transfor(items)

# OneHotEnder로 변환한 결과는 희소행렬이므로 toarray()를 이요해 밀집 행렬로 변환.
print('원-핫 인코딩 데이터')
print(oh_labels.toarray())
print('원-핫 인코딩 데이터 차원')
print(oh_labels.shape)

4) 피처 스케일과 정규화

1_ Feature Scaling : 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업. 대표적인 방법으로 표준화와 정규화가 있다.

2_ Standardization : 데이터의 피처 각각이 평균이 0이고 분산이 1인 가우시안 정규분포를 가진 값으로 변환하는 것을 의미. 표준화를 통해 변환될 피처 x의 새로운 i번째 데이터를 Xi_new라고 한다면 이 값은 원래 값에서 피처 x의 평균을 뺀 값을 피처 x의 표준편차로 나눈 값으로 계산 할 수 있다.

3_ Normalization : 서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념. 예를 들어 feature A는 거리를 나타내는 변수로서 값이 0~100KM로 주어지고 feature B는 금액을 나타내는 속석으로 값이 0 ~ 100,000,000,000원으로 주어진다면 이 변수를 모두 동일한 크기 단위로 비교하기 위해 값을 모두 최소 0 ~ 최대 1의 값으로 변환하는 것. 즉, 개별데이터의 크기를 모두 똑같은 단위로 변경하는 것이다. 새로운 데이터 Xi_new는 원래 값에서 feature x의 최솟값을 뺀 값을 feature x의 최댓값과 최솟값의 차이로 나눈 값으로 변환 할 수 있다.

사이킷런의 전처리에서 제공하는 Normalizer 모듈과 일반적인 정규화는 약간의 차이가 있다. 사이킷런의 Normalizer 모듈은 선형대수에서의 정규화 개념이 적용되었으며 개별 벡터의 크기를 맞추기 위해 변환하는 것을 의미합니다. 즉, 개별 벡터를 모든 피처 벡터의 크기로 나눠 줍니다. 3개의 피처 x,y,z가 있다고 하면 새로운 데이터 Xi_new는 원래 값에서 3개의 피처의 i 번째 피처 값에 해당하는 크기를 합한 값으로 나눠 줍니다.

5) StandardScaler

표준화를 쉽게 지원하기 위한 클래스. 개별 피처를 평균이 0이고, 분산이 1인 값으로 변환해준다. 이렇게 가우시안 정규분포를 가질 수 있도록 데이터를 변환 하는 것는 몇몇 알고리즘에서 매우 중요합니다. 특히 사이킷런에서 구현한 RBF 커널을 이용하는 Support Vector Machine, Linear Regression, Logistic Regression은 데이터가 가우시안 분포를 가지고 있다고 가정하고 구현되었기 때문에 사전에 표준화를 적용하는 것은 예측 성능 향상에 중요한 요소가 될 수 있다.

 

6) MinMaxScaler

데이터 값을 0과 1 사이의 범위 값으로 변화 합니다. (음수 값이 있으면 -1 ~ 1 값으로 변환) 데이터의 분포가 가우시안 분포가 아닐 경우에 Min, Max Scale을 적용해 볼 수 있다.

7) 학습 데이터와 테스트 데이터의 스케일링 변환 시 유의점

StandardScaler나 MinMaxScaler와 같은 Scaler 객체를 이용해 데이터의 스케일링 변환 시 fit( ), 
transform(), fit_transform() 메서드를 이용합니다. 일반적으로 fit()은 데이터 변환을 위한 기준 정 
보 설정(예를 들어 데이터 세트의 최댓값/최솟값 설정 등)을 적용하며 transform()은 이렇게 설정된 
정보를 이용해 데이터를 변환합니다. 그리고 fit_transform()은 fit()과 transform()을 한번에 적용하 
는 기능을 수행합니다.
그런데 학습 데이터 세트와 테스트 데이터 세트에 이 fit()과 transform(、)을 적용할 때 주의가 필요합 
니다. Scaler 객체를 이용해 학습 데이터 세트로 fit()과 transform()을 적용하면 테스트 데이터 세트 
로는 다시 fit()을 수행하지 않고 학습 데이터 세트로 fit()을 수행한 결과를 이용해 transform() 변환 
을 적용해야 한다는 것입니다. 즉 학습 데이터로 fit()이 적용된 스케일링 기준 정보를 그대로 테스트 
데이터에 적용해야 하며, 그렇지 않고 테스트 데이터로 다시 새로운 스케일링 기준 정보를 만들게 되면 
학습 데이터와 테스트 데이터의 스케일링 기준 정보가 서로 달라지기 때문에 올바른 예측 결과를 도출 
하지 못할수 있습니다.

 

1_학습 데이터와 테스트 데이터의 fit( ), transform( ), fit_transform( )을 이용해 스케일링 변환 시 유의할 점 요약

1. 가능하다면 전체 데이터의 스케일링 변환을 적용한 습과 테스트 데이터로 분리 
2. 1이 여의치 않다면 테스트 데이터 변환 시에는fit()이나fit_transform()을 적용하지 않고 학습 데이터로 이미 fit()
된 Scaler 객체를 이용해 transform()으로 변환

 

5. 사이킷런으로 수행하는 타이타닉 생존자 예측

 

 

 

728x90
반응형

'Computer > Machine Learning' 카테고리의 다른 글

CH 4. 머신러닝 복습 : 분류  (0) 2023.05.11
Ch 3. 머신러닝 복습 : 평가  (0) 2023.04.24
Ch09. 추천 시스템  (0) 2022.11.15
Ch8. 텍스트 분석  (0) 2022.10.28
Ch7. 군집화  (0) 2022.10.24
Comments