머신러닝- 혼공머
chapter1- 도미와 빙어 비교 분석
막막한
2023. 3. 18. 16:11
In [2]:
#도미 데이터
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]
In [5]:
import matplotlib.pyplot as plt
plt.scatter(bream_length, bream_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
In [6]:
# 빙어 데이터
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]
In [7]:
#빙어랑 도미랑
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('lenght')
plt.ylabel('weight')
plt.show()
k-최근접 이웃 알고리즘 이용해 도미와 빙어 데이터 구분¶
In [9]:
# 두 리스트를 더해 하나의 리스트로 만들기
length=bream_length + smelt_length
weight=bream_weight + smelt_weight
In [10]:
# zip함수는 나열된 리스트 각각에서 하나씩 원소 꺼내 반환
# for는 zip처럼 하나씩 꺼낸 데이터에 동일한 작업을 반복하는 것
fish_data=[[l,w] for l, w in zip(length, weight)]
In [11]:
fish_data
Out[11]:
[[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]]
In [14]:
# 2차원 리스트 만들었다
# 곱셈 연산자 사용해 파이썬 리스트 간단히 반복
fish_target=[1]*35 +[0]*14 # 도미 1 빙어 0
fish_target
Out[14]:
[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]
In [15]:
from sklearn.neighbors import KNeighborsClassifier
#임포트한 kn ~ 클래스의 객체 만든다
kn=KNeighborsClassifier()
#fit 메서드는 주어진 데이터로 알고리즘 훈련
kn.fit(fish_data, fish_target)
Out[15]:
KNeighborsClassifier()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
KNeighborsClassifier()
In [16]:
#score()메서드는 모델평가, 0~1의 값 반환 / 1은 모든 데이터 정확히 맞혔다
kn.score(fish_data, fish_target)
Out[16]:
1.0
In [17]:
#k 최근접 이웃 알고리즘은 어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터 보고 다수를 차지하는 것을 정답으로 사용
kn.predict([[30,600]])
Out[17]:
array([1])
In [18]:
# predict 메서드는 새로운 데이터 정답 예측 1은 도미이므로 도미임을 추측할 수 있다
In [19]:
kn._fit_X
Out[19]:
array([[ 25.4, 242. ], [ 26.3, 290. ], [ 26.5, 340. ], [ 29. , 363. ], [ 29. , 430. ], [ 29.7, 450. ], [ 29.7, 500. ], [ 30. , 390. ], [ 30. , 450. ], [ 30.7, 500. ], [ 31. , 475. ], [ 31. , 500. ], [ 31.5, 500. ], [ 32. , 340. ], [ 32. , 600. ], [ 32. , 600. ], [ 33. , 700. ], [ 33. , 700. ], [ 33.5, 610. ], [ 33.5, 650. ], [ 34. , 575. ], [ 34. , 685. ], [ 34.5, 620. ], [ 35. , 680. ], [ 35. , 700. ], [ 35. , 725. ], [ 35. , 720. ], [ 36. , 714. ], [ 36. , 850. ], [ 37. , 1000. ], [ 38.5, 920. ], [ 38.5, 955. ], [ 39.5, 925. ], [ 41. , 975. ], [ 41. , 950. ], [ 9.8, 6.7], [ 10.5, 7.5], [ 10.6, 7. ], [ 11. , 9.7], [ 11.2, 9.8], [ 11.3, 8.7], [ 11.8, 10. ], [ 11.8, 9.9], [ 12. , 9.8], [ 12.2, 12.2], [ 12.4, 13.4], [ 13. , 12.2], [ 14.3, 19.7], [ 15. , 19.9]])
In [20]:
kn._y
Out[20]:
array([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])
In [23]:
kn49=KNeighborsClassifier(n_neighbors=49) #참고데이터를 49개로 한 kn49모델
In [24]:
kn49.fit(fish_data,fish_target)
kn49.score(fish_data, fish_target)
Out[24]:
0.7142857142857143
In [25]:
# 도미 35개 빙어 14개
print(35/49)
0.7142857142857143
마무리¶
특성: 데이터 표현하는 하나의 성질
훈련: 머신러닝 알고리즘이 데이터에서 규칙을 찾는 과정/
사이킷런에서 fit()메서드가 하는 역할
k-최근접 이웃 알고리즘: 규칙을 찾기보다 전체 데이터를 메모리에 가지고 있는 것
모델: 머신러닝 프로그램에서 알고리즘이 구현된 객체
정확도: 사이킷런에서 0~1사이의 값으로 출력
정확도=(정확히 맞힌 갯수) / (전체 데이터 개수)
<핵심 패키지와 함수>
matplotlib
-scatter()는 산점도 그리는 함수
scikit-learn
-KNeightborsClassfier()는 k최근접 이웃 분류 모델을 만드는 사이킷런 클래스
n_neighbors매개변수로 이웃의 개수 지정, 기본값은 5
-fit() 사이킷런 모델 훈련할 때 사용하는 메서드 : 처음 두 매개변수로 훈련에 사용할 특성과 정답 데이터 전달
-predict() 사이킷런 모델 훈련하고 예측할 때 사용하는 메서드: 특정 데이터 하나만 매개변수로 받는다
-score() 훈련된 사이킷런 모델의 성능 측정: 처음 두 매개변수로 특성과 정답 데이터 전달
스코어 메서드는 먼저 predict()메서드로 예측하고 분류 모델일 경우 정답과 비교해 올바르게 예측한 개수 비율 반환
In [ ]: