AI/Machine Learning

[Python] 머신러닝 기초-3 K-Neighbors (최근접)알고리즘을 통한 연습- 분류

Jeong Jeon
반응형

자 이어서 조금 더 나은 코드를 향해 달려가보자.

공부 순서는 점진적으로 발전할 예정이다.

 

1). Numpy 함수 이용해보기

  • np.column_stack() = 리스트 여러개의 열 샘플 한개씩을 연결하여 붙여준다.
  • np.concatenate() = 배열을 이어준다.
  • np.ones(N) = 정수N개만큼 1로 채운 배열을 만든다.
  • np.zeros(N) = 정수N개만큼 0으로 채운 배열을 만든다.

fish_data를 찍어보면...

fish_target을 찍어보면..

2). 사이킷런으로 테스트세트와 훈련세트 나누기

 

 

3). KNeighborsClassifier() 훈련

=> 결과 : 100%의 정확도

 

4). 훈련된 모델에 값을 넣어 예측해보자

=> 결과 : 0을 반환

=> 의미 : 25,150 (무게,길이)인 데이터를 넣었을때 해당하는 종류를 반환하였다.

우리는 1이 bream으로 설정해놓고 나머지는 0으로 분류하였는데, 나머지인 smelt로 결정되는것을 알수있다.

 

5). 화면 출력

그래프로 출력하여 어떤 데이터가 bream인지, smelt인지, 내가 넣은데이터와의 거리가 어떻게 차이가 나는지,

왜 0이라는 예측값을 뱉어냈는지 확인해 보자

우선 kn.kneighbors() 함수를 통해 25,150을 넣었을때 근처에있는 5개의 추출된 근처데이터와의 거리와, 근처데이터의 index를 알수있다.

해당 index값으로 검색해보면, 1,0,0,0,0으로 0이 가장 많은 비율을 나타내어, 0이 예측되었음을 알수있다.

 

여기서, 이 값이 정당할까라는 의문을 가질 수있다. 0이 더 가까운게 맞나? 그래프를 보니 잘모르겠는데...? 

혹은

현재 위 그래프는 x축 스케일을 원래 사용하는 스케일로 맞추어서 표현했는데, 원래 x축의 스케일로 구해야되지않을까? 라는 생각이 든다.

 

현실 = 현재 위 그래프는 y축 데이터만 주 고려대상이되고, x축은 이웃을 찾는데 많은 영향을 미치지 못했다.

x축과 y축의 스케일을 동등하게 맞추어 비교해야된다 라는 개념이 나오게되는데

데이터는, 표준하는 기준이 다르면 정확하게 예측할 수 없다고하여, 나온것이 전처리 이다.

 

우리는 여러가지 전처리 방법중 표준점수 방법을 사용해 볼것이다.

 

표준점수

  • 데이터에서 평균을 빼고, 표준편차로 나누어주면 된다. (자세한건 생략한다)

6). 전처리

 

  • 우선 표준점수를 구하기 위해 데이터의 평균과 표준편차를 구한다.

  • 훈련데이터에서 평균을 빼고 표준편차로 나눈다.

여기서 브로드캐스팅이라는 개념이 나오는데, Numpy의 기능 중 한가지로, train_input의 모든 행에서 자동으로 mean을 빼고, 그 데이터에서 모든 행을 std로 나누어 적용시킨다.

 

  • 그래프를 뿌려본다.
  • 스케일링된 데이터로 다시 모델을 훈련시킨다.
  • 25,150 데이터를 스케일 변환하여 다시 예측해본다.

 

==> 결과 : 1이 출력

x,y축을 정확하게 스케일링하여 KNeighbor 알고리즘을 통해 가장 가까운 이웃들을 찾아내고, 그 이웃을 통해 해당 데이터가 1이라는것을 도출할 수 있었다.

 

다음차에는 회귀라는 것을 적용시켜볼 예정이다.

반응형