Programming/Machine Learning

Machine Leaning 2-1강 - split , shuffle, index

상맹 2021. 10. 27. 15:05
반응형
 

도미와 빙어 데이터

도미와 빙어 데이터. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

# 훈련 세트 테스트 세트 분리하기
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt

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]
                
fish_data = np.column_stack((fish_length, fish_weight))
fish_target = np.concatenate((np.ones(35), np.zeros(14)))
from sklearn.model_selection import train_test_split

# 0,0,1,1,1             1,1
#    2:3                0:2     → 비율로 편향 구분한다.
# 셔플을 안하면 샘플링 편향 발생 (3:1 비율이 되어 있지 않다.)
# 셔플을 해도 샘플링 편향 가능성이 있음 (3:1의 비율이 되지 않을 수 있다.)
# 직접 셔플을 하면 셔플을 3:1의 비율이 될때까지 해야한다.

# Cross-Validation을 위한 데이터 준비를 해준다.
# 기존 데이터를 훈련데이터와 테스트데이터로 나눠준다(8:2) + 셔플까지 해준다.
train_input, test_input, train_target, test_target = train_test_split(
    fish_data, fish_target, random_state = 42
)

print(train_input[:3])
print(train_target[:3])
print(train_input.shape)
print(test_input.shape)

 

비율계산기 : 네이버 통합검색

'비율계산기'의 네이버 통합검색 결과입니다.

search.naver.com

8:2 비율 정도로 나뉨

print(test_target) # 0 = 3개 , 1 = 10개

8:2  비율!

# 훈련
kn = KNeighborsClassifier(n_neighbors=3)

kn.fit(train_input, train_target)

# 검증 (1.0 = 100%)

kn.score(test_input,test_target)

# 없는 데이터 테스트 해보기
print(kn.predict([[25,150]])) # 수상한 도미 한마리

print(kn.predict([[100,200]]))

plt.scatter(fish_data[:,0], fish_data[:,1])
plt.scatter([25],[150])
plt.xlim(0,1000)
plt.show()

distances, indexes = kn.kneighbors([[25,150]])
print(distances)
print(train_input[indexes])
print(train_target[indexes])

# 데이터 스케일링이 되어 있지 않다.


 

[데이터 전처리] 데이터 스케일링 (Data Scaling)

이 글은 데이터 스케일링(Data Scaling)에 관한 기록입니다.

cheris8.github.io

# train_input, train_target, test_input, test_target
# train_input (길이, 무게), test_input (길이, 무게)

# 훈련 데이터의 평균을 사용해야한다.
# 훈련 데이터의 표준편차를 사용해야한다.
mean = np.mean(train_input, axis=0)
std = np.std(train_input, axis=0)
train_scaled = (train_input - mean) / std

mean2 = np.mean(test_input, axis=0)
std2 = np.std(test_input, axis=0)
test_scaled = (test_input - mean2) / std2
plt.scatter(train_scaled[:,0], train_scaled[:,1])
plt.scatter(test_scaled[:,0], test_scaled[:,1])

new = ([25, 150] - mean) / std

plt.scatter(new[0], new[1])

plt.show()

# 스케일링 된 데이터로 훈련(fit), score() 평가, predict  예측
# train_scaled
kn.fit(train_scaled, train_target)
kn.score(test_scaled, test_target)

print(kn.predict([new]))

반응형