[20180707]'파이썬 라이브러리를 활용한 머신러닝' 1장

1장에서는 머신러닝의 기본 개념과 Scikit-learn에 대한 간략한 소개로 시작합니다. 또한 이 책에서 다룰 주요 환경에 대해 소개합니다. 마지막으로 KNN으로 붓꽃을 분류하는 예제를 통해서 데이터 수집, 적재, 탐색 및 학습의 과정을 소개합니다. 머신러닝의 가장 기본적인 용어와 접근법에 대한 기초적인 이해를 전달하는 것을 목표로합니다.

1장의 예제 코드와 실행 결과는 다음 URL에서 확인할 수 있습니다. - https://github.com/taewanme/notebooks4til/blob/master/MLWithPythonLibraries/ch01.ipynb


1장 구성

전에 26페이지 정도 분량으로 기계학습이란 무엇이고 이 책에서 다루는 환경에 대하여 소개합니다. 붓꽃을 분류하는 첫 번째 예제로 간단한 지도학습을 진행하는 방식을 소개합니다. 전체 목차는 다음과 같습니다.

  • 1.1 왜 머신러닝인가?
  • 1.2 왜 파이썬인가?
  • 1.3 sckkit-learn
  • 1.4 필수 라이브러리
  • 1.5 파이썬2 vs 파이썬3
  • 1.6 이 책에서 사용하는 소프트웨어 버전
  • 1.7 첫 번째 애플리케이션 붓꽃의 품종 분류
    • 데이터 적재
    • 상관관계 측정: 훈련 데이터와 테스트 데이터
    • 데이터 탐색
    • KNN 학습 및 예측
    • 모델 평가
  • 1.8 요약

핵심 요약

머신러닝의 의미

  • 머신러닝이란 데이터에서 지식을 출하는 작업이다.
  • 사용할 데이터를 이해하고 그 데이터가 해결해야 할 문제와 어떤 관련이 있는지를 이해가 시작점이다.

프로그래밍 기반 인공지능

  • 개발을 기반으로 하는 규칙기반 전문가 시스템(과거)
  • 개발이 쉽다는 장점이 있지만 많은 단점과 한계가 존재
    • 단점
      • 결정에 필요한 로직은 한 분야나 직업에 국한
      • 규칙 변경 시 재개발이 필요함
      • 규칙 설계 시 해당 분야 전문가의 결정 방식에 대한 높은 이해가 필요
    • 한계
      • 인위적으로 규칙을 파악하기 어려운 문제
      • 이미지 인식, 음성 인식에 적용 어려움

기계학습 유형

  • 지도 학습
    • 알려진 사실을 바탕으로 일반화된 모델을 만들어 의사 결정 프로세스를 자동화하는 것
    • 알고리즘에 입력과 기대 출력을 제공하여 입력과 출력의 대응 관계 도출
    • 입력과 기대 출력 값을 만드는 과정이 어려움
    • 알고리즘 도출 과정은 자동화
    • 결과에 대한 성능 측정이 쉽다는 것 강점
    • 사용 사례
    • 편지봉투 손글씨 판별
    • 의료 영상 종양 판단
    • 카드 부정 거래 감지
  • 비지도 학습
    • 입력만을 제공
    • 데이터의 관계 파악에 사용
    • 사용 사례
    • 블로그 주제 구분
    • 비슷한 성향의 고객을 그룹으로 묶기
    • 비정상 웹 사이트 접근 탐지

기계학습 과정에 필요한 질문

기계학습의 정확한 의미 파악과 올바른 진행을 위해서 필요한 질문, 기계학습 과정에서 지속적으로 점검해야 함

  • 어떤 질문에 대한 답을 원하는가?
  • 가지고 있는 데이터로부터 원하는 답을 찾을 수 있는가?
  • 내 질문을 기계학습의 문제로 가장 잘 기술하는 방법은 무엇인가?
  • 문제를 풀기 위한 충분한 데이터를 얻었는가?
  • 내가 추출한 데이터의 특성은 무엇이며 좋은 예측을 만들어 낼 수 있을 것인가?
  • 기계학습 애플리케이션이 성과를 어떻게 측정할 것인가?
  • 기계학습 솔루션이 다른 연구나 제품과 어떻게 협력할 수 있는가?

주요 용어 정리

  • 1개의 입력 데이터
    • 샘플, Sample
    • 인스턴스, Instance
    • Data Point
    • Row
  • 1개 데이터 속의 컬럼
    • 속성: Feature
  • 좋은 데이터 확보 방안
    • feature extraction: 특성 추출
    • feature engineering: 특성 공학

예제: 붓꽃 분류

붓꽃 데이터 적재

from sklearn.datasets import load_iris
iris_dataset = load_iris()
print(iris_dataset['data'].shape)
(150, 4)

과적합 방지을 위한 학습과 테스트 데이터 분할

  • 학습 데이터, 학습 셋
  • 테스트 데이터, 테스트 셋, 홀드-아웃 셋(Hold-out set)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0)

데이터 탐색

  • scatter matrix를 이용한 데이터 탐색
    • scatter matrix로 특성의 데이터 분포와 특성 간의 경향성 파악
import mglearn
iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o',
                           hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3)

KNN 학습

  • 1개의 근접 데이터를 파악하고 그 레이블 값(목적 값)을 입력데이터의 출력 값으로 결정하는 알고리즘
  • 유사도에 대한 고찰
  • KNN: K-nearest neighbors (K-최근접 이웃)
  • 입력데이터와 유사한 k개의 데이터를 구하고, 그 K개 데이터의 분류 중 가장 빈도가 높은 클래스를 입력 데이터의 분류로 결정하는 알고리즘
  • Scikit Learn에서는 KNeighborsClassifier로 구현됨
    • Estimator 클래스 상속
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)

KNN 새로운 데이터에 대하 예측

  • 예측 레이블 값으로 실제 클래스 명 Lookup
X_new = np.array([[5, 2.9, 1, 0.2]])
prediction = knn.predict(X_new)
print("테스트 세트의 정확도: {}".format(
       iris_dataset['target_names'][prediction]))
'테스트 세트의 정확도: 0.97'

모델 평가

y_pred = knn.predict(X_test)
np.mean(y_pred == y_test)
knn.score(X_test, y_test)

요약

기계학습에 대한 기본적인 소개와 전체적인 데이터 분석 절차에 대한 대략적인 흐름을 설명합니다. scikit-learn을 한번 돌려보고 경험할 수 있습니다. 기계학습 입문자에게 꼭 필요한 내용입니다. 가장 중요하게 생각되는 부분은 기계학습을 진행하면서 고민해야 할 7개 질문입니다.

작성자: 김태완
김태완 avatar
작성자: 김태완
1999년 부터 Java, Framework, Middleware, SOA, DB Replication, Cache, CEP, NoSQL, Big Data, Cloud를 키워드로 살아왔습니다. 현재는 한국오라클 빅데이터 팀 소속으로 빅데이터와 Machine Learning을 중점에 두고 있습니다. 최근에는 Deep Learning을 열공 중입니다.
E-mail: taewanme@gmail.com