cb
[혼공머신] Chapter 01 - 나의 첫 머신러닝 본문
본 게시물은 <혼자서 공부하는 머신러닝+딥러닝>의 Chapter 01: 나의 첫 머신러닝을 보고 정리한 글입니다. 원본 코드는 책의 저자인 박해선님의 깃허브 코드를 참고하시길 바랍니다.
GitHub - rickiepark/hg-mldl: <혼자 공부하는 머신러닝+딥러닝>의 코드 저장소입니다.
<혼자 공부하는 머신러닝+딥러닝>의 코드 저장소입니다. Contribute to rickiepark/hg-mldl development by creating an account on GitHub.
github.com
인공지능이란?
인공지능(artificial intelligence)는 사람처럼 학습하고 추론할 수 있는 지능을 가진 컴퓨터 시스템을 만드는 기술이다.
인공지능은 크게 약인공지능(Weak AI)과 강인공지능(Strong AI)으로 나눌 수 있다.
먼저, 약인공지능은 특정 분야에서 사람의 일을 돕는 보조 역할만 수행하는 인공지능을 일컫는다. 음성 비서, 자율 주행 자동차, 기계 번역 등 현실에서 우리가 마주하고 있는 인공지능을 모두 약인공지능이라고 볼 수 있다.
그에 대비되는 강인공지능(혹은 인공일반지능)은 실제로 인간처럼 사고하여 문제를 해결할 수 있는 인공지능을 말한다. 우리가 <그녀>나 <터미네이터>와 같이 흔히 영화 속에서 볼 수 있는 인공지능을 떠올리면 된다.
머신러닝이란?
머신러닝(machine learning)은 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야이다. 데이터의 규칙을 일일이 프로그래밍하지 않아도 자동으로 학습할 수 있다는 장점이 있다.
머신러닝은 인공지능의 하위 분야 중, 지능을 구현하기 위한 소프트웨어를 담당하는 핵심 분야이다.
이는 컴퓨터 과학 분야의 라이브러리인 사이킷런(scikit-learn)을 통해 편리하게 구현할 수 있다. 사이킷런 라이브러리는 파이썬 API를 사용하는데, 파이썬 언어가 배우기 쉽다는 장점이 있기 때문이다.
딥러닝이란?
딥러닝(deep learning)은 인공 신경망(artificial neural network)을 기반으로 한 머신러닝 방법들을 통칭한 것이다.
과거와는 달리, 양질의 데이터가 생겨나고, 컴퓨터 성능이 향상되고, 혁신적인 알고리즘이 개발되면서 복잡한 알고리즘을 훈련할 수 있게 되었다. 이로부터 인공 신경망의 성능이 놀라울 정도로 향상되어, 인공지능 기술이 획기적으로 도약하기도 했다.
딥러닝은 구글의 딥러닝 라이브러리인 텐서플로(TensorFlow)나 페이스북의 파이토치(PyTorch)로 구현이 가능하다. 두 라이브러리는 인공 신경망 알고리즘을 전문으로 다루며 파이썬 API를 제공하기 때문에, 지금 가장 널리 사용되는 딥러닝 라이브러리이기도 하다.
코랩과 노트북
본격적으로 머신러닝을 학습하려면, 머신러닝에 사용되는 언어와 그를 사용할 수 있는 환경이 필요하다.
본 교재에서는 파이썬 언어를 사용하는 사이킷런, 텐서플로, 파이토치를 사용하여 인공지능을 학습한다. 그러나 많은 사람들이 개발 환경 구축에 어려움을 겪기 때문에 본 교재의 모든 코드는 개발 환경에 접근이 쉬운 구글 코랩(Colab)을 사용하여 작성되었다.
Google Colaboratory
colab.research.google.com
구글 코랩(Colab)은 웹 브라우저에서도 무료로 파이썬 코드를 실행할 수 있어 프로그래밍 환경 구축이 어렵지 않다는 장점이 있다. 또, 컴퓨터 성능과 관계 없이 프로그램을 실습해볼 수 있기도 하다.
코랩 노트북은 구글 클라우드의 가상 서버(virtual machine)을 사용하기 때문에, 구글 계정만 있으면 무료로 서버의 메모리를 사용할 수 있다.
생선 분류 문제
앞서 말한 것처럼 머신러닝은 스스로 데이터의 기준을 찾아서 학습한다는 장점이 있다. 우리는 여기서 생선 데이터를 토대로 주어진 생선이 도미인지 아닌지 판별하는 머신러닝 모델을 훈련해 볼 것이다.
먼저, 그러기 위해서는 도미 생선에 대한 데이터들이 필요하다. 이는 직접 손코딩을 통해 파이썬 리스트로 만들어 줄 것이다.
코랩의 코드 블럭에서 아래의 코드를 복사+붙여넣기하면 된다.
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]
첫 번쨰 도미의 길이는 25.4cm, 무게는 242.0g인 걸 볼 수 있다. 이처럼 데이터가 가지는 특징을 특성(feature)이라고 부르며, 한 데이터가 여러 개의 특성을 가질 수 있다.
숫자로 특성을 이해할 수도 있지만, 그래프로 표현했을 때 직관적으로 이해하기 쉬운 경우가 많다. 그렇기 때문에 각 특성을 x, y, ... 축으로 가지고 데이터를 점으로 표시한 산점도(scatter plot)을 주로 이용한다. 이는 맷플롯립(matplotlib)이라는 패키지를 사용하여 구현 가능하다.
import matplotlib.pyplot as plt
plt.scatter(bream_length, bream_weight)
plt.xtable('length')
plt.ylable('weight)')
plt.show()
위의 코드를 아까와 같이 코드 블럭에 복사+붙여넣기하면 아래와 같은 산점도를 얻을 수 있다.
산점도 그래프가 일직선에 가까운 형태로 나타나면 그래프를 선형(linear)적이라고 말한다.
도미 데이터를 마련한 것과 같은 방식으로 빙어 데이터를 준비할 수 있다. 빙어 데이터를 위한 코드는 아래와 같다.
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]
아까와 같은 방식으로 복사+붙여넣기만 해 주면 된다.
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
위 코드를 실행하면 다음과 같은 그래프를 확인할 수 있다.
맷플롯립은 자동으로 두 개의 산점도 색을 구분해 주기 때문에 데이터를 구분하여 관찰하기 편리하다. 본 그래프에서는 주황색 점이 빙어의 산점도이며, 파란 점이 도미의 산점도이다.
여기서는 k-최근접 이웃(k-Nearest Neighbors) 알고리즘을 사용해 도미와 빙어 데이터를 구분할 것이다.
먼저, 도미와 빙어 데이터를 하나의 데이터로 합쳐 한 리스트로 만든다. 이후 사이킷런 패키지를 활용하기 위해 각 특성의 리스트를 세로 방향으로 늘어뜨린 2차원 리스트로 만들어 준다.
# 데이터 합치기
length = bream_length+smelt_length
weight = bream_weight+smelt_weight
# 2차원 리스트로 변환
fish_data = [[l, w] for l, w in zip(length, weight)]
# 변환되었는지 출력해서 확인
print(fish_data)
여기서 우리는 머신러닝이 규칙을 학습하기 위해 어떤 데이터가 도미이고, 어떤 데이터가 빙어인지 알려 주는 과정을 거쳐야만 한다. 데이터를 하나로 합칠 때 도미와 빙어를 순서대로 나열했기 때문에 각 데이터의 개수만큼 정답 데이터를 준비해 주면 된다.
도미와 빙어를 숫자 1, 0으로 임의로 표현할 때, 정답 데이터는 아래와 같은 코드로 마련할 수 있다. (물론 반대로 0, 1이라고 설정해도 문제는 없다!)
# 정답 데이터 만들기
fish_target = [1]*35 + [0]*14
# 만들어진 데이터 확인
print(fish_target)
이후 k-최근접 이웃 알고리즘을 사용하기 위해 사이킷런의 클래스인 KNeighborsClassifier를 임포트하고, 클래스의 객체를 만들어 준다.
만들어진 객체에 데이터를 전달하여 기준을 학습하기 위해서는 fit() 메소드를 사용한다. 머신러닝에서는 이 과정을 훈련(training)이라고 하고, 모델에 데이터를 전달하게 규칙을 학습하는 과정을 말한다.
훈련이 끝난 후, 머신러닝 모델이 얼마나 잘 훈련되었는지 평가하기 위해 score() 메소드를 하용한다. 이는 0에서 1 사이의 값을 반환하는데, 1이 반환되었을 경우 모든 데이터를 정확히 맞혔다는 것을 의미한다.
# 클래스 임포트
from sklearn.neighbors import KNeighborsClassifier
# 객체 생성
kn = KNeighborsClassifier()
# 훈련
kn.fit(fish_data, fish_target)
# 모델 평가
kn.score(fish_data, fish_target)
k-최근접 이웃 알고리즘은 어떤 데이터에 대한 답을 구할 때 주위 다른 데이터를 보고, 다수를 차지하는 것을 토대로 데이터를 판단하는 원리로 작동된다.
위 그래프와 같이 세모 데이터를 가지는 생선이 있다면, 주변에 도미가 많기 떄문에 그 생선을 도미라고 판단하는 것이 k-최근접 이웃 알고리즘이라고 생각할 수 있다.
사이킷런에서는 predict() 메소드를 통해 새로운 데이터의 정답을 예측할 수 있다. 만약 30cm, 600g의 특성을 갖는 생선이 어떤 생선인지 판단하고 싶다면, 아래와 같이 코드를 입력할 수 있다.
# 데이터의 정답 예측
kn.predict([[30, 600]])
k-최근접 이웃 알고리즘은 현재 데이터가 주변 데이터를 몇 개 참고하는지도 모델 성능에 중요한 영향을 끼칠 수 있다. 가령 현재 준비된 데이터 49개 중에서는 도미 데이터의 수가 빙어 데이터의 수보다 훨씬 많다. 그렇기 때문에 만약 주변 데이터를 49개 참고한다면, 새로운 데이터의 특성 값과는 관계없이 무조건 도미로 분류될 것이다.
참고할 데이터의 수는 매개변수 n_neighboors를 통해 설정해 줄 수 있고, 코드는 다음과 같다.
# 매개변수 설정 및 객체 불러오기
kn49 = KNeighborsClassifier(n_neighbors=49)
# 훈련 및 평가
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
n_neighbors의 값은 사용자가 원하는 대로 지정해 줄 수 있기 때문에, 적절한 값을 설정하는 과정도 아주 중요하다.
마무리
chapter 1에서는 인공지능, 기계학습, 딥러닝의 기본 개념에 대해 알아보고 k-최근접 이웃 알고리즘을 통해 생선 분류 문제를 풀어보았다. 볼드체로 표기된 용어들은 꼭 알아둬야 할 기본적인 용어들이니 꼭! 유의해서 공부할 수 있도록 하자.
'ai - study' 카테고리의 다른 글
Sampling, Boosting (0) | 2024.02.21 |
---|---|
[혼공머신] Chapter 05 - 트리 알고리즘 (0) | 2024.02.17 |
[혼공머신] Chapter 04 - 다양한 분류 알고리즘 (1) | 2024.02.10 |
[혼공머신] Chapter 03 - 회귀 알고리즘과 모델 규제 (2) | 2024.02.05 |
[혼공머신] Chapter 02 - 데이터 다루기 (2) | 2024.01.31 |