이 글은 기존 Tistory 블로그에서 옮겨온 글입니다. 원문: https://jms3084.tistory.com/21
생선들의 데이터 분류 방법
일단 생선의 특징을 알아야 합니다. = 길이, 무게등등
찾고자 하는 생선의 데이터(길이, 무게)를 리스트로 준비합니다.
머신러닝에서 여러개의 종류(클래스) 중 하나를 구별해 내는 문제를 분류(classification)이라고 부릅니다.
2개의 클래스중 하나를 고르는 문제는 이진 분류(binary classification)라고 합니다.
각 도미의 특징을 길이와 무게로 표현한 것을 특성(feature)라고 합니다.
두 특성을 그래프로 표현하면 데이터 이해가 쉽고 앞으로 할 작업에 대한 힌트를 얻을 수 있습니다.
파이썬에서 과학계산용 그래프를 그리는 대표적인 패키지는 matplotlib입니다.
plt.scatter()는 x, y축을 나눠 점으로 산점도를 그릴 때 필요한 함수입니다.
plt.xlabel(), plt.ylabel()은 x축, y축의 타이틀을 정해주는 함수입니다.
plt.show() 그래프로 시각화하는 함수입니다.
아래 코드를 보면 이해가 쉽습니다.
import matplotlib.pyplot as plt
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]
plt.scatter(bream_length, bream_weight)
plt.xlabel(‘length’)
plt.ylabel(‘weight’)
plt.show()

위 그래프는 도미의 2개의 특성(길이, 무게)을 사용해 그린 그래프이기 때문에 2차원 그래프라고 합니다.
일반적으로 생선의 길이가 길수록 무게가 많이 나가므로 현재 그래프의 모습은 매우 자연스럽습니다.
이렇게 자연스러운, 일직선에 가까운 형태로 나타나는 경우를 선형적이라고 말합니다.
빙어의 데이터도 입력하고 그래프로 출력시
import matplotlib.pyplot as plt
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]
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()

두 생선의 특성을 모두 합쳐 2차원 리스트를 만드는 코드
length = bream_length + smelt_length
weight = bream_weight + smelt_weight
fish_data = [[l, w]for l, w in zip(length, weight)]
마지막으로 준비할 데이터는 정답 데이터입니다.
첫번째 생선은 도미이고 마지막 생선은 빙어인지 1과 0으로 알려주어야 합니다.
도미를 1, 빙어를 0으로 두겠습니다.
도미가 35마리, 빙어가 14마리이므로 1이 35번, 0이 14번 있는 데이터가 정답 데이터입니다.
이제 사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현한 클래스인 KNeighborsClassifier(기본값은 5)를 임포트합니다.
KNeighborsClassifier 객체를 생성합니다.
이 객체에 fish_data와 fish_target를 전달하여 도미를 찾기 위한 기준을 학습시킵니다.
이러한 과정을 머신러닝에서는 훈련(training)이라고 부릅니다. = 사이킷런에서는 fit()함수가 이런 역할을 합니다.
kn.fit(fish_data, fish_target)
머신러닝 알고리즘을 구현한 프로그램을 모델(model)이라고 부릅니다.
프로그램이 아니더라도 알고리즘을 구체화하여 표현한것도 모델이라고 부릅니다
사이킷런에서 모델을 평가하는 함수는 score()입니다.
0~1 사이의 값을 반환하고 다 맞출 경우 1을 반환합니다.
반환된 값을 정확도라고 합니다.
정확도 = (맞힌 개수) / (전체 데이터 개수)
k-최근접 이웃 알고리즘은 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수의 데이터가 해당하는 값을 정답으로 사용합니다.
데이터가 크기 때문에 메모리가 많이 사용되고 직선거리를 계산하는데 많은 시간이 소요됩니다.
이러한 특성 때문에 데이터가 많을 경우 해당 알고리즘을 사용하기 어렵습니다.
KNeighborsClassifier(기본값은 5)이 기본값을 KNeighborsClassifier(n_neighbor=n) 을 사용해서 변경 가능합니다.
Copyright 2021. 박해선 All rights reserved.