[weekly project 01] RandomForest와 BoostingTree로 버섯 식용여부 예측 모델 만들기

민정윤·2023년 12월 1일
0

프로젝트 소개

  • 버섯의 각 특징들이 식용여부와 어떤 관계가 있는지 알아보고 버섯의 식용여부를 예측하는 모델을 만들어보려고 한다.

데이터 바로가기

데이터 구성 및 전처리

[데이터 구성]

  • class: 독성 여부(edible=e, poisonous=p)
  • cap-shape: 버섯 모자 모양(bell=b,conical=c,convex=x,flat=f, knobbed=k,sunken=s)
  • cap-surface: 버섯 모자 표면(fibrous=f,grooves=g,scaly=y,smooth=s)
  • cap-color: 버섯 모자 색상(brown=n,buff=b,cinnamon=c,gray=g,green=r,pink=p,purple=u,red=e,white=w,yellow=y)
  • bruises: 버섯의 멍 여부(bruises=t,no=f)
  • odor: 버섯 냄새(almond=a,anise=l,creosote=c,fishy=y,foul=f,musty=m,none=n,pungent=p,spicy=s)
  • gill-attachment: 버섯 주름 연결 방식(attached=a,descending=d,free=f,notched=n)
  • gill-spacing: 버섯의 주름 간격(close=c,crowded=w,distant=d)
  • gill-size: 주름 폭(broad=b,narrow=n)
  • gill-color: 주름 색상(black=k,brown=n,buff=b,chocolate=h,gray=g, green=r,orange=o,pink=p,purple=u,red=e,white=w,yellow=y)
  • stalk-shape: 버섯의 줄기 모양(enlarging=e,tapering=t)
  • stalk-root: 버섯의 뿌리 모양(bulbous=b,club=c,cup=u,equal=e,rhizomorphs=z,rooted=r,missing=?)
  • stalk-surface-above-ring: 링 위의 표면 질감(fibrous=f,scaly=y,silky=k,smooth=s)
  • stalk-surface-below-ring: 링 아래 표면 질감(fibrous=f,scaly=y,silky=k,smooth=s)
  • stalk-color-above-ring: 링 위의 색상(brown=n,buff=b,cinnamon=c,gray=g,orange=o,pink=p,red=e,white=w,yellow=y)
  • stalk-color-below-ring: 링 아래 색상(brown=n,buff=b,cinnamon=c,gray=g,orange=o,pink=p,red=e,white=w,yellow=y)
  • veil-type: 베일(줄기 지지대)의 타입(partial=p,universal=u)
  • veil-color: 베일의 색상(brown=n,orange=o,white=w,yellow=y)
  • ring-number: 버섯의 링 개수(none=n,one=o,two=t)
  • ring-type: 버섯의 링 종류(cobwebby=c,evanescent=e,flaring=f,large=l,none=n,pendant=p,sheathing=s,zone=z)
  • spore-print-color: 버섯의 포자 프린트 색상(black=k,brown=n,buff=b,chocolate=h,green=r,orange=o,purple=u,white=w,yellow=y)
  • population: 버섯의 분포 형태(abundant=a,clustered=c,numerous=n,scattered=s,several=v,solitary=y)
  • habitat: 자라는 환경(grasses=g,leaves=l,meadows=m,paths=p,urban=u,waste=w,woods=d)

[데이터 전처리]

1. 결측치 확인

  • 결측치 확인 결과 모든 컬럼에 결측치는 없었다.

2. 식용여부에 따른 각 특징별 그래프 확인

  • cap-shape는 대부분 ‘x’와 ‘f’의 형태를, odor은 ‘n’과 ‘f’를, gill-attachment는 ‘f’의 형태를 띄고 있다.

  • veil-type은 ‘p’ 한 가지로 이루어져있고, veil-color는 대부분 ‘w’를 띄고 있다.

  • ring-number는 대부분 ‘o’로 이루어져 있다.

3. Encoding

방법 1)

  • 모든 컬럼이 카테고리형 데이터로 이루어져 있어 one-hot encoding을 진행하려 했지만 그러면 컬럼 수가 너무 많아지기 때문에 label encoding을 진행하였다.


방법 2)

  • 종류가 너무 많은 컬럼은 top3만 뽑아 나머지 종류는 ‘ETC’로 전처리를 해주고 label encoding을 진행하였다.
    (예를들어, habitat의 경우 종류가 7가지인데 이를 ‘d’, ‘g’, ‘p’, 그리고 ‘ETC’로 전처리를 해주고 진행함. 그럼 총 4종류의 변수가 생성된다.)


방법 3) - 카테고리형 변수 중 종류가 4개 미만인 변수들은 one-hot encoding을, 그 외의 변수들은 label encoding을 진행하였다.
  • one-hot encoding = bruises, gill-attachment, gill-spacing, gill-size, stalk-shape, veil-type, ring-number

  • label encoding = 나머지 컬럼


모델 생성 및 학습시키기

best_params 로 최적의 해를 구해보고 적절한 값으로 수정하여 모델을 학습시킨 결과 train-set의 경우

  • 방법 1)
    RandomForest로 학습시킨 결과 베스트 스코어 1 이 나왔고, 평균 스코어는 0.9975384615384615 가 나왔다.
    모델에 영향을 미친 상위 10개 변수를 확인한 결과 아래 표와 같음을 확인할 수 있었다.

  • 방법 2)
    RandomForest로 학습시킨 결과 베스트 스코어 1이 나왔고, 평균 스코어는 0.994923076923077 이 나왔다.
    모델에 영향을 미친 상위 10개의 변수를 확인한 결과 아래 표와 같음을 확인할 수 있었다.

  • 방법 3)
    BoostingTree로 학습시킨 결과 베스트 스코어는 0.9998461538461537 이 나왔고, 평균 스코어는 0.9996923076923077 이 나왔다.
    feature_importance를 찍어보면 아래 표와 같이 순서대로 예측모델에 기여한 것을 확인할 수 있었다.

최종결과 및 마무리

[최종결과]

  • (방법1) label encoding을 했을 때 예측 결과가 가장 잘 나온 것을 확인할 수 있었다.

  • (방법2) top3만 가져와서 했을 때, 유의미한 변수들이 하나로 합쳐져서 판별 기준이 줄어들어 예측 점수가 낮게 나온 것으로 예상해보았다.
  • (방법3) 또한, one-hot encoding을 했을 때에는 컬럼 수가 너무 많아져 오히려 모델의 성능을 저하시킨 것으로 예상해보았다.

[마무리]

  • 예측 모델을 돌리기 전에는 cap-color가 식용여부에 영향을 가장 크게 미칠 것이라고 예상했었다.
  • 히트맵을 그려본 결과 식용여부(class)는 bruises, gill-color, stalk-root, ring-type, spore-print-color 와 강한 상관성을 가진다는 것을 확인했다.

  • 히트맵에서 식용여부와 odor 사이에는 상관성이 낮은 편이었지만 실제 예측 모델에서는 odor가 가장 높게 기여한 것을 확인할 수 있었다.
    상한 냄새가 나는 버섯은 독버섯일 확률이 매우 높기때문에 가까이 다가가지 않는 것이 좋을 것 같다.
    ☠️🚨하지만 실제로 독버섯을 냄새로 구분하기는 굉장히 위험한 방법이니 시도하지 않을 것을 권장한다. (어느정도 거리가 안전한지는 모름...)
  • 만약 버섯을 구분해야 한다면 spore-print-color가 검정(k), 갈색(n)인 것과 stalk-root가 club-shape(c), rooted(r)인 것이 독성이 없을 확률이 높다는 것을 알아냈다.

코드 파일 링크

방법1 코드 파일

방법2 코드 파일

방법3 코드 파일

0개의 댓글