01-3 마켓과 머신러닝(K-Nearest Neighbors)(최근접이웃)
가장 간단한 머신러닝 알고리즘 중 하나인 k-최근접 이웃(K-Nearest Neighbors)을 사용하여 2개의 종류를 분류하는 머신러닝 모델 훈련하기!
생선을 파는 마켓의 생선 이름을 자동으로 알려주는 머신러닝 만들기
생선 분류 문제
'도미', '빙어' 분류하기 ! 이 문제를 머신러닝으로 해결하기
생선 데이터셋의 출처 : https://www.kaggle.com/datasets
캐글은 2010년에 설립된 전 세계에서 가장 큰 머신러닝 경연 대회 사이트.
대회 정보 뿐만 아니라 많은 데이터와 참고자료를 제공
머신러닝은 스스로 기준을 찾아서 일을 한다.
보통 프로그램은 '누군가 정해준 기준대로 일'을 한다.
반대로 머신러닝은 누구도 알려주지 않는 기준을 찾아서 일을 한다.
즉, 누가 말해 주지 않아도 머신러닝은 "30cm ~ 40cm 길이의 생선은 도미이다"와 같은 기준을 찾는다.
머신러닝은 기준을 찾을 뿐만 아니라 이 기준을 이용해 생선이 도미인지 아닌지 판별할 수도 있음!
도미 데이터 준비하기
머신러닝은 여러 개의 도미 생선을 보면 스스로 어떤 생선이 도미인지 구분할 기준을 찾는다.
이진 분류란?
머신러닝에서 여러 개의 종류(혹은 클래스(class)) 중 하나를 구별해 내는 문제를 분류(classification)라고 한다.
특히, 본문에서처럼 2개의 클래스 중 하나를 고르는 문제는 이진 분류(binary classification)라고 한다.
코랩 에서 새 노트 하나 추가! 노트 제목은 'BreamAndSmelt'
그리고 도미의 길이와 무게를 파이썬 리스트로 만들어준다.
리스트에서 첫 번째 도미의 길이는 25.4cm, 무게는 242.0g이고 두 번째 도미의 길이는 26.3cm, 무게는 290.0g이다.
각 도미의 특징을 길이와 무게로 표현한 것. 이런 특징을 특성(feature)이라고 한다.
특성은 데이터의 특징!
두 특성을 숫자로 보는 것보다 그래프로 표현하면 데이터를 한눈에 이해할 수 있고, 앞으로 작업에 대한 힌트도 얻을 수 있다.
길이를 x축, 무게를 y축으로 설정하여 산점도(scatter plot)을 그려보자!
산점도는 x, y축으로 이루어진 좌표계에서 두 변수(x, y)의 관계를 표현하는 방법이다.
파이썬에서 과학 계산용 그래프를 그리는 대표적인 패키지는 matplotlib
이 패키지를 import하고 산점도를 그리는 scatter()함수 사용해보기!
import란 따로 만들어둔 파이썬 패키지(함수 묶음)를 사용하기 위해 불러오는 명령
코랩에서의 패키지와 as
패키지는 기능을 구현한 함수를 특정 기능별로 묶어둔 것.
보통은 이런 패키지를 따로 설치해야하지만, 코랩에서는 그럴 필요가 없음!
코랩은 널리 사용되는 파이썬 과학 패키지를 미리 준비해놓았기 때문에 바로 사용 가능
파이썬 프로그래머들은 패키지를 import할때 as 키워드로 패키지 이름을 줄여서 쓰는 것을 좋아함
ex) matplotlib의 pyplot 함수 --> plt
x축은 길이, y축은 무게 이렇게 두개의 특성을 사용하여 그린 그래프 --> 2차원 그래프 !
위 그림 처럼 산점도 그래프가 일직선에 가까운 형태로 나타나는 경우를 선형(linear)적이라고 말한다.
빙어 데이터 준비하기
도미와 빙어 데이터를 함께 산점도로 그려보기
2개의 산점도를 색깔로 구분해서 나타냄!
빙어는 길이가 늘어나도 무게가 많이 늘지않음. --> 선형적이지만 무게가 길이에 영향을 덜 받음
두 데이터를 스스로 구분하기 위한 첫번째 머신러닝 프로그램
가장 간단하고 이해하기 쉬운 K-최근접 이웃(K-Nearest Neighbors) 알고리즘을 사용하여 도미와 빙어 데이터를 구분해볼것다.
알고리즘을 사용하기 전에 앞서 준비했던 도미와 빙어 데이터를 하나의 데이터로 합치기!
사이킷런은 머신러닝 패키지이며 2차원 리스트가 필요하다.
2차원 리스트 만들기
파이썬의 zip()함수와 리스트 내포(list comprehension) 구문 사용하기
zip() : 나열된 리스트 각각에서 하나씩 원소를 꺼내 반환
for문을 zip() 함수를 이용하여 length와 weight 리스트에서 원소를 하나씩 꺼내어 l과 w에 할당한다.
그러면 [l, w]가 하나의 원소로 구성된 리스트가 만들어짐 !
생선의 길이와 무게가 하나의 리스트를 구성, 이런 리스트가 모여 전체 리스트를 만든다.
이런 리스트를 2차원 리스트 혹은 리스트의 리스트라고 한다.
마지막으로 준비할 데이터는 정답데이터
첫번째 생선은 도미이고, 두번째 생선도 도미라는 식으로 각각 어떤 생선인지 답을 만드는 것
왜 이런 작업이 필요할까?
머신러닝 알고리즘이 생선의 길이와 무게를 보고 도미와 빙어를 구분하는 규칙을 찾기 원한다.
그렇게 하려면 적어도 어떤 생선이 도미인지 빙어지 알려주어야함!
도미와 빙어를 숫자 1과 0으로 표현
ex) 첫 번째 생선 : 도미(1), 마지막 생선 : 빙어(0)
(도미와 빙어를 순서대로 나열했기 때문에 정답 리스트는 1이 35번(도미), 0이 14번(빙어) 등장)
머신러닝에서 2개를 구분하는 경우, 찾으려는 대상을 1로, 그 외에는 0으로 놓는다.
사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현한 클래스인 KNeighborsClassifier를 import
import한 KNeightborsClassifier 클래스의 객체를 만든다.
이 객체에 fish_data와 fish_target을 전달하여 도미를 찾기 위한 기준을 학습시킨다.
이런 과정을 머신러닝에서는 훈련(training)이라고 부른다.
사이킷런에서는 fit() 메서드가 이런 역할을 한다.
모델에 데이터를 전달하여 규칙을 학습하는 과정을 훈련이라고 함
fit() 메서드에 fish_data와 fish_target을 순서대로 전달해보자 !
fit() 메서드는 주어진 데이터로 알고리즘을 훈련시킴
이제 객체 kn이 얼마나 잘 훈련되었는지 평가해보자.
사이킷런에서 모델을 평가하는 메서드는 score()메서드. --> 0 ~ 1 값을 반환
1 : 모든 데이터 correct
0.5 : 절반만 correct
1.0 : 모든 fish_data의 답을 맞힌 것; 정확도(accuracy) 💯 !
즉, 이 모델은 도미와 빙어를 완벽하게 분류했음
k-최근접 아웃 알고리즘
: 어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용한다.
마치 근묵자흑과 같이 주위의 데이터로 현재 데이터를 판단하는 것
삼각형 주변에 다른 도미 데이터가 많이 때문에 위의 삼각형을 직관적으로 도미라고 판단할 것
k-최근접 이웃 알고리즘도 마찬가지로 위의 삼각형을 도미라고 판단할 것 !
predict() 메서드는 새로운 데이터의 정답을 예측한다.
이 메서드도 앞서 fit() 메서드와 마찬가지로 리스트의 리스트를 전달해야한다.
그래서 삼각형 포인트를 리스트로 2번 감싼 것 !
k-최근접 이웃 알고리즘을 위해 준비해야 할 일은 데이터를 모두 가지고 있는 게 전부.
새로운 데이터에 대해 예측할 때는 가장 가까운 직선거리에 어떤 데이터가 있는지를 살피기만 하면 됨.
단점은 k-최근접 이웃 알고리즘의 이런 특징 때문에 데이터가 아주 많은 경우 사용하기 어려움.
데이터가 크기 때문에 메모리가 많이 필요하고 직선 거리를 계산하는데도 많은 시간이 필요하다.
실제로 k-최근접 이웃 알고리즘은 무언가 훈련되는 게 없는 셈
fit() 메서드에 전달한 데이터를 모두 저장하고 있다가 새로운 데이터가 등장하면 가장 가까운 데이터를 참고하여 도미인지 빙어이지 구분
KNeighborsClassifier 클래스의 기본값은 5
이 기준은 n_neighbors 매개변수로 바꿀 수 있음
가장 가까운 데이터 49개를 사용하는 k-최근접 이웃 모델에 fish_data를 적용하면 fish_data에 있는 모든 생선을 사용하여 예측하게 됨
다시 말하면 fish_data의 데이터 49개 중에 도미가 35개로 다수를 차지하므로 어떤 데이터를 넣어도 무조건 도미로 예측할 것
kn49 모델은 도미만 올바르게 맞히기 때문에 정확도를 계산하면 print(35/49) 값은 score() 메서드와 같은 값을 얻을 수 있음
도미와 빙어 분류 정리
- 도미 35마리와 빙어 14마리의 길이와 무게를 측정해서 파이썬 리스트로 생성
- 도미와 빙어 데이터를 합쳐 리스트의 리스트로 데이터를 준비
- 사이킷런의 k-최근접 이웃 알고리즘은 주변에서 가장 가까운 5개의 데이터를 보고 다수결의 원칙에 따라 데이터를 예측
- 해당 모델은 준비된 도미와 빙어 데이터를 모두 완벽하게 맞혔음
- 분류 문제를 풀면서 KNeighborsClassifier 클래스의 fit(), score(), predict() 메서드를 사용
- k-최근접 이웃 알고리즘의 특징을 알아보았음