AI/혼자 공부하는 머신러닝+딥러닝 책

챕터 02 - 1

codehunter 2023. 7. 6. 22:45

챕터 1 에서는 인공지능이 뭔지, 데이터가 있을때 어떤식으로 머신러닝을 적용해야 할지 대략적으로 살펴보았다.

- 데이터 입력 및 파악

- 훈련

- 예측

이런식으로 이루어지는데 이번 챕터에서는 데이터를 파악하는데 좀 더 깊게 들어가게 된다.

 

지도학습과 비지도학습

머신러닝 알고리즘은 크게 지도 학습과 비지도 학습으로 나누어 지는데

지도학습은 정답을 가지고 알고리즘이 정답을 맞히는것을 학습하는데 반대로 정답이 없이 입력데이터만 가지고 학습하는걸 비지도학습이라고 한다. 1장의 도미와 빙어 데이터는 무게와 길이 데이터( 무게와 길이를 특성이라고 함. 그리고 정답이외의 데이터를 입력이라고 함)와 어떤 특성 세트가 도미와 빙어것인지 정답데이터(타겟이라고 함)도 함께 제공하기 때문에 지도학습이라고 할 수 있겠다. 입력과 타겟을 합쳐서 훈련데이터라고 함

 

챕터 02-1 훈련세트와 테스트 세트

챕터 1 은 훈련시켜서 예측해야 할 모든 데이터가 한 덩어리로 된 데이터였다. 그래서 정답률이 100%가 나올수 있었던 것이다. 알고리즘의 성능을 제대로 평가하려면 훈련데이터와 평가에 사용할 데이터가 각각 달라야 한다.

훈련에 사용하는 데이터는 훈련 세트, 평가에 사용하는 데이터는 테스트 세트라고 한다고 함.

 

문제 : 생선 길이, 무게로 도미 알아내기 (1장에서 계속 이어짐)

1장의 문제가 아직 해결이 안됐으니 계속 살펴보자. 먼저 1장의 문제해결 방식과 동일하게 데이터 입력을 하는데 1장에서는 개념설명때문에 중반쯤에 각생선의 길이와 무게를 합쳐서 쓰는데 여기선 바로 두개의 데이터를 합친상태에서 시작하자

또 머신러닝 프로그램에 쓸수 있게 2차원 리스트까지 만드는데까지 바로 진행해보자.

 

하나의 생선 데이터를 샘플이라고 부르는데 전체데이터는 49개의 샘플이 있는 셈인데 이 데이터의 처음 25개를 훈련 세트로, 나머지 14개를 테스트 세트로 사용해보자

그리고 1장에서 썼던 k-최근접 이웃 알고리즘(KNeighborsClassifier)을 구현한 클래스를 이용해서 훈련한다.

 

훈련시키고 평가를 했더니 정확도가 0% 나왔다. 이 문제는 샘플링의 편향때문에 발생한 문제이다. 즉 샘플의 앞쪽에는 도미데이터가 뒤쪽에는 빙어데이터가 배치되어 있는데 훈련데이터와 테스트데이터로 나누는 과정에서 (우연하게도(?)) 딱 각 생선별로 분류가 되어 버리는 바람에 훈련은 도미데이터로만, 테스트 빙어데이터로만 진행했기 때문이다. 훈련하는 데이터와 테스트 하는 데이터에는 도미와 빙어 데이터가 골고루 섞여있어야 한다.

 

이 섞는 작업을 위해서 넘파이라는 라이브러를 이용하게 된다. 책에 나와있는 학습과정은 생략하고 데이터를 섞어서

다시 세팅하는 과정은 다음과 같다.

위 섞은 데이터의 추세를 살펴보면

 

파란색이 훈련 세트이고 주황색이 테스트 세트인데 적당히 살 섞은 모양이다. 이제 다시 훈련을 해보자

이제 테스트 데이터를 잘 평가하는걸 알 수 있다.

 

테스트 데이터로 예측까지 해보면

역시 잘 예측하는걸 알 수 있다.

 

 

최종 코드

## 생선 분류 문제2
### 훈련 세트와 테스트 세트

fish_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, 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]
fish_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, 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]


### 데이터를 모델에 쓸수 있게 2차원 리스트로 만들기

fish_data = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1] * 35 + [0] *14

print(fish_data)
print(fish_target)

### k-최근접 이웃 알고리즘(KNeighborsClassifier)을 구현한 클래스를 이용해서 훈련

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()

# 훈련 세트로 입력값 중 0부터 34번째 인덱스까지 사용
train_input = fish_data[:35]
# 훈련 세트로 타깃값 중 0부터 34번째 인덱스까지 사용
train_target = fish_target[:35]

# 테스트 세트로 입력값 중 35번째부터 마지막 인덱스까지 사용
test_input = fish_data[35:]
# 테스트 세트로 타깃값 중 35번째부터 마지막 인덱스까지 사용
test_target = fish_target[35:]

kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)

### 넘파이를 이용해 데이터 섞어서 다시 세팅하기

import numpy as np

input_arr = np.array(fish_data)
target_arr = np.array(fish_target)

print(input_arr)
print(input_arr.shape)

### 작업의 편의성을 위해 인덱스 기반의 처리 작업으로 변환

np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)

print(index)

train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]

print(input_arr[13], train_input[0])

test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]

### 섞은 데이터의 분포도를 확인

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()

kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)

kn.predict(test_input)

test_target

 

 

확인문제

1. 머신러닝 알고리즘의 한 종류로서 샘플의 입력과 타깃(정답)을 알고 있을 때 사용할 수 있는 학습 방법은 무엇인가요?

1. 지도 학습

2. 비지도 학습

3. 차원 축소

4. 강화 학습

 

풀이 : 정답 1번 , 2번 비지도 학습은 정답없이 학습, 3번 차원 축소는 아직 안배웠음, 4번 강화 학습은 보상방식의 학습 방법이다.

2. 훈련 세트와 테스트 세트가 잘못 만들어져 전체 데이터를 대표하지 못하는 현상을 무엇이라고 부르나요?

1. 샘플링 오류

2. 샘플링 실수

3. 샘플링 편차

4. 샘플링 편향

 

풀이 : 정답 4번, 나머지는 공식적으로 정의되어 있는 문구아님

 

3. 사이킷런은 입력 데이터(배열)가 어떻게 구성되어 있을 것으로 기대하나요?

1. 행: 특성, 열: 샘플

2. 행: 샘플, 열: 특성

3. 행: 특성, 열: 타깃

4. 행: 타깃, 열: 특성

 

풀이 : 2번, 3, 4번의 타깃 값은 입력데이터에는 있으면 안되고 1번은 잘못된 형식이다.

'AI > 혼자 공부하는 머신러닝+딥러닝 책' 카테고리의 다른 글

챕터 03 - 3  (0) 2023.07.15
챕터 03 - 2  (0) 2023.07.15
챕터 03 - 1  (0) 2023.07.10
챕터 02 - 2  (1) 2023.07.08
챕터 01  (0) 2023.07.02