numpy의 column_stack()은 리스트를 일렬로 세운 후에 나란히 연결한다
출력은 튜플로 한다.
이를 이용하여 데이터를 변환한다.
슬라이싱으로 5개를 표시하면 이렇게 나온다.
np.ones() 함수 : 원하는 개수의 1을 채운 배열을 만든다
np.zeros() 함수 : 원하는 개수의 0을 채운 배열을 만든다
이를 기반으로 정답 데이터를 만든다.
데이터가 적으면 괜찮지만, 많을시에는 이런 함수를 사용하는 것이 편하다.
사이킷런으로 훈련 세트와 테스트 세트 나누기
인덱스를 만들어 나누는 거보다 편하다.
사이킷 런의 train_test_split() 함수이다.
fish_data를 train_input 과 test_ input으로
fish_target을 train_target 과 test_target으로 나눠준다,
전달되는 리스트나 배열을 비율에 맞게 섞어서 훈련 세트와 테스트 세트로 나눠준다.
random_state로 자체적인 매개변수로 시드를 지정할 수 있다.
이 함수는 기본적으로 25% 테스트 세트로 떼어 낸다.
추가적으로 무작위로 데이터를 나눌 때 샘플이 골고루 섞이지 않을 수 있다.
이때 stratify 매개변수에 타깃을 전달하면 클래스의 비율에 맞게 데이터를 나눠준다.
k-최근접 이웃 알고리즘
잘 섞은 데이터로 학습시킨 최근접 이웃 알고리즘으로 모델을 학습시켰지만
도미를 넣어도 빙어 데이터로 예측한다.
산점도를 찍어 보아도, 도미에 더 가깝다.
KNeighborsClassifier
k-최근접 이웃 알고리즘의 KNeighborsClassifier 클래스는 가장 가까운 이웃을 찾아주는 메소드를 사용한다.
이웃까지의 거리와 이웃 샘플의 인덱스를 반환한다.
KNeighborsClassifier의 n_neighbors의 기본값은 5이므로 5개의 이웃을 반환한다.
인접한 5개의 값의 거리와 인덱스를 리스트에 넣어 산점도로 표시하면 다음과 같다.
위와 같이 도미는 1개고 빙어만 4개가 나온다.
인덱스를 이용하여 타겟 데이터를 보면 확실하게 빙어가 4개이다..
이유
스케일이 다르기 때문 = 두 특성의 값이 놓인 범위가 다르다
우리가 눈으로 보이는 거리와 distances에 들어 있는것이 일치하지 않아 보이는데,
그 이유는 x축과 y축의 범위가 서로 다르기 때문에 일어났다
y축은 1000까지의 범위기에 조금만 벗어나도 x축에 비해 엄청나게 떨어진 수치가 나오게 되었다.
이를 맞춘다고 범위를 통일하면 x축보다 y축으로만 데이터를 판정하게 된다.
해결법
데이터 전처리 : 샘플 간의 거리에 영향을 받기에 특성값을 일정한 기준으로 맟춘다.
-표준점수 : 각 특성값이 0에서 표준편차의 몇 배만큼 떨어져 있는지를 나타낸다.
np.mean()은 평균을 계산,
np.std()는 표준편차를 계산한다
train_input의 모든 리스트에 평균을 빼서 표준편차로 나눈다.
이런 넘파이의 기능을 브로드캐스팅이라 한다.
해결
학습 데이터를 모두 전처리 했기에
입력 데이터도 전처리를 하고 산점도를 그려보면 위와 같다.
전처리된 데이터로 모델을 다시 학습시키고, 테스트 데이터도 전처리 후에 넣으면
정답을 다 맞추는 모델이 나온다.
처음에 오류를 낸 도미 데이터를 다시 넣어보면 제대로 된 정답을 출력한다.
최 근접 5개를 찍어보면 이번에는 도미쪽으로 문제없이 나온다.
'프로그래밍 > 인공지능' 카테고리의 다른 글
[혼공머신] Chapter3-1 k-최근접 이웃 회귀 (0) | 2025.01.17 |
---|---|
[혼공머신]Chapter 2-1 훈련 세트와 데이터 세트(Numpy) (0) | 2025.01.12 |
[혼공머신] Chapter 1-3. 생선 분류 문제 (0) | 2025.01.08 |
[혼공머신] Chapter 1-1, 1-2 : 인공지능 및 코랩 (0) | 2025.01.07 |