티스토리 뷰

머신러닝/혼자공부하는머신러닝

혼공머_2

삼전동해커 2022. 8. 19. 17:11
#train, test set 만들어서 학습하고 이웃 구하기
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt

bream_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]
bream_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]

smelt_length = [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]
smelt_weight = [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]

fish_length = bream_length + smelt_length
fish_weight = bream_weight + smelt_weight

#train, test 데이터 셋 만들기
fish_data = np.column_stack((fish_length, fish_weight)) #n행 2열(length와 weight) 배열 생성
fish_target = np.concatenate((np.ones(35),np.zeros(14)))  #target을 생성하기 위해 타겟 값을 하나의 리스트로 생성
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, random_state = 42)

#knn 알고리즘의 이웃 구하기
kn = KNeighborsClassifier()
kn.fit(train_input, train_target) #train set 훈련
kn.score(test_input, test_target) #test set 훈련

distance, indexes = kn.kneighbors([[25,150]]) #25,150의 주변 이웃을 distance와 indexes를 구함
plt.scatter(train_input[:,0], train_input[:,1]) #train_input 값 보이기
plt.scatter(25,150,marker="^")
plt.scatter(train_input[indexes,0],train_input[indexes,1], marker="D")
plt.show()

# kn.fit(train_input, train_target) #train set 훈련
# kn.score(test_input, test_target) #test set 훈련
# print(kn.predict([[25,150]])) #예측할 데이터 삽입

#표준편차 이용하기
mean = np.mean(train_input, axis = 0) #train_input의 평균 계산하기, 특성의 스케일이 다르므로 axis를 0으로 지정 -> 행을 따라 각 열의 통계 값을 계산, length와 weight의 평균
std = np.std(train_input, axis = 0) #train_input의 표준 편차 계산하기, length와 weight의 표준편차 계산

#train_input 샘플들 각각의 표준 점수를 알아서 계산해줌
train_scaled = (train_input - mean) / std #표준 점수

#그냥 25,150 샘플로 변환하면 이 샘플은 표준점수 계산이 적용되지 않는다.
plt.scatter(train_scaled[:,0], train_scaled[:,1])
plt.scatter(25,150, marker="^")
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

# kn.fit(train_input, train_target) #train set 훈련
# kn.score(test_input, test_target) #test set 훈련
# print(kn.predict([[25,150]])) #예측할 데이터 삽입

#25,150 샘플도 표준 점수를 맞춰서 다시 그려준다.
new = ([25,150] - mean) / std
plt.scatter(train_scaled[:,0],train_scaled[:,1])
plt.scatter(new[0],new[1],marker="D")
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

#바뀐 스케일로 다시 모델을 훈련하고 이웃 샘플을 잡는다.

kn.fit(train_scaled, train_target)
test_scaled = (test_input - mean) / std
kn.score(test_scaled, test_target)
print(kn.predict([new]))

distance, indexes = kn.kneighbors([new])
plt.scatter(train_scaled[:,0],train_scaled[:,1])
plt.scatter(new[0],new[1],marker = "D")
plt.scatter(train_scaled[indexes,0], train_scaled[indexes,1], marker = "^")
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

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

확률적 경사 하강법  (0) 2022.09.06
proba, 로지스틱 회귀  (0) 2022.08.25
pandas csv read, 다중 선형 회귀  (0) 2022.08.23
혼공머_3  (0) 2022.08.23
혼공머_1  (0) 2022.08.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함