본문 바로가기

KHUDA 활동 아카이브/Machine Learning 기초

Ch 1. 나의 첫 머신러닝 - 이 생선의 이름은 무엇인가요?

어떤 분야를 처음 접할 때, 가장 먼저 소개하는 것은 역시 역사입니다.

 

역사는 물론 중요하죠. 하지만 우리의 주요 관심사는 역사가 아닌, 

 

"인공지능이 무엇인지, 어떻게 구현되는지"

 

일 것입니다.

 

이에 대해 간략하게 설명하고 넘어가겠습니다.

 

 

 

인공지능

 

사람처럼 '학습' 하고, '추론' 할 수 있는 지능을 가진 시스템을 의미합니다.

 

 

 

머신러닝

 

이 인공지능의 '지능' 을 구현하기 위한 분야를 의미합니다.

 

즉, 인공지능을 기술적으로 구현하는 분야가 머신러닝인 것입니다. 

 

우리의 목적은 최종적으로 인공지능을 구현해보는 것입니다. 그렇다면 당연히 머신러닝을 사용해야겠죠?

 

현재 이 머신러닝을 가장 구현하기 쉬운 언어가 파이썬 입니다.

 

왜냐하면, 파이썬 내에 있는 사이킷런(scikit-learn) 이라는 라이브러리를 이용하면 정말 쉽게 머신러닝 프로그램을 만들 수 있기 때문입니다.

 

 

딥러닝

 

머신러닝은 다양한 방법으로 지능을 구현합니다. 

 

이 '지능' 이라고 함은, 현재로서는 데이터의 규칙을 찾는 것으로 이해하면 충분할 것입니다.

 

데이터의 규칙을 찾는 방법은 여러가지가 존재하겠죠?

 

그 중에서, 우리 인간의 뇌를 모방한 인공 신경망을 기반으로 한 방법들을 통칭해 딥러닝이라고 부릅니다.

 

 

 


" 이제 개념적인 부분은 알았으니, 바로 기술적인 부분을 확인해볼까? " 

 

 

맞습니다. 그 전에, 마지막으로 개발환경을 통일시키고 가겠습니다.

 

여러분들의 개발환경과 다른 사람들의 개발환경이 동일할 것이라는 보장은 없습니다.

 

따라서 모두가 동일한 환경에서 실습을 진행하기 위해, 구글의 Colab을 사용해보도록 하겠습니다.

 

앞으로의 모든 코드와 실습들은 코랩(Colab)으로 이루어질 것입니다.

 

코랩에 대한 기초 사용법은 아래 블로그가 잘 설명해놓았네요! 

 

보는데 1분도 안걸리니깐 처음 사용하신다면 슬쩍 보고 오는것도 도움이 될거 같습니다.

 

코랩 기초 : https://yeko90.tistory.com/entry/how-use-google-colab

 

 


 

 

 

자, 이제 아주 간단한 예시를 살펴보며 머신러닝에 대한 감을 잡아보겠습니다.

 

다음 상황을 볼까요?

 

나는 수산물 시장에서 생선을 감별하는 일을 하고있다. 

주로 많이 들어오는 생선은 도미와 빙어이다.


이 둘을 눈으로 감별하는 것은 나에게 어렵지 않다.

하지만, 조금 더 효율을 높이기 위해 두 생선을 자동으로 분류해주는 프로그램이 있으면 좋겠다.

어떻게 해야할까?


아무래도 프로그램이 판별해야하는 것이기 때문에, 외형을 보고 분류하는 것은 아직은 어려울거 같네요.

하지만 우리는 도미가 빙어보다 크기가 훨씬 크고, 무겁다는 것을 알고 있습니다. 


그렇다면, 기존 도미와 빙어의 크기, 무게들을 바탕으로 이 생선이 무엇인지 맞춰보라고 하면 되지 않을까요?

확신이 들진 않습니다. 하지만 한번 이 방법대로 해보죠.


현재 우리에겐 35마리의 도미가 있습니다. 이 도미들 각각의 무게와 길이를 재봤더니 다음과 같았습니다.


bream은 도미를 의미한다.


예를 들어, 첫 번째 도미의 길이는 25.4cm이고, 무게는 242g 이고, 

 

두 번째 도미의 길이는 26.3cm이고, 무게는 290g 인 것입니다.

 


 

마찬가지로, 빙어의 무게와 길이도 측정해보겠습니다. 하지만 오늘따라 빙어는 많이 잡히지 않았습니다.

 

14마리밖에 없네요. 그래도 이 14마리에 대한 빙어의 무게와 길이를 측정해봤습니다. 

 

 

semlt는 빙어를 의미한다.

 

 

이제 이 데이터들을 하나의 평면에 나타내볼까요? 

 

그렇다면 어느 정도의 관계가 보일지도 모르겠습니다.

 

파이썬에서 그래프를 그릴 때 보통 matplotlib라는 라이브러리를 사용합니다. 

 

그리고 위와 같은 데이터들의 점들을 찍으려 할 때 scatter() 함수를 사용하면 편리합니다.

 

이를 이용해 다음과 같은 코드를 코랩에 입력해봅시다.

 

scatter 함수의 파라미터로는 x축 데이터, y축 데이터를 리스트 형태로 넣으면 된다.

 

이를 실행하면 다음과 같은 그래프가 나오게 됩니다.

 

 

친절하게 색깔로 도미, 빙어를 구분해주네요.

 

관찰해보니 주황색이 빙어, 파란색이 도미인거 같습니다.

 

 

 

 

자, 이렇게 생선들의 무게와 길이를 그래프에 표현했습니다.

 

이제 강력한 머신러닝 도구를 하나 들고올건데요, 

 

바로 k-최근접 이웃 알고리즘(k-Nearest Neighbors) 입니다.

 

 

 

??? 갑자기??? 그게 뭔데??

 

맞습니다. 너무 급발진이어서 저도 이렇게 생각했습니다. 

 

당연히 이 알고리즘이 무엇인지 설명하고 다음으로 넘어가는게 자연스럽겠지만,

 

일단 이런 알고리즘을 사용할 것이라고 눈 감고 넘어가주시면 조금 더 이해가 수월할 것입니다.

 

뒤에서 자세히 설명드리겠습니다.

 


 

아무튼 이 최근접 알고리즘은 머신러닝 알고리즘이기에, 

 

위에서 소개했던 머신러닝 라이브러리인 사이킷런에 포함되어 있습니다. 

 

이를 불러오는 코드는 다음과 같습니다.

 

 

 

 

 

아무것도 모르는 채로 난해하기만한 코드를 불러오니 여간 찝찝한게 아닙니다.

 

그래도, 조금만 더 가봅시다.

 

이 KNeighborsClassifier이 k-최근접 알고리즘을 구현해놓은 라이브러리입니다.

 

이 라이브러리를 활용하기 위해, 이 객체를 하나 생성해놓아 봅시다.

 

 

여기선 kn이 그 객체가 되겠네요. 

 

그리고 이 kn한테 훈련시킬 데이터를 줘야하는데, 

 

위에서 우리는 도미와 빙어에 대한 데이터를 리스트 형태로 뽑아냈죠.

 

 

 

 

하지만 우리는 하나의 생선에 대해 길이와 무게가 한 쌍으로 있으면 좋겠습니다.

 

어떤 생선이 도미인지 빙어인지 구분할 때 그 생선의 길이와 무게를 동시에 봐야되니깐요.

 

예를 들어 위에서 관찰했던 첫 번째 도미에 대한 정보가

 

 

[25.4, 242.0]

 

 

와 같이 (길이, 무게) 쌍으로 나타나면 좋겠네요.

 

 

파이썬을 조금 만져보셨던 분들이라면 zip 함수가 바로 떠올랐을겁니다.

 

하지만 이 zip 함수가 떠오르지 않았다면, 반복문을 이용해 만들수도 있겠죠.

 

저는 zip을 이용해 묶어보겠습니다.

 

 

 

이렇게 말이죠.

 

그러면 fish_data에는 다음과 같이 정보가 저장되었을 겁니다.

 

 

 

원하는대로 잘 저장됐네요.

 

이제 이 fish_data를 kn에게 입력 데이터로 넣어줄겁니다.

 

하지만 이 데이터만 넣어준다면,

 

kn은 뭐가 도미이고 뭐가 빙어인지 모를 것입니다.

 

최소한 그거정도는 알려줘야 다른 생선이 들어올 때 그게 무엇인지 분류할 수 있겠죠.

 

 

 

 

 

그래서 도미를 1이라고 하고, 빙어를 0이라고 해서 

 

저 fish_data에 매칭되는 리스트를 정의해보겠습니다.

 

 

 

도미가 35마리, 빙어가 14마리 있었으니 다음과 같이 나타낼 수 있겠네요.

 

 

이제 모든 준비는 끝났습니다.

 

kn에게 이 데이터를 줘서 훈련시켜 봅시다.

 

 

fit은 kn 객체를 훈련시키는 함수이다.

 

 

끝입니다.

 

훈련은 이제 끝났습니다.

 

그러면 훈련이 잘 끝났는지 확인을 해야겠죠?

 

kn객체가 잘 훈련됐는지 확인하는 함수는 score입니다.

 

학습데이터를 그대로 넣어 얘가 잘 학습했는지 확인해봅시다.

 

 

 

이를 실행시키면 점수가 나옵니다.

 

 

0부터 1 사이의 숫자가 나오고, 

 

1이 나오면 모든 경우에 대해 완벽히 다 맞췄다는 뜻이고,

 

0.5가 나오면 절반만 맞췄다는 뜻이죠.

 

 

 

 

실행했더니??

 

 

무려 1.0, 즉 정확도 100%를 보여줍니다.

 

 

그렇다면 이제 아예 새로운 데이터를 넣어볼까요?

 


 

예를 들어, 

 

길이가 30cm이고 무게가 600g인 생선이 들어왔다고 해봅시다.

 

그래프 위에 점을 찍어보면, 다음과 같을 것입니다.

 

초록색 세모가 새로운 생선이다.

 

우리가 직관적으로 보기에, 이 생선은 도미일거 같죠?

 

우리는 왜 그렇게 생각했을까요?

 

 

 

여기에 k-최근접 알고리즘의 원리가 담겨있습니다.

 

 

쉽게 말하자면 다음과 같습니다.

 

 

 

k-최근접 알고리즘 :  가장 가까운 거리에 있는 점들이 무엇인지 보고 예측

 

 

 

 

즉, 저 초록색 세모 주변에는 파란색 점, 즉 도미가 많죠?

 

그래서 우리는 저 생선이 도미일 것이라고 예측하는 것입니다.

 

 

 

 

사이킷런의 k-최근접 알고리즘의 경우,

 

근처 5개의 점 중 어떤 종류가 더 많은지 관찰해 판단한다고 합니다.

 

예시의 경우 근처 5개의 점 모두가 도미이니, 출력값으로는 1이 나와야겠죠?

 

위에서 1이 도미, 0이 빙어라고 가정했으니깐요.

 

 

 

kn의 predict라는 함수를 이용하면 알 수 있습니다.

 

 

이를 실행했을 때 1이 출력된다면, 성공적인 거겠죠?

 

 

 

 

 

역시, 예상한대로 1을 출력하는 것을 확인할 수 있습니다.

 

 


 

 

우리는 이렇게 머신러닝에 대한 발걸음을 성공적으로 뗐습니다.

 

다음 챕터는 이 도미와 빙어 예시를 그대로 이어가면서,

 

조금 더 복잡한 예시를 다뤄보고자 합니다.