혼자 공부하는 머신러닝 + 딥러닝의 Chapter 2를 공부하면서 정리한 내용을 기반으로 작성하였다.
이번 장에서는 책 순서와 달리, 개념과 실습을 구분해서 정리하였다.
02-1. 훈련 세트와 테스트 세트
지도학습과 비지도 학습
머신러닝 알고리즘은 supervised learning(지도 학습)과 unsupervised learning(비지도 학습)으로 나눌 수 있다.
추가적으로 강화학습으로도 함께 분류될 수 있다
지도 학습 | 1. 훈련 데이터가 필요하다 여기서 훈련 데이터란 입력(특성, 데이터), 타깃(정답)을 포함한다 2. 타깃(정답)이 있기 때문에 알고리즘은 정답을 맞히는 것을 학습한다 |
비지도 학습 | 1. 타깃(정답) 없이 입력 데이터만 사용한다. → 입력 데이터만 있을 대 비지도 학습 알고리즘을 사용한다 2. 정답을 맞힐 수는 없고, 데이터 파악/변형에 도움을 준다 |
강화학습 |
1. reinforcement learning 2. 타깃이 아니라 알고리즘이 행동한 결과로 얻은 보상을 사용해 학습한다 |
훈련 세트와 테스트 세트
Chapter 1 에서 배운 머신러닝 방법에 문제가 있다. "훈련데이터를 가지고 평가에 사용했다는 것이다".
시험문제와 정답을 미리 알려주고 시험을 본다면 답만 외우면 되기 때문에 100점이 나올 것이다. 이런 식의 평가는 도움이 되지 않기 때문에, 연습문제와 시험문제가 달라야 한다.
그렇기 때문에, 머신러닝 알고리즘의 성능 평가하려면, 훈련 데이터와 평가를 위한 데이터는 달라야한다. 여기서 훈련에서 사용되는 데이터는 훈련 세트(train set), 평가에 사용되는 데이터는 테스트 세트(test set)라고 한다.
→ 훈련 세트와 테스트 세트를 다르게 준비하는 방법은 다음과 같이 2가지로 나눌 수 있다.
- 평가하기 위해 또 다른 데이터를 준비한다.
- 이미 준비된 데이터 중에서 일부를 떼어 활용한다.
샘플링 편향
훈련 세트와 테스트 세트에서 조심해야 할 점이 있다. 바로 '샘플링 편향'이다.
샘플링 편향(sampling bias)이란, 샘플이 골고루 섞여 있지 않아 샘플링이 한쪽으로 치우쳐졌다는 것을 의미한다. 샘플링 편향이 심하다면, 지도 학습 모델을 제대로 구현할 수 없기 때문에, 훈련 세트와 테스트 세트 모두 샘플이 골고루 섞여있어야 한다. 예를 들어, 훈련세트에 빙어 샘플이 1개, 도미 샘플이 20개 이런 식으로 들어가 있으면 안되는 것이다.
여기서 샘플(sample)이란?
도미와 빙어를 구분하기 위해 도미 길이와 무게, 빙어 길이와 무게의 데이터를 준비했다고 가정하자.
이 데이터들을 합쳐 생선 데이터로,
[(도미길이1, 도미무게1), (도미길이2, 도미무게2), ......(빙어길이1, 빙어무게1), (빙어길이2, 빙어무게2).....]
이런 식으로 정리했다.
여기서 각각의 원소가 샘플이 되는 것이다.
(도미길이1, 도미무게1)도, (빙어길이2, 빙어무게2) 도 각각 두개의 특성을 가진 샘플이다.
넘파이(numpy)
넘파이(numpy)는 파이썬의 대표적인 배열(array)라이브러리이다.
02-2. 데이터 전처리
넘파이로 데이터 준비하기
1. 넘파이 배열
- 넘파이 배열을 출력하면 리스트처럼 한줄로 출력되지 않고, 행과 열을 맞춰 가지런히 정리하여 보여준다.
- 핵심 부분이 C, C++와 같은 저수준 언어로 개발되서 빠르고, 큰 데이터를 다루는 데이터 과학 분야에 최적화되어있다.
- 그렇기에, 데이터가 큰 경우 파이썬 리스트로보다 넘파이 배열로 작업하는 것이 효율적이다.
- shape 속성을 통해 반환된 넘파이 배열의 크기는 파이썬 튜플로 표현된다
2. 넘파이 기능
- 브로드캐스팅 (broadcasting) : 배열 전체에 식계산을 할 수 있도록 도와준다
- ex) new_arr = (arr - 1) / 2 하면, 각 원소에 1을 빼고 2를 나워 반환한다
3. 넘파이에서 제공하는 함수나 속성
column_stack() | 전달받은 리스트를 일렬로 세운 다음 차례대로 나란히 연결한다. 연결한 리스트는 파이썬의 튜플(tuple)로 전달한다. → 튜플(tuple)이란? 파이썬 튜플은 리스트와 배우 비슷하다. 리스트처럼 순서가 있지만, 수정할 수 없다. 함수로 전달해도 바뀌지 않는다는 걸 믿을 수 때문에, 매개변수 값으로 많이 사용된다. |
ones()와 zeros() | 인자로 원하는 개수를 받아 각각 1과 0으로 채운 배열을 마들어줌 |
concatenate() | 인자로 리스트나 배열을 튜플로 전달해야 한다. 인자의 첫번째 차원에 따라 배열을 연결한다. 예를 들어, 1차원이라면 1차원 배열을 반환한다 |
shape | 넘파이 배열의 shape속성을 통해 데이터의 크기를 알 수 있다. arr.shape 이런 식으로 사용해서 (2, 1)을 반환하면, 2행 1열의 데이터 크기임을 알 수 있다 |
mean()와 std() | 인자로 배열을 받아 각각 평균과 표준편차를 계산한다. 여기에 axis라는 매개변수를 0으로 지정해서 행을 따라 각 열의 통계값을 계산하게 할 수 있다(↓방향) ex. mean(two_dim_arr, axix = 0) |
사이킷런으로 훈련 세트와 테스트 세트 나누기
훈련 세트와 테스트 세트를 나누는 방법으로 앞서 말한 것처럼, 새로운 데이터를 준비하거나 하나의 데이터를 쪼개 쓰는 방법 두가지가 있다. 후자의 방법을 생각해보자.
여기서 후자의 방법으로 훈련 세트와 테스트 세트를 나눌 때 데이터를 쪼개야 할텐데,
배열이나 리스트를 쪼개는 방법은 다음과 같이 있다.
- 넘파이 배열의 인덱스를 직접 섞어서 나누기
- 사이킷런의 train_test_split() 함수 쓰기
사이킷런에서 제공하는 함수
train_test_split() | 인자로 리스트나 배열을 받아, 섞은 다음, 비율에 맞게 훈련 세트와 테스트 세트로 나눠준다 train_test_split(array1(data), array2(target), stratify, random_state)으로 쓸 수 있다. - 앞에 받은 두개의 array 각각 훈련 세트와 테스트 세트로 나눠준다 - stratify 매개변수에 타깃데이터(target)을 클래스 비율에 맞게 데이터를 나눠준다. - random_state라는 매개변수에 랜덤 시드를 지정할 수 있다. |
데이터 전처리
데이터 전처리(data preprocesing)은 알고리즘을 위해 데이터를 제대로 마련하기 위한 작업들을 말한다.
k-최근접 이웃 알고리즘은 sample간의 거리가 주된 요소이기 때문에, 특성값들을 일정한 기준으로 맞춰줘야 한다.
다시, 도미와 빙어를 구분하는 예제로 돌아가서 생각해보자. 여기서 길이와 무게 두 특성의 범위는 굉장히 다르다. x축으로 둔 길이값은 10~40 범위를 가지는데, y축으로 둔 무게값은 0~1000 범위를 가지기 때문이다. 이 경우에서 바로 k-최근접 이웃 알고리즘에 넣어보면 거리 계산하는 데 보면, y축으로 조금만 올라가도 아주 큰 값이 되어 버리기 때문에, 무게만 고려 대상이 된다.
이렇듯, 두 특성의 값이 놓인 범위가 굉장히 다르다. 이를 두 특성의 스케일(scale)이 다르다고도 말할 수 있다. 스케일의 차이가 심하면 알고리즘은 제대로 예측할 수 없기 때문에, 데이터 전처리 과정이 필요한 것이다.
데이터 저처리 방법 중 하나로 '표준점수( z점수; standard score)'이 있다. 이를 통해, 실제 특성값의 크기와 상관없이 동일한 조건으로 비교할 수 있다.
* 데이터 전처리할 때 주의할 점 : 훈련 세트를 변환하면 그 변환한 방식 그대로, 테스트 세트를 변환해야 한다.
'머신러닝 > 혼공머신' 카테고리의 다른 글
[혼공머신] chapter 6. 군집 알고리즘 (0) | 2023.01.31 |
---|---|
[혼공머신] chapter 5. 결정트리 (0) | 2023.01.16 |
[혼공머신] chapter 3. 회귀 - k최근접, 릿지/라쏘 (0) | 2022.12.01 |
[혼공머신] chapter 2. k-최근접 이웃 알고리즘 - 실습 (0) | 2022.11.24 |
[혼공머신] chapter 1. 머신러닝이란? (0) | 2022.11.17 |