Hyun's Wonderwall

[Pylots] 파머완 - 02. 사이킷런으로 시작하는 머신러닝 본문

Study/Python-Machine-Learning

[Pylots] 파머완 - 02. 사이킷런으로 시작하는 머신러닝

Hyun_! 2024. 3. 23. 13:51

[Chapter 02] 사이킷런으로 시작하는 머신러닝

1. 사이킷런 소개와 특징

사이킷런(scikit-learn): 파이썬 머신러닝 라이브러리.

import sklearn

2. 붓꽃 품종 예측하기

붓꽃의 특징을 기반으로 품종을 분류하려고 한다. 분류는 지도학습 방법 중 하나.
- 붓꽃 데이터 피처: Sepal length, Sepal widtn, Petal length, Petal width
- 붓꽃 데이터 품종(레이블): Setosa, Vesicolor, Virgiinica (3종류)
*피처: 특징. 학습 모델에서 제공하는 입력 변수. 단순 선형 회귀에서의 X변수.
*레이블(label) 데이터: 분류 결정값. 기계학습으로 예측하는 실제 항목. y=f(X)에서 y.

*지도학습: 학습을 위한 다양한 피처와 레이블 데이터(명확한 정답 주어짐)로 모델을 학습한 뒤 별도의 데이터 세트에서 미지의 레이블을 예측한다. // 기출 문제집으로 시험 대비하고 실전 시험 치는 것과 비슷.
- 학습 데이터 세트(train): 명확한 정답이 주어진 데이터
- 테스트 데이터 세트(test): 머신 러닝 모델 예측 성능 평가용 데이터

사이킷런에서 사용할 모듈을 임포트하자.

from sklearn.패키지모듈 import 모듈/클래스

*모듈/클래스 구분법: 모듈은 스네이크 케이스, 클래스는 파스칼 케이스(단어별 첫글자 대문자)

  • sklearn.datasets: 사이킷런에서 자체적으로 제공하는 데이터 세트를 생성하는 모듈의 모임. // 붓꽃 데이터 세트 생성을 위해 load_iris를 임포트하였다.
  • sklearn.tree: 트리 기반 ML 알고리즘을 구현한 클래스의 모임. // 의사 결정 트리 알고리즘을 구현한 DecisionTreeClassifier를 임포트하였다.
  • sklearn.model_selection: 학습 데이터와 검증 데이터, 예측 데이터로 데이터를 분리하거나 최적의 하이퍼 파라미터로 평가하기 위한 다양한 모듈의 모임. // train_test_split으로 데이터를 분리하였다.

* 하이퍼 파라미터란? 머신러닝 알고리즘별로 최적의 학습을 위해 직접 입력하는 파라미터들. 하이퍼 파라미터를 통해 머신러닝 알고리즘의 성능을 튜닝할 수 있다.

분류 프로세스:

1. 데이터 세트 분리 (학습&예측)

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

3. 예측 수행 (테스트 데이터의 분류를 예측)

4. 성능 평가 (예측과 테스트 데이터의 실제 결괏값 비교)

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import pandas as pd

iris = load_iris() # 붓꽃 데이터 세트 로딩
iris_data = iris.data # data: 데이터 세트에서 피쳐만으로 된 데이터를 ndarray로(numpy로) 가지고 있다.
iris_bael = iris.target # target: 데이터 세트에서 레이블 데이터를 ndarray로 가지고 있다.

# 붓꽃 데이터 세트를 DataFrame으로 로딩
iris_df = pd.DataFrame(data=iris_data, colums=iris.feature_names)
iris_df['label'] = iris.target # 새 column 생성
iris_df.head(3) # 3개 행 출력

# train_test_split() 사용해 학습용 데이터와 테스트용 데이터 분리:
# 파라미터는 (1)피처 데이터 세트, (2)레이블 데이터 세트, (3)전체 중 테스트 데이터 세트의 비율, (4) 난수 발생 시드값
X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, test_size=0.2, random_state=11)

# DecisionTreeClassifier 객체 생성
dt_clf = DecisionTreeClassifier(random_state=11)
# 학습용 데이터로 학습 수행
dt_clf.fit(X_train, y_train)
# 학습이 완료된 DTC 객체에서 테스트 데이터 세트로 예측 수행
pred = dt_clf.predict(X_test)

# accuracy_score()로 정확도 측정. 실제와 예측 레이블 데이터 세트 비교.
from sklearn.metrics import accuracy_score
print('예측 정확도: {0:.4f}' .format(accuracy_score(y_test, pred)))

 

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

3.1. Estimator 이해 및 fit(), predict() 메서드

지도학습 - 분류, 회귀가 주요 두 축

- ML 모델 학습을 위해서 fit()을, 학습된 모델의 예측을 위해 predict() 메서드를 제공한다.
[Classifier: 분류 알고리즘 구현 클래스] + [Regressor: 회귀 알고리즘 구현 클래스]
=>  Estimator : 지도학습의 모든 알고리즘을 구현한 클래스.

 

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

- fit(): 입력 데이터의 형태에 맞춰 데이터를 변환하기 위한 사전 구조를 맞추는 작업

- transform(): 입력 데이터의 차원 변환, 클러스터링, 피저 추출 등 실제 작업을 할 때에 사용함

- fit_transform()도 존재

3.2. 사이킷런의 주요 모듈

출처: https://casa-de-feel.tistory.com/3

3.3. 내장된 예제 데이터 세트

datasets 모듈의 여러 api들 호출해서 예제 데이터 세트 생성 가능

4. Model Selection 모듈 소개

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

예측을 수행하는 데이터 세트는 학습용 데이터 세트가 아닌, 전용 데이터 세트여야 한다.

train_test_split() 사용해 학습용 데이터와 테스트용 데이터를 분리한다.
- 파라미터는 (1)피처 데이터 세트, (2)레이블 데이터 세트 입력받은 후,
   그후 선택적으로 다음 파라미터를 입력받는다: test_size, train_size, shuffle, random_state

- 반환값: X_train, X_test, y_train, y_test

4.2. 교차 검증

과적합(Overfitting)에 취약한 문제가 나타날 수 있다. - 학습 데이터에 과도하게 최적화되는 것.

=> 해결방안: 교차 검증으로 더 다양한 학습과 평가를 진행한다.사이킷런에서는 KFold와 StratifiedKFold 클래스를 제공

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

출처: https://continuous-development.tistory.com/entry/MLDL-python-%EC%9D%84-%ED%86%B5%ED%95%9C-%EA%B5%90%EC%B0%A8%EA%B2%80%EC%A6%9D-k-Fold-stratifiedkFold

 

Stratified K폴드: 불균형한 분포도를 가진 레이블 데이터 집합을 위한 K 폴드 방식. K 폴드에서 레이블 데이터 집합이 원본 데이터 집합의 레이블 분포를 학습 및 테스트 세트에 제대로 분배하지 못하는 경우의 문제를 해결한다.

 

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

사이킷런은 GridSearchCV API를 이용해 Classifier나 Regressor와 같은 알고리즘에 쓰이는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할 수 있는 방식을 제공한다.

 

파라미터의 집합을 만들고 이를 순차적으로 적용하면서 최적화를 수행할 수 있다.

5. 데이터 전처리

5.1. 데이터 인코딩

레이블 인코딩: 카테고리 피처를 코드형 숫자 값으로 변환하는 것. LabelEncoder 클래스로 구현.

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

5.2. 피처 스케일링과 정규화

표준화, 정규화

표준화: 데이터 피처 각각이 평균이 0이고 분산이 1인 가우시안 정규 분포를 가진 값으로 변환하는 것 (최소 0~최대1)

5.3. StandardScaler

표준화 지원 클래스

5.4. MinMaxScaler

데이터값을 0과 1 사이 범위 값으로 변환 (음수 값: -1~1로 변환) 데이터 분포가 가우시안 분포가 아닌 경우에 적용할 수 있다.

 

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