전체 데이터를 대표할 수 있는 샘플링이 아닌 한쪽으로 치우친 샘플링
파이썬의 대표적인 배열 라이브러리
#sampling bias
import numpy as np
input_arr = np.array ( fish_data )
target_arr = np.array ( fish_target )
print( input_arr )
#random index
index = np.arange( 49 )
np.random.seed(42)
np.random.shuffle( index )
train_input = input_arr [ index[: 35] ]
train_target = target_arr [ index [: 35] ]
test_input = input_arr [ index[35 : ] ]
test_target = target_arr [ index [35 : ] ]
샘플이 적절하게 섞인 것을 확인 할 수 있다.
사용 모델: KNeighborsClassifier
목표: 주어진 빙어, 도미 데이터를 테스트세트와 훈련세트로 나누어서 모델을 훈련하고 테스트를 통해 모델을 평가한다.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit( train_input, train_target )
kn.score( test_input, test_target )
kn.predict( test_input )
이전 모델의 한계: x, y의 scale이 달라서 거리 측정에 문제가 있다.
해결방법: scaling/표준화
예시:
위와 같은 데이터가 주어지고, 주황색 세모 데이터의 분류를 맞추려 할 때,
이때 반영되는 kneighbors는 아래와 같다.
plt.scatter(fish_data[:,0], fish_data[:, 1])
plt.scatter(25, 150, marker = '^')
plt.scatter(train_input[indexes, 0], train_input[indexes, 1], marker = 'D')
plt.show()
x축의 범위를 y와 같게 할 경우, 아래와 그래프를 볼 수 있다. 즉, 위와 같은 그래프와 달리 실제로 측정되는 거리는 아래와 같고, 이는 y축 값에 의해 거리가 거의 결정된다는 것이다.
plt.scatter(train_input[:,0], train_input[:, 1])
plt.scatter(25, 150, marker = '^')
#x축의 범위를 조정한다
plt.xlim((0,1000))
plt.show()
#train data scaling
mean = np.mean(train_input, axis = 0)
std = np.std(train_input, axis = 0)
scaled_train_input = (train_input - mean)/std
#new test data scaling
new_test_input = [[25, 150]]
new_scaled_test_input = ( new_test_input - mean )/std
#train the model with scaled train input
kn.fit(scaled_train_input, train_target)
kn.predict(new_scaled_test_input)
#get distances and indexes that used to predict new test data
distances, indexes = kn.kneighbors(new_scaled_test_input)
#test data scaling
scaled_test_input = (test_input-mean)/std
kn.score(scaled_test_input, test_target)
#scored 1.0
plt.scatter(scaled_train_input[:,0], scaled_train_input[:,1])
plt.scatter(new_scaled_test_input[:,0], new_scaled_test_input[:,1], marker = '^')
plt.scatter(scaled_train_input[indexes,0], scaled_train_input[indexes,1], marker = 'D')
plt.show()
#심화 공부
train_bream_index = []
train_smelt_index = []
for i in index[:35]:
if target_arr[i] == 1:
train_bream_index.append(i)
else :
train_smelt_index.append(i)
test_bream_index = []
test_smelt_index = []
for i in index[35:]:
if target_arr[i] == 1:
test_bream_index.append(i)
else :
test_smelt_index.append(i)
train_bream = input_arr[train_bream_index]
train_smelt = input_arr[train_smelt_index]
test_bream = input_arr[test_bream_index]
test_smelt = input_arr[test_smelt_index]
print(train_bream)
plt.scatter(train_bream[:,0], train_bream[:,1])
plt.scatter(train_smelt[:,0], train_smelt[:,1])
plt.scatter(test_bream[:,0], test_bream[:,1])
plt.scatter(test_smelt[:,0], test_smelt[:,1])
plt.show()