도미 데이터 준비하기
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]
도미의 특징을 길이와 무게로 표현한다. 이런 특징을 feature라고 한다.
다음으로 각 도미를 그래프에 점으로 표현해보면 다음과 같은 그래프가 나온다.
import matplotlib.pyplot as plt
plt.scatter(bream_length, bream_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
빙어 데이터 준비하기
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(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
첫 번째 머신러닝 프로그램
K-Nearest Neighbors 알고리즘을 사용해서 도미와 빙어 데이터를 구분하겠다.
알고리즘을 사용하기 전에 앞에서 준비했던 데이터를 하나로 합쳐보겠다.
length = bream_length + smelt_length
weight = bream_weight + smelt_weight
머신러닝 패키지 scikit-learn을 사용하려면 각 특성의 리스트를 2차원 리스트로 바꿔줘야 한다.
fish_data = [[l,w] for l,w in zip(length, weight)]
print(fish_data)
>>> [[25.4, 242.0], [26.3, 290.0], [26.5, 340.0], [29.0, 363.0], [29.0, 430.0], [29.7, 450.0], [29.7, 500.0],
[30.0, 390.0], [30.0, 450.0], [30.7, 500.0], [31.0, 475.0], [31.0, 500.0], [31.5, 500.0], [32.0, 340.0], [32.0, 600.0],
[32.0, 600.0], [33.0, 700.0], [33.0, 700.0], [33.5, 610.0], [33.5, 650.0], [34.0, 575.0], [34.0, 685.0], [34.5, 620.0],
[35.0, 680.0], [35.0, 700.0], [35.0, 725.0], [35.0, 720.0], [36.0, 714.0], [36.0, 850.0], [37.0, 1000.0], [38.5, 920.0],
[38.5, 955.0], [39.5, 925.0], [41.0, 975.0], [41.0, 950.0], [9.8, 6.7], [10.5, 7.5], [10.6, 7.0], [11.0, 9.7], [11.2, 9.8],
[11.3, 8.7], [11.8, 10.0], [11.8, 9.9], [12.0, 9.8], [12.2, 12.2], [12.4, 13.4], [13.0, 12.2], [14.3, 19.7], [15.0, 19.9]]
마지막으로 준비할 데이터는 Train set이다.
머신러닝은 생선의 길이와 무게만 보고 도미와 빙어를 구분하는 규칙을 찾기를 원한다.
그러려면 어떤 생선이 도미이고 빙어인지 알려줘야한다.
fish_target = [1] * 35 + [0] * 14
print(fish_target)
>>> [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
이제 사이킷런 패키지에서 K-Nearest Neighbors 알고리즘을 구현한 클래스인 KNeighborsClassifier를 임포트한다.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
이제 fish_data와 fish_target을 전달해서 도미를 찾기 위한 기준을 학습시킨다. 이러한 과정을 training이라고 부른다.
kn.fit(fish_data, fish_target)
fit() 메서드는 주어진 데이터로 알고리즘을 훈련한다. 이제 객체 kn이 얼마나 잘 훈련됐는지 평가해보겠다.
kn.score(fish_data, fish_target)
>>> 1.0
정확도가 1이 나온 것으로 보아 이 모델은 도미와 빙어를 완벽하게 분류했다는 걸 알 수 있다.
K-Nearest Neighbors
k-Nearest Neighbors 알고리즘에 대해 자세히 알아보겠다.
이 알고리즘은 어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용한다.
즉, 주위의 데이터로 현재 데이터를 판단하는 것이다.
kn.predict([[30,600]])
>>> array([1])
predict() 메서드는 새로운 데이터의 정답을 예측한다.
[[30,600]] 데이터 주변에 다른 도미 데이터가 많이 관찰 됐기 때문에 도미라고 판단한 것이다.
우리가 이 알고리즘을 사용하려면 데이터를 모두 가지고 있는게 전부이다.
새로운 데이터를 예측할 때는 가장 가까운 직선 거리에 어떤 데이터가 있는지 보기만 하면 되기 때문이다.
이러한 특징 때문에 데이터가 아주 많은 경우에는 사용이 어렵다.
print(kn._fit_X)
>>> [[ 25.4 242. ]
[ 26.3 290. ]
[ 26.5 340. ]
...
[ 13. 12.2]
[ 14.3 19.7]
[ 15. 19.9]]
print(kn._y)
>>> [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0]
이 클래스는 _fit_X 속성에 우리가 전달한 fish_data를 모두 가지고 있다. _y 속성도 마찬가지이다.
이러면 실제로 이 알고리즘은 무언가 훈련된게 없는 셈이다.
그럼 이 알고리즘은 가까운 몇 개의 데이터를 참고할까? KNeighborsClassifier 클래스의 기본값은 5이다. 49로 바꾸면 어떻게 될까?
kn49 = KNeighborsClassifier(n_neighbors=49)
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
>>> 0.7142857142857143
print(35/49)
>>> 0.7142857142857143
fish_data에 있는 생선 중에 도미가 35개이고 빙어가 14개이다.
kn49 모델은 도미만 올바르게 맞히고 있는 것이다.
기본값 5로 하여 도미를 완벽하게 분류한 모델을 사용하는 것이 옳다.
'Major Study > 25-1 Machine Learning' 카테고리의 다른 글
[Machine Learning] chapter5 - 트리 알고리즘 (0) | 2025.05.14 |
---|---|
[Machine Learning] chapter4 - 로지스틱 회귀 (0) | 2025.04.30 |
[Machine Learning] chapter3 - 회귀 알고리즘과 모델 규제 (0) | 2025.04.11 |
[Machine Learning] chapter 2 - 데이터 다루기 (0) | 2025.04.01 |