프로그래밍/Python

[머신러닝] 붓꽃 데이터로 품종 분류해보기

Dibrary 2022. 5. 4. 09:50
반응형

안녕하세요 Dibrary입니다.

많이들 아시다시피 python은 데이터분석 및 머신러닝, 신경망 등에 많이 활용되는 언어입니다.

단순히 기능 구현만 하던 저도 조금이라도 알아는 둬야겠다 싶어서 파이썬으로 머신러닝을 해보는 코드를 기록해보고자 합니다.

 


먼저, 사용할 모듈은 sklearn 및 scipy입니다. 저는 Jupyter를 사용하겠습니다.

터미널을 열어서 pip install sklearn scpiy 를 먼저 입력해주시고 이하 코드를 따라해 보시면 됩니다.

 

sklearn 모듈 안에 테스트로 붓꽃 데이터가 들어 있습니다.

load_iris로 데이터를 가져오고, target_names를 넣어 보면 3개의 값이 나옵니다.

여기서 말하는 3개의 값은 해당 데이터를 뽑아낸 대상입니다. 즉, 우리는 데이터를 통해 이 3가지 중에 어떤 붓꽃에 해당될지를 맞추면 되는 것이죠.

 

실제 데이터는 어떤 모양일지 출력해보면 아래와 같습니다.

뭐 엄청 길게 나옵니다. 그리고 맨 밑에는 굉장히 너저분하게 뭐라뭐라 나오는데 데이터에 대한 정보입니다.

 

데이터의 특성을 살펴보겠습니다. 

배열을 보시면 하나의 행에 4개 숫자가 들어있는 것을 보실 수 있습니다.

제가 첫 번째 데이터만 가져와 봤는데, 각 값은 

  • sepal length = 5.1
  • sepal width = 3.5
  • petal length = 1.4
  • petal width = 0.2 

이런 의미입니다.

 

하나의 붓꽃에 대해 4가지 특성데이터를 수집했고, 이 붓꽃은 총 150개로부터 데이터를 수집했네요.

 

그럼 어떤 숫자가 어떤 꽃의 데이터인지는 어떻게 알 수 있을까요?

첫번째 부터 50번째 줄 까지는 0이라고 표기한 붓꽃의 데이터 입니다. 51번째부터 100번째까지는 1이죠.

총 50개씩 3종류의 붓꽃이니까 데이터가 150개가 맞네요.

 

그러면 0은 어떤 붓꽃일까요? 바로 위에서 target_names로 확인한 값의 순서대로 입니다.

  • setosa = 0
  • versicolor = 1
  • virginica = 2

이렇게 말이죠.

 


여기까지 우선 데이터에 대한 정보 파악은 끝났습니다.

참고로, 데이터를 훈련시키거나 분석하고자 할 때는 작업에 들어가기 전에
데이터가 어떤 형태인지, 어떤 것의 데이터인지를 알아야 차후 응용할 수 있습니다.

 

이번에는 데이터를 훈련용과 테스트용으로 분류해보겠습니다. 이 과정을 홀드아웃이라고 합니다.

보시면 전달인자는 데이터와 어떤 붓꽃인지에 대한 정보를 넘겼습니다.

근데, random_state도 같이 들어가죠? 이건 해당 분류를 언제나 같게 하고자 할 때 설정합니다.
즉, random_state=3으로 하고 7,5,9,4,2,6이라는 순서가 나왔을때, random_state를 3으로 유지하면 순서는 항상 7,5,9,4,2,6이 나옵니다. 

 

그리고 data_train을 보면 데이터가 무작위로 들어가있네요.

그러면 어떤 데이터는 어떤 붓꽃의 데이터인지 어떻게 알 수 있을까요? label 데이터를 보면 됩니다.

아까 0, 1, 2가 순서대로 정렬되어 나온것과 다르죠? 위 라벨처럼 데이터가 섞인 것입니다.

또한 test와 train으로 데이터가 나뉜것을 보실 수 있습니다.

 

 

데이터의 분포를 보고자 한다면 matplotlib으로 그려보는 것도 좋습니다.

사실 분류가 0, 1, 2만 있어서 너무 단순한데, 잘 보면 0은 주황색 부분이 제일 넓게 분포하고,
1과 2는 초록색 부분이 제일 넓게 분포하는 것을 알 수 있습니다.

 


데이터를 홀드아웃 한 후에, 본격적으로 훈련을 시키면 됩니다.

여기서 KNeighborsClassifier는 k-최근접 이웃 분류를 수행하는 머신입니다.

여기서는 이웃의 갯수를 1로 설정했습니다. 인접 이웃 중 가장 가까운 1개만을 이웃으로 본다는 것입니다.

즉, [ 내가 모르는 임의의 데이터 근처에 0과 1, 2가 있는데 0이 제일 가깝다면, 이 미지의 데이터는 0일 것이다 ] 이렇게 판별하는 것이죠.

 

과연 그런지 보겠습니다.

먼저 기존 데이터 중에 1로 분류했던 데이터인 [5.9, 3, 4.2, 1.5] 를 0.1씩만 바꿔서 테스트 해보겠습니다.

네 예상한대로 1이 나옵니다. 우리는 1의 특성과 아주 가까운 데이터를 넣었기 때문에 이 임의의 데이터 근처에 1이 위치할 거라는 추론이 되죠.

머신 역시 우리의 생각과 똑같은 결과를 내주었습니다.

 

 

이제 과연 이 머신이 어느정도 정확한지 확인해보겠습니다.

먼저 아까 분류한 데이터 중에 테스트용 데이터를 넣어줍니다.  그러면 분류 결과가 나옵니다.

해당 분류결과를 아까 label_test 데이터와 비교합니다. 즉, 우리가 알고있는 100% 정확한 값하고 머신이 예측한 값하고 비교하고 백분율을 구해보는 겁니다.

정확도는 97%가 나왔습니다.

 

 

데이터를 붓꽃 데이터가 아닌 내가 원하는 데이터를 넣어서 훈련시키면 나만의 자동분류기가 탄생하는 것입니다.

아주 간단한 분류기였으므로, 단순한 스위치 ON/OFF 같은 기능에 사용하기 적합합니다.

728x90
반응형