사이킷런으로 머신러닝 시작하기(1)

천호영·2021년 6월 23일
2

사이킷런 라이브러리 소개

데이터 분석 및 머신러닝 적용을 위한 파이썬 기반 라이브러리

NumPy: 행렬이나 대규모 다차원 데이터 분석을 위한 라이브러리
Pandas: 행과 열을 가지는 2차원 데이터 분석을 위한 라이브러리
Matplotlib, Seaborn: 데이터 분석을 위한 시각화 라이브러리
SciPy: 기술 통계를 위한 파이썬 라이브러리
Statsmodels: 파이썬 기반의 대표적인 통계 분석 라이브러리
Scikit-learn: 파이썬 기반의 대표적인 머신러닝 라이브러리

Scikit-learn

  • 파이썬 기반의 대표적인 머신러닝 라이브러리
  • 머신러닝을 위한 다양한 알고리즘, 프레임워크, API를 제공
  • 오랜 기간 안정성이 검증된 라이브러리

사이킷런으로 머신러닝 시작하기

사이킷런을 활용하여 머신러닝의 기초 실습을 진행합니다.
필요한 라이브러리 로딩 부터 데이터 다운로드, 학습, 검증까지 머신러닝의 주요 프로세스를 실습을 통해 알아보겠습니다.

[실습 프로세스]
STEP.1 데이터 준비
STEP.2 학습 알고리즘 선택
STEP.3 학습 데이터를 통한 모델 학습
STEP.4 테스트 데이터를 통한 모델 검증

Scikit-learn API Reference

  • 보스턴 주택 가격 데이터셋 다운로드를 위한 load_boston()
    .DESCR : 데이터셋의 description
    .feature_names : feature 인덱스명
    .data : feature 데이터
    .target_names : class(target) 인덱스명
    .target : class(target) 데이터

  • 데이터 셋 분할을 위한 train_test_split
    test_size : 테스트 데이터 셋의 비율
    train_size : 학습 데이터 셋의 비율
    shuffle : 데이터 셋 분리 전 미리 섞을지 여부
    random_state : 실행 시 마다 동일한 난수를 생성하기 위한 값

  • K 최근접 이웃 알고리즘 적용을 위한 KNeighborsClassifier
    (새로운 데이터가 주어졌을 때, 가장 가까운 K개의 이웃 데이터를 찾는 알고리즘)

<알고리즘 적용 프로세스>
1. 적용할 클래스 객체 생성
2. fit(X, y) 훈련 데이터 기반으로 모델 학습
3. predict(X) 테스트 데이터셋에 대해 학습된 모델로 예측
4. score(X, y) 테스트 데이터셋에 대해 모델의 성능 평가

<실습코드>

'''
-------- [최종 출력 결과] --------
Prediction:
Accuracy:
----------------------------------
'''
# 필요한 라이브러리 로딩
import sklearn
# load_iris 를 import 시키기
from sklearn.datasets import load_iris
# train_test_split 를 import 시키기
from sklearn.model_selection import train_test_split 
# KNeighborsClassifier 를 import 시키기
from sklearn.neighbors import KNeighborsClassifier

# 데이터셋 로딩
iris = load_iris()

# 속성 이용하여 데이터셋의 전체적인 정보 확인(코드 제출시 주석 처리)
#print(iris.DESCR)

# 속성 이용하여 feature 확인(코드 제출시 주석 처리)
#print('Iris data shape:', iris.data.shape)
#print('Iris feature name\n:', iris.feature_names)
#print('Iris data\n:', iris.data)
#print('Iris data type\n:', type(iris.data))

# 속성 이용하여 class 확인 (코드 제출시 주석 처리)
#print('iris target name:\n',iris.target_names)
#print('iris target value:\n',iris.target)

# 데이터셋을 train, test 로 분할
# random_state 값은 강의와 동일하게 지정하세요.
x_train, x_test, y_train, y_test = train_test_split(
  iris.data, iris.target, test_size=0.3, random_state=11)

# 분할된 데이터의 shape 확인 (코드 제출시 주석 처리)
#print('x_train.shape = ', x_train.shape)
#print('y_train.shape = ', y_train.shape)
#print('x_test.shape = ', x_test.shape)
#print('y_test.shape = ', y_test.shape)

# KNeighborsClassifier 의 객체 생성
knn = KNeighborsClassifier(n_neighbors=8)
#print(type(knn))

# 훈련 데이터를 이용하여 분류 모델 학습
knn.fit(x_train,y_train)

# 학습된 knn 모델 기반 예측
y_pred = knn.predict(x_test)
print('Prediction:\n',y_pred)

# 모델 평가
score = knn.score(x_test, y_test)
print('Accuracy : {0:.5f}'.format(score))

<실행결과>

Prediction:
 [2 2 2 1 2 0 1 0 0 1 2 1 1 2 2 0 2 1 2 2 1 0 0 1 0 0 2 1 0 1 0 2 2 0 0 2 2
 1 0 2 1 2 0 1 2]
Accuracy : 0.97778

K-최근접 이웃 알고리즘 소개

  • 새로운 데이터가 주어졌을 때, 가장 가까운 K개의 이웃 데이터를 찾는 알고리즘
  • K-Nearest Neighbor(KNN)
  • k값은 n_neighbors 인자를 통해 정의 가능(default=5)

분류와 회귀 문제를 모두 다룰 수 있는 알고리즘

  • 분류: 다수결로 예측(KNeighborsClassifier)
  • 회귀: 평균 값으로 결과 예측(KNeighborsRegressor)

KNN 모델 성능의 주요 이슈

  • 데이터 간의 거리는 어떻게 측정하는가?
    유클리디안 거리, 맨해튼 거리, 민코프스키 거리
    인자인 p와 metric을 통해 결정
  • 적절한 K 값의 크기는 어떻게 설정할 것인가?
    초깃값 3으로 정하고 조절해나간다

하이퍼 파라미터(Hyper parameter)

  • 학습 시작 전에 모델러에 의해 결정되는 값
  • 모델의 성능에 영향을 주기에 최적의 값을 찾아 설정해야 함
    ex. 거리계산방식, k값

KNN 정리

  • 매우 단순하고 직관적인 알고리즘
  • 실행 시점에 k값에 의한 거리 연산 발생(고비용)
  • 최적의 k값 정의가 중요함
  • 데이터의 스케일이 서로 다른 경우 별도의 정규화 과정 필요

과대적합과 과소적합

머신러닝의 목표: 표본 데이터를 기반으로 일반화된 모델을 만드는 것

최적화(Optimization): 훈련 데이터에서 최고의 성능을 내는 모델을 조정하는 과정
일반화(Generalization): 모델이 이전에 학습한 적 없는 데이터에서 얼마나 잘 수행되는지를 의미

  • 너무 최적화-> 과대적합(overfitting)
  • 너무 일반화-> 과소적합(underfitting)

<Overfitting 피하기>

  • 학습 데이터 추가: 교차 검증(cross validation)
  • 학습 데이터의 모델 노출 횟수 줄이기
  • 모델의 복잡도 낮추기: Feature제거or변환, 규제 기법 사용

<Underfitting 피하기>

  • 학습 시간을 늘리기(딥러닝)
  • 모델 복잡도 높이기: Feature추가, 규제 기법 제거
  • 모델을 새로 구축

머신러닝의 목표
과대적합과 과소적합 사이의 격차 최소화
최적화와 일반화라는 가치에서 적절한 균형을 찾도록 학습되어야 함

0개의 댓글