bskyvision RSS 태그 관리 글쓰기 방명록
2020-01-18 01:11:20
728x90

이번 시간에는 kNN을 이용해서 붓꽃의 품종을 예측하는 코드를 소개해드리도록 하겠습니다. kNN은 한국어로 k-최근접이웃으로 번역되기도 합니다. kNN의 작동원리는 매우 간단합니다. 새로운 데이터가 있는데 그 데이터의 클래스를 모른다면, 훈련 데이터셋에서 그 새로운 데이터와 가장 비슷하게 생긴 놈을 찾아서 걔랑 같은 유형이라고 라벨링해버리는 것입니다. kNN에 대한 이론적인 내용은 이전 포스팅을 참고해주세요.^^

 

유유상종의 진리를 이용한 분류 모델, kNN(k-Nearest Neighbors)  

 

오늘 예제 코드를 실행하기 위해서는 scikit-learn(사이킷런) 라이브러리와 NumPy 라이브러리가 필요합니다. 마찬가지로 각자 운영체제에 맞게 설치해주시면 됩니다.^^ 사이킷런은 안드레아스 뮐러라는 분이 주도해서 만든 머신러닝 라이브러리입니다. 꽤 쓸만하다고 합니다. 그리고 항상 느끼는 바이지만 역시 다운로드 및 설치는 리눅스가 윈도우에 비해 훨씬 편합니다.

 

붓꽃 품종에는 setosa, versicolor, virginica와 같은 세 개의 종이 있다고 합니다. 붓꽃의 꽃잎의 폭과 길이, 꽃받침의 폭과 길이를 측정한 것을 가지고 어느 붓꽃 품종에 속하는지를 예측하는 예제입니다. 간단히 말해서 4개의 특성(feature)과 3개의 클래스(class)가 있는 문제입니다.

 

150개의 샘플을 포함하고 있는 붓꽃 데이터셋에서 랜덤하게 선택한 75%를 훈련셋으로 나머지 25%를 테스트셋으로 해서 예측 정확도를 평가해보도록 하겠습니다. 

 

이것을 수행해주는 코드는 다음과 같습니다. 중요한 부분에는 한글로 주석을 달아놓았으니 참고하시기 바랍니다. 

import numpy as np

from sklearn.datasets import load_iris
iris_dataset = load_iris() # 붓꽃 데이터셋을 적재합니다. 

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)
# 데이터셋을 랜덤하게 75%의 훈련셋과 25%의 테스트셋으로 분리합니다.  

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1) 

knn.fit(X_train, y_train) # kNN 분류기를 훈련셋으로 훈련시킵니다. 

y_pred = knn.predict(X_test) # 테스트셋의 라벨값을 예측합니다. 

print("prediction accuracy: {:.2f}".format(np.mean(y_pred == y_test)))

 

이 코드를 실행하면, 다음과 같은 결과가 출력됩니다. 

 

 

예측 정확도가 0.97이라고 하니 꽤 높죠? 150개 중에 25%가 테스트셋이니까, 38개의 테스트셋의 클래스중 97%의 클래스를 맞췄다는 것입니다. 거의 한, 두 개 빼고는 다 제대로 예측해낸 것입니다. 

 

오늘은 kNN을 이용해서 붓꽃의 품종을 예측하는 문제에 대해 다뤄봤습니다. 사실 이 문제는 머신러닝 분야에서 아주 유명하고도 오래된 예제입니다. ㅎㅎ 

 

항상 질문과 지적은 환영합니다.^^ 담에 또 찾아뵙겠습니다! 

댓글

방문해주신 모든 분들을 환영합니다.

* 글을 읽던 중에 궁금했던 부분은 질문해주세요.

* 칭찬, 지적, 의문, 격려, 감사표현 등을 남겨주세요.

* 최대한 답변 드리도록 노력하겠습니다.

* 욕설과 광고를 담은 댓글은 가차없이 삭제합니다.


  1. 포지@2021.03.16 20:26 ~$ 국비 교육생인데 파이썬이 부족해서 복습하고자 왔습니다. 세이버매트릭스 머신러닝 관련 국비교육 프로젝트 진행중인데 파이썬 관련 기초부터 순서대로 정리 안되있어 불편한거 제외하고 정말 지식량이 정말 대단하십니다. [댓글주소]  [수정/삭제]  [답글작성]
    • BlogIcon bskyvision@2021.03.16 20:39 신고 ~$ [답글]: 세이버매트릭스도 국비교육이 있군요 ㅎㅎ 순서가 뒤죽박죽이죠 ㅜㅜ 그때마다 정리해야겠다 싶은 것을 올리다보니 그렇게 되었네요...ㅎㅎ 방문과 댓글 정말 감사드립니다!! [댓글주소]  [수정/삭제]
    • BlogIcon 포지@2021.03.16 20:52 ~$ [답글]: 아뇨 저희끼리 프로젝트인데 저희팀 주제가 사이버매트릭스 수치를 통해 머신러닝 시켜 좋은 선수 가려보자 입니다. ㅎㅎ [댓글주소]  [수정/삭제]
    • BlogIcon bskyvision@2021.03.16 20:54 신고 ~$ [답글]: 흥미롭군요 ㅎㅎ 지도학습 방법으로 하시려면, 선수의 능력을 나타내는 하나의 지표가 필요할 것 같은데 어떤 것을 라벨로 하실 생각이세요? 궁금해서 여쭤봅니다 ㅎㅎ [댓글주소]  [수정/삭제]
    • BlogIcon 포지@2021.03.16 21:53 ~$ [답글]: 기록상 MLB로 하고 싶었으나 팀원들이 한국으로 하자고 해서 꽤 애먹고 있습니다.
      투수는 BABIP,과 BINP 중 FIB, K/BB, HR/AB, 구종가치
      타자는 ops+, gpa, RC/27,wOBA, wRAA로 구분할까 합니다.
      기능 구현 메인이 되는 퓨처스 리그 같은 경우는 기록과 이닝, 타석수가 빈약해서 정말 구하기 힘들더군요.
      수비 지표는 퓨처스리그에 없다시피 해서 포기상태입니다. ㅎ
      그리고 성공한 선수 퓨처스 리그 기록을 바탕으로 지도시킬까 합니다.
      글을 적다 보니 퓨처스리그 투수는 볼넷율이 가장 낮은 선수, 타자는 삼진율이 가장 낮은 선수가 최고가 아닐까 하는 생각이 드네요. [댓글주소]  [수정/삭제]
    • BlogIcon bskyvision@2021.03.16 21:58 신고 ~$ [답글]: 그렇군요 ㅎㅎ KBO 데이터는 하나씩 찾아서 정리하시나요? 아니면 웹스크레이핑으로 얻으시나요? 아니면 따로 데이터베이스가 있으신가요??

      ops+, gpa, RC/27 등을 특성으로 사용하시겠다는 뜻인가요??

      궁금한게 많네요 ㅎㅎ [댓글주소]  [수정/삭제]
    • BlogIcon 포지@2021.03.16 22:06 ~$ [답글]: 사실 가장 좋은게 기준점 하나인 종합 defWAR, offWAR가 좋아 보이기는 하는데 기록이 많이 부실해서 언급한 지표 중 하나로할까 생각 중입니다. 언급한 지표로 한다면 데이터 처리자가 기준점을 어느정도 줘야하지 않을까 생각합니다.

      데이터는 크롤링을 하긴 하는데 실력이 미숙해 노가다랑 같이 하고 있습니다. ㅎ

      DB는 만드는게 편하긴 한데 할 수 있을지 모르겠네요 머리로 테이블 계산만 해봐도 수십개는 나올 수 있을것 같아서요. [댓글주소]  [수정/삭제]
    • BlogIcon bskyvision@2021.03.16 22:11 신고 ~$ [답글]: 그렇군요 ㅎㅎ 그런데 OPS를 지표로 삼는다면 그냥 OPS가 높은 선수가 좋은 선수가 되는거 아닌가요???ㅋㅋㅋ [댓글주소]  [수정/삭제]
    • BlogIcon 포지@2021.03.16 22:18 ~$ [답글]: 고민중입니다. 그걸 보완한 GPA가 있네요. 있는 데이터로 분석 시 순수 타격 능력만을 본다면 출루율에 가중치를 둔 GPA가 가장 의미있지 않을까 하는 생각을 하게 만드시네요. ㅎㅎ [댓글주소]  [수정/삭제]
    • BlogIcon bskyvision@2021.03.16 22:20 신고 ~$ [답글]: 근데 하나의 스탯으로 좋은 선수를 평가한다면, 좋은 선수/ 나쁜 선수 이런식으로 2진 분류하실 생각이신가요?? [댓글주소]  [수정/삭제]
    • BlogIcon 포지@2021.03.16 22:27 ~$ [답글]: 현재 할 수 있는게 회귀랑 2진 밖에 없어서, 퓨처스 리그 선수 중 1군으로 올릴만한 선수로 2진 분류 할 생각입니다. 그리고 데이터를 찾아보시면 타자는 클래식 스탯에 ops obp 정도밖에 없어서 방법이 없는 것 같습니다.

      이론 상 신경망 + 딥러닝 + DB이용하면 좀 더 확실한 결과가 나올것 같아 보이긴한데 해본적이 없어서 일단 기능 구현에 중심을 두고 있습니다. 실력도 안 되고요 ^^

      또 다른 기능으로는 외국인 선수 재개약 관련 2진 분류 해볼까 하는 아이디어가 있긴 합니다. ㅎ

      [댓글주소]  [수정/삭제]
    • BlogIcon bskyvision@2021.03.16 22:33 신고 ~$ [답글]: 아 1군으로 올릴 선수를 판단하려고 하시는 거군요. ㅎㅎ 제 생각엔 선수의 능력치를 나타내는 특성(feature)이 몇 개 있고, 1군콜업/2군잔류 이런식의 라벨이 있어야 머신러닝이 가능할 것 같은데... 어떻게 하실 계획인지 궁금하네요 ㅎㅎ [댓글주소]  [수정/삭제]
    • BlogIcon 포지@2021.03.16 22:37 ~$ [답글]: 그래서 학습시킬 현재 1군에 성공적으로 정착하고 있는 선수들의 퓨처스 리그 기록을 지도 시킬까 합니다. 일단 엑셀로 분류하면서 기준 점을 생각중이였는데 덕분에 타자는 해결되었네요. 스탯티즈에 2군 기록 15년도 까지 있는데 그걸로 지도 시킬까 생각 중입니다.
      개인 적으로 궁금한건 선수의 특성을 여러개 주면 그게 신경망 딥러닝인지요? [댓글주소]  [수정/삭제]
    • BlogIcon bskyvision@2021.03.16 22:42 신고 ~$ [답글]: 제 생각에는 1군에 성공적으로 정착한 선수들을 하나의 그룹으로 해서 라벨을 1을 주고, 1군에 갔지만 금방 2군으로 오게되었거나 계속 2군에 있었던 선수들의 그룹에 라벨 0을 주는 방식으로 해야할 것 같네요 ㅎㅎ 그리고 다양한 스탯을 특성으로 삼아주는 것이 좋을 것 같습니다.

      특성을 여러개 사용한다고 딥러닝이 되진 않습니다. ㅎㅎ 여러 층으로 구성된 네트워크를 훈련시켜야 딥러닝이 됩니다. 딥러닝이 아닌 기존의 머신러닝에도 많은 특성을 사용하는 것은 가능합니다.

      머신러닝 안에 딥러닝이 포함되는 개념이라고 보시면 되는데, 머신러닝 중에서 많은 층으로 구성되어 있는 것들을 따로 딥러닝이라고 부릅니다. [댓글주소]  [수정/삭제]
    • BlogIcon 포지@2021.03.16 22:48 ~$ [답글]: 네 생각하신 그것이 제가 생각하고 있는 train 데이터입니다. 저는 2진 분류 할려면 하나의 특성으로만 가능한줄 알았습니다. 또 하나 배우게 되네요. (어떻게 하는지는 모르겠지만요, 인터넷 찾아보던가 내일 선생님한테 물어보든가 해야겟네요 ㅋㅋ)

      그 다양한 스텟 중 GPA, WAR 처럼 이론적으로 일정량 이상 오버되면 확실히 좋은 지표라는 기준점이 있는 것으로 하면 좋아보입니다. ㅎㅎ
      [댓글주소]  [수정/삭제]
    • BlogIcon bskyvision@2021.03.16 22:53 신고 ~$ [답글]: 대개 좋은 특성은 많으면 많을 수록 좋습니다. ㅎㅎ 특성과 라벨을 잘 구분하시는게 필요할 것 같습니다. ㅎㅎ 특성은 타율, OPS, 타석당 홈런 비율 등 여러가지가 될 수 있고, 라벨은 1군 =1, 2군=0 이런식으로 되어야 할 것 같습니다.

      각 선수마다 특성과 라벨이 있어야, 선수들을 훈련셋과 테스트셋으로 나눠서 분류기를 훈련시킨 후 테스트셋으로 분류기의 성능을 평가해야 할 듯합니다. [댓글주소]  [수정/삭제]
    • BlogIcon 포지@2021.03.16 23:04 ~$ [답글]: 조언 감사합니다. 심심치 않게 구경하러 들리겠습니다. 야구를 워낙 좋아해서리 야구단 데이터 분석가도 재밌을 것 같다는 생각이 듭니다. ㅎ [댓글주소]  [수정/삭제]
    • BlogIcon bskyvision@2021.03.16 23:06 신고 ~$ [답글]: 저도 관심있는 주제라 간만에 길게 댓글로 이야기를 나눠봤네요 ㅎㅎ 제가 이야기한 것들은 참고만 해주세요 ㅎㅎ 더 나은 방법이 있을 수도 있으니 [댓글주소]  [수정/삭제]
guest@이름 ~$
guest@패스워드 ~$
guest@홈페이지주소작성 ~$

guest@댓글작성 ~$




bskyvision. Designed by bskyvision.