Post

[혼자 공부하는 ML + DL] 1. 머신러닝

아래 내용은 “혼자 공부하는 머신러닝+딥러닝” 책을 공부하며 정리한 내용입니다.

Chapter 01. 나의 첫 머신러닝

1. 인공지능과 머신러닝, 딥러닝

인공지능

  • 사람처럼 학습하고 추론할 수 있는 지능을 가진 컴퓨터를 만드는 기술

  • 강인공지능(인공일반지능): 사람과 구분하기 어려운 지능을 가진 컴퓨터 시스템

  • 약인공지능: 특정 분야에서 사람의 일을 도와주는 보조 역할을 하는 컴퓨터 시스템 ( ex. 음성 비서, 자율 주행 자동차, 음악 추천 등)

머신러닝

  • 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야

  • 인공지능의 하위 분야 중에서 지능을 구현하기 위한 소프트웨어를 담당하는 핵심분야

  • 대표적인 머신러닝 라이브러리 : 사이킷런(scikit-learn)

딥러닝

  • 머신러닝 알고리즘 중 인공 신경망(artificial neural network)을 기반으로 한 알고리즘

  • 대표적인 딥러닝 라이브러리 : 텐서플로(TensorFlow) - 구글, 파이토치(PyTorch) - 페이스북

2. 코랩과 주피터 노트북

코랩코랩

코랩

  • 웹 브라우저에서 무료로 파이썬 프로그램을 테스트하고 저장할 수 있는 서비스로, 클라우드 기반의 주피터 노트북 개발환경이다.

  • 머신러닝 프로그램도 만들 수 있으며, 컴퓨터 성능과 상관없이 머신러닝 프로그램을 실습해 볼 수 있다.

노트북

  • 텍스트와 프로그램 코드를 자유롭게 작성할 수 있는 온라인 에디터, 코랩의 프로그램 작성단위

텍스트 셀

  • 실행되는 코드가 아닌, 텍스트를 담을 수 있는 공간 코드를 설명하는 글을 쓰는 등 자유롭게 사용할 수 있다.

  • 셀 하나에 아주 긴 글을 써도 되고 여러 셀에 나누어 작성해도 된다.

  • 텍스트 셀을 수정하려면 원하는 셀로 이동한 후 Enter 키를 누르거나 마우스를 더블 클릭하여 편집 화면으로 이동할 수 있다.

  • HTML과 마크다운을 혼용하여 사용할 수 있다.

3. 마켓과 머신러닝

머신러닝은 누구도 알려주지 않는 기준을 스스로 찾고, 이 기준을 이용하여 판별할 수도 있다.

머신러닝을 구현하는 과정을 ‘도미와 빙어를 구분하는 머신러닝’ 예시와 함께 살펴보자.

도미 데이터 준비

아래는 35마리 도미의 길이와 무게 정보를 담은 리스트이다

1
2
3
4
5
6
bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]

이때, 각 도미의 특징인 길이와 무게를 도미의 특성(feature)이라고 부른다.

  • 특성: 데이터를 표현하는 하나의 성질

도미의 특성을 산점도 그래프로 확인해보자.

1
2
3
4
5
6
import matplotlib.pyplot as plt

plt.scatter(bream_length, bream_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

도미 특성 표현도미 특성 표현

가로 x축은 길이, 세로 y축은 무게인 2개의 특성을 사용해 그린 그래프이다.

생선의 길이가 길수록 무게가 많이 나간다고 생각하면 그래프의 형태가 자연스럽다고 할 수 있다.

이렇게 산점도 그래프가 일직선에 가까운 형태로 나타나는 경우를 선형(linear)적이라고 한다.

빙어 데이터 준비

아래는 14마리 도미의 길이와 무게 정보를 담은 리스트이다

1
2
smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

빙어의 특성을 산점도 그래프로 확인해보자.

1
2
3
4
5
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

빙어 특성 표현빙어 특성 표현

빙어는 상대적으로 도미에 비해 크기도 작고 무게도 작다.

빙어도 길이가 늘어날 수록 무게도 증가하지만 많이 늘지는 않았다.

생선 분류 머신러닝 프로그램 만들기

k-최근접 이웃(k-Nearest Neighbors)알고리즘을 사용해 두 생선을 분류해보자.

  • KNN: 어떤 데이터에 대한 답을 구할 때, 주위의 다른 데이터(기본값 5)를 보고 다수를 차지하는 것을 정답으로 사용하는 알고리즘

먼저 두 생선 리스트를 하나로 합쳐서 2차원 리스트로 만든다.

1
2
3
4
length = bream_length+smelt_length
weight = bream_weight+smelt_weight
 
fish_data = [[l, w] for l, w in zip(length, weight)]

예시 데이터를 준비했으니 정답 데이터도 준비해보자.

우리가 구분하고자 하는 생선은 ‘도미’이니 도미를 정답인 1, 빙어를 오답인 0으로 표현하였다.

마찬가지로, 정답 데이터도 2차원 리스트로 표현해야 한다.

1
fish_target = [1] * 35 + [0] * 14

이제 사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현한 클래스 KNeighborsClassifier를 임포트하고, KNeighborsClassifier 클래스 객체를 만들어 이 객체에 학습(training)을 시켜보겠다.

1
2
3
4
from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier()
kn.fit(fish_data, fish_target)

이제 객체 kn이 얼마나 잘 훈련되었는지 평가해보겠다.

사이킷런에서 모델을 평가하는 메서드는 score()이다.
이 메서드는 0-1 사이이 값을 반환하고 1은 모든 데이터를 정확히 맞혔다는 의미이다.

1
2
3
kn.score(fish_data, fish_target)

 1.0

모든 답을 정확히 맞혔다. 이 값을 정확도(accuracy)라고 부르며 이 모델은 정확도 100%로 완벽하게 분류하였다.

그러나 이렇게 하면 데이터에 편향이 생기게 되어 올바른 분류 모델이라 할 수 없다.

이 부분에 대해서 다음 장에서 다뤄보도록 하자.

This post is licensed under CC BY 4.0 by the author.