2021. 5. 27. 22:00ㆍICT 멘토링/혼자 공부하는 머신러닝+딥러닝
4강 - 훈련 세트와 테스트 세트로 나누어 사용하기

지난 시간 복습

완벽한 보고서
도미와 빙어를 완벽하게 맞췄다고 하지만 의문점이 남음.
단순히 훈련 데이터를 저장해서 그 데이터 그대로 테스트하는 거면 누구라도 다 맞출 수 있는 것 아닌가?
연습문제와 동일한 시험문제 출제 시 답만 외우면 되는 경우와 유사
올바른 평가가 아니라는 의문점.
테스트용 데이터 따로 만들어야 함.
지도 학습과 비지도 학습

타깃 데이터가 없고 입력만 있을 때는 특성의 개수를 줄이거나 비슷한 샘플을 모아 작업 수행 가능.
이럴 때 사용하는 것이 비지도 학습
강화학습 - 모델이 행동 수행한 뒤에 피드백을 받아 계속 강화해 나가는 것. 알파고
지도하기 때문에 타깃 데이터가 필요하고 훈련 후 평가 시에는 다른 데이터가 필요함.
훈련 세트와 테스트 세트
별도의 테스트 세트를 구하면 좋겠지만 데이터는 한정적임.
따라서 전체에서 일부를 덜어내서 훈련 세트와 테스트 세트로 나눔.
train_input = fish_data[:35]
train_input = fish_target[:35]
test_input = fish_data[35:]
test_input = fish_target[35:]
처음 35개를 훈련 세트, 뒤의 14개를 테스트 세트로 둠.
[:] - 슬라이싱
a = [5,6,7,8]
a[1:3] 인덱스가 1,2인 6,7이 선택됨.
처음부터면 0을 굳이 안 써도 되고, 마지막까지면 뒤의 슬라이싱 숫자를 안 써도 됨.
테스트 세트에서 평가하기
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)
# 0.0
fit 메소드에 훈련 세트를 넣고 score 메소드에 테스트 세트를 넣으면 훈련과 테스트의 데이터를 달리 할 수 있음.
결과를 보니 0.0으로 정확도가 0임.
샘플링 편향

그 이유는 35개까지 도미, 이후는 빙어인데, 훈련 세트는 도미로만 테스트 세트는 빙어로만 이뤄짐.
도미로만 학습한 뒤에 빙어로 테스트하니까 정확도가 0이 됨.
따라서 올바른 훈련 데이터를 만들기 위해서는 훈련 세트와 테스트 세트에 모든 클래스가 잘 섞여 있어야 함.
넘파이 사용하기
import numpy as np
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
print(input_arr)
사이킷런의 predict 메소드는 입력값과 반환값이 넘파이 배열임.
이 외에도 많은 라이브러리에서 넘파이를 사용하여 넘파이를 사용이 불가피 함.
array([1]) - 넘파이 배열
넘파이 배열로 바꾸는 방법 np.array()
+)배열과 텐서 혼용함.
데이터 섞기

index = np.arange(49)
np.random.shuffle(index)
##
train_input = input_arr[index[:35]]
train_target = traget_arr[index[:35]]
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]
섞어서 나누는 것에 주의할 점!
입력과 타깃이 쌍을 이루는 데 쌍을 잘 따라서 섞이게 해야 함.
index를 만들어 랜덤하게 섞으면 됨.
index[] - 인덱스 배열
배열 슬라이싱 - 인덱스가 담긴 배열을 넣어 원소 선택.
훈련 세트는 랜덤하게 섞인 0~34 인덱스 요소
테스트 세트는 랜덤하게 섞인 35~49 인덱스 요소
데이터 나누고 확인하기
import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(test_input[:,0], test_input[:,1])
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

행, 열 구분
행은 전체 선택, 열은 지정
훈련 세트와 테스트 세트가 잘 섞여 있는 것을 볼 수 있음.
배열 슬라이싱에서 앞에 요소는 행 선택, 뒤의 요소는 열 선택.
여기서 열은 길이, 무게인데 0은 x인 length, 1인 y인 weight 의미.
행은 섞여있는 샘플들 전체 의미.
두 번째 머신러닝 프로그램
kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)
# 1.0
데이터를 잘 섞고나서 훈련하니 정확도가 100%가 됨.
똑같은 모델 사용하면 안 되는 이유.
훈련 세트와 테스트 세트에 한 종류의 샘플이 너무 많이 들어가 있거나 편중되어 있지 않도록 해야 함.
+)파이썬의 넘파이 패키지
쌍을 이뤄 섞어야 하므로 배열 자체를 섞는 게 아니라 인덱스 배열 섞어서 섞인 인덱스를 가지고 훈련 세트와 테스트 세트로 나눔.
참고 자료
https://www.youtube.com/watch?v=o9kGDpZbmx0&list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX&index=4
'ICT 멘토링 > 혼자 공부하는 머신러닝+딥러닝' 카테고리의 다른 글
6강 - 회귀 문제를 이해하고 k-최근접 이웃 알고리즘으로 풀어 보기 (0) | 2021.06.17 |
---|---|
5강 - 정교한 결과 도출을 위한 데이터 전처리 알아보기 (0) | 2021.06.17 |
3강 - 마켓과 머신러닝 (0) | 2021.05.27 |
2강 - 코랩과 주피터 노트북으로 손코딩 준비하기 (0) | 2021.05.27 |
1강 - 인공지능, 머신러닝 그리고 딥러닝이란 무엇인가? (0) | 2021.05.27 |