마켓과 머신러닝
- 도미와 빙어 데이터 준비하기
- 사이킷런 사용을 위해 2차원 리스트로 변경
- 데이터(fist_data)와 타겟 데이터(fish_target) 준비
- 학습(훈련)
- 평가
- 예측
- 참고 사이트 : 캐글 https://www.kaggle.com/
개발에 필요한 데이터들의 모임
1. 데이터 준비
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]
import matplotlib.pyplot as plt # matplotlib의 pyplot 함수를 plt로 줄여서 사용
plt.scatter(bream_length, bream_weight)
plt.xlabel("length") # x축은 길이
plt.ylabel("weight") # y축은 무게
plt.show()
이렇게 산점도 그래프가 일직선에 가까운 형태로 나타나는 경우를 선형적이라고 말한다.
matplotlib에서 2개의 산점도를 한 그래프로 그릴 때는 scatter( ) 함수를 사용한다.
친절하게 2개의 산점도를 색깔로 구분해 나타내준다.
plt.scatter(bream_length, bream_weight) # 도미
plt.scatter(smelt_length, smelt_weight) # 빙어
plt.xlabel("length") # x축은 길이
plt.ylabel("weight") # y축은 무게
plt.show()
도미와 빙어 두개의 데이터를 스스로 구분하기 위한 머신러닝을 만들기 위해
k-최근접 이웃 알고리즘을 사용할 것이다.
직선상에 가장 가까운 이웃의 개수로 학습하는 개념이다.
이 직선상에는 가로, 세로, 대각선 모두 포함이고,
이웃의 개수는 설정해줄 수도 있다.
# 도미와 빙어 리스트 합치기
length = bream_length + smelt_length
weight = bream_weight + smelt_weight
print(length)
print(weight)
두 리스트를 간단하게 합쳐보았다.
우리가 사용할 머신러닝 라이브러리는 사이킷런이다.
이 라이브러리를 사용하려면 리스트를 세로 방향으로 늘어뜨린
2차원 리스트를 만들어야한다는 조건이 있다.
2차원 리스트로 만들기 위해서는 리스트 내포 구문을 사용하기도 하지만
우리는 numpy를 사용해 간단하게 만들어보자.
주피터 노트북을 사용하기 때문에 라이브러리 설치 필요없이
import만으로 사용할 수 있다.
import numpy as np
# 목적 : 2차원 리스트로 만들기 -> 사이킷런이 2차원 리스트만 받음
# column_stack 컬럼을 만들어서 아래로 스택을 쌓음 (컬럼 - 가로, 스택 - 세로)
fish_data = np.column_stack((length, weight)) # tuple 넣어줘야함
print(fish_data) # 데이터
numpy의 column_stack을 사용하면
인자로 넣어준 리스트들을 짝지어서 컬럼을 만들고,
아래로 스택을 쌓으며 각각 자리에 맞는 애들끼리 짝지어준다.
column_stack은 tuple 타입을 넣어줘야한다.
이제 필요한 것은 정답 데이터이다.
어떤 생선이 도미인지 빙어인지를 알려주어야 머신러닝으로 학습할 수 있기 때문이다.
컴퓨터는 문자를 이해하지 못하기 때문에
도미이면 1, 빙어면 0으로 표현해보자.
fish_target = [1]*35 + [0]*14 # 타겟 데이터 = 정답 데이터
print(fish_target)
2. 학습
이제 머신러닝 알고리즘을 선정하여 학습시킬 것이다.
알고리즘을 선정할 때는 다음과 같은 과정을 거친다.
데이터의 특성을 파악
→ 어떤 모델로 학습시킬 것인가?
→ 거기에 맞게 데이터를 변형 (데이터 전처리)
→ 모델 선택 (=KNeighborsClassifier)
우리는 사이킷런 라이브러리에서 최근접 이웃 알고리즘을 선정할것이다.
사이킷런의 알고리즘 1. 분류 classifier 2. 회기 regressor 3. 변형 transformer
준비한 데이터와 정답 데이터를 답아서 fit( ) 메서드에 넣어주면 훈련을 시작한다.
모델에 데이터를 전달하여 학습시키는 것이다.
from sklearn.neighbors import KNeighborsClassifier
# 기본값 = 5 (5개의 이웃을 찾음)
# 기본값 설정 가능 kb = KNeighborsClassifier(n_neighbors = 5)
kn = KNeighborsClassifier() # 클래스 new
kn.fit(fish_data, fish_target) # x = 준비한 데이터, y = 정답
3. 평가
얼마나 잘 훈련되었는지 평가하기 위해 score( ) 메서드를 사용한다.
kn.score(fish_data, fish_target) # 1.0 = 100%
1.0은 정확도가 100%라는 말이다.
언뜻 보기엔 학습이 잘 된것 같지만,
사실 학습한 데이터와 같은 데이터로 평가했기 때문에 정확도가 100%일 수 밖에 없다.
이는 실패한 평가라고 볼 수 있다.
새로운 데이터로 평가해야한다.
보통 1~100번 데이터가 있을 때 1~80번 데이터로 학습하고, 81~100번 데이터로 평가한다.
훈련 데이터와 테스트 데이터를 따로 만들어야 하는 것이다.
이를 크로스 밸리데이션이라고 한다.
4. 예측
평가가 끝났으니 예측을 해보자.
# array([1]) = 도미
# array([0]) = 빙어
kn.predict([[30, 600]]) # 2차원 리스트 데이터를 넣어줘야함
kn.predict([[13, 50]])
# 예측은 성공, 평가가 잘못된 것!!
성공!
[출처]