
1. 지도학습과 비지도학습 (강화학습)

2. 훈련 세트와 테스트 세트
중간고사를 보기 전에 출제될 시험 문제와 정답을 미리 알려주고 시험을 본다면 100점을 받을 수 있습니다.
머신러닝도 이와 같아요. 타깃을 주고 훈련한 모델에 같은 데이터로 테스트를 한다면 모두 맞추게 됩니다.
연습 문제와 시험 문제가 달라야 올바르게 학생의 능력을 평가할 수 있듯이, 머신러닝 알고리즘의 성능을 제대로 평가하기 위해서 훈련 데이터와 평가에 사용할 데이터가 달라야합니다.
동일하지 않은 데이터로 평가하기 위해서,
1. 다른 데이터 준비하기
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
도미와 빙어는 각각 35마리, 14마리가 있으므로 전체 데이터는 49개의 샘플이 있음.
사용하는 특성은 길이와 무게 2개임.
이 데이터의 처음 35개를 훈련 세트로, 나머지 14개를 테스트 세트로 사용함.

# 사이킷런의 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:]
파이썬 리스트에서 인덱스를 지정하고 슬라이싱 연산을 통해 훈련 세트와 테스트 세트 분할해줌.
인덱스 0~34까지 처음 35개 샘플을 훈련 세트로 선택하고, 인덱스 35~48까지 나머지 14개 샘플을 테스트 세트로 선택함.
# 모델 훈련
kn = kn.fit(train_input, train_target)
# 평가
kn.score(test_input, test_target)
>> 출력 값 : 0.0 (‼️0으로 최악의 성능을 나타냄. 오류 발생. )
이유 : fish_data는 처음 순서대로 35개의 도미와 14개의 빙어 샘플이 들어가있음. 따라서 마지막 14개를 테스트 세트로 만들면 빙어 데이터만 들어가게 됨. 훈련하는 데이터와 테스트하는 데이터에는 도미와 빙어가 골고루 섞여있어야함.
🌟샘플링 편향 (훈련 세트와 테스트 세트에 샘플이 골고루 섞여있지 않으면 샘플링이 한쪽으로 치우쳤다는 의미) 발생 !!
샘플링 편향 해결하기 | 생선 데이터를 넘파이 배열로 준비하기
# 넘파이 (고차원의 배열을 손쉽게 만들고 조작할 수 있는 간편한 도구 제공)
import numpy as np
# 파이썬 리스트를 넘파이 배열로 바꾸기
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
print(input_arr)
>> 출력 값 : [[ 25.4 242. ]
[ 26.3 290. ]
. . .
[ 15. 19.9 ]]
샘플링 편향 해결하기 | 배열에서 랜덤하게 샘플을 선택해 훈련 세트와 테스트 세트 만들기 ( 무작위로 샘플 고르는 방식 )
! 주의할점 : input_arr와 target_arr에서 같은 위치는 함께 선택되어야 한다는 점
np.random.seed(42)
# 넘파이 arrange() 함수에 정수 N을 전달하면 0에서부터 N-1까지 1씩 증가하는 배열 생성
index = np.arange(49)
# shuffle() 함수는 주어진 배열을 무작위로 섞음
np.random.shuffle(index)
# index 배열의 처음 35개를 input_arr와 target_arr에 전달해 랜덤하게 35개의 샘플을 훈련 세트로 생성
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
# // 14개의 테스트 세트로 생성
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]
훈련 세트와 테스트 세트에 도미와 빙어가 잘 섞여있는지 시각화를 통해 확인하기
# data 시각화
import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25,150,marker='^') # marker 매개변수는 모양을 지정합니다
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

# 학습
kn = kn.fit(train_input, train_target)
# 테스트
kn.score(test_input, test_target)
>> 출력 값 : 1.0 ( 100%의 정확도를 보여줌. )
# predict() 메서드로 테스트 세트의 예측 결과와 실제 타깃을 확인해보기
kn.predict(test_input)
>> 출력 값 : array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])
test_target
>> 출력 값 : array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])
'📚 [Archive] CS & AI 스터디 > [STUDY] 인공지능 🤖' 카테고리의 다른 글
| [신경망 연산] 선형 활성화 함수는 왜 딥러닝에서 사용되지 않을까? (0) | 2025.02.04 |
|---|---|
| [딥러닝] 인공신경망 (Artificial Neural Networks, ANN) (3) | 2025.02.04 |
| [AI개요] 머신러닝 개요 (6) | 2025.01.21 |
| [혼공머] 마켓과 머신러닝 (1) | 2024.11.28 |
| [혼공머] AI의 역사와 발전: 머신러닝에서 생성형 AI까지 (5) | 2024.11.26 |