생활코딩

Coding Everybody

코스 전체목록

닫기

세번째 딥러닝 - 아이리스 품종 분류

수업소개

아이리스 품종을 분류하는 딥러닝 모델을 텐서플로우를 이용하여 만들어 보고, 분류모델과 회귀모델의 차이점을 이해합니다. 범주형 변수의 처리 방법인 원핫인코딩을 해야하는 이유와 활성화함수 softmax를 사용하는 이유를 학습합니다.

강의 

 

원핫인코딩

 

소프트맥스

 

실습 

 

소스코드

colab |  backend.ai

###########################
# 라이브러리 사용
import tensorflow as tf
import pandas as pd

###########################
# 1.과거의 데이터를 준비합니다.
파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv'
아이리스 = pd.read_csv(파일경로)
아이리스.head()

# 원핫인코딩
아이리스 = pd.get_dummies(아이리스)

# 종속변수, 독립변수
독립 = 아이리스[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = 아이리스[['품종_setosa', '품종_versicolor', '품종_virginica']]
print(독립.shape, 종속.shape)

###########################
# 2. 모델의 구조를 만듭니다
X = tf.keras.layers.Input(shape=[4])
Y = tf.keras.layers.Dense(3, activation='softmax')(X)
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy',
              metrics='accuracy')

###########################
# 3.데이터로 모델을 학습(FIT)합니다.
model.fit(독립, 종속, epochs=1000, verbose=0)
model.fit(독립, 종속, epochs=10)

###########################
# 4. 모델을 이용합니다
# 맨 처음 데이터 5개
print(model.predict(독립[:5]))
print(종속[:5])

# 맨 마지막 데이터 5개
print(model.predict(독립[-5:]))
print(종속[-5:])

###########################
# weights & bias 출력
print(model.get_weights())

댓글

댓글 본문
  1. 시아네스
    231109.
  2. Yeongmi Kim
    유튜브에서 제공해주는 내용이나, 생활코딩 머신러닝 책자를 보고 있는데요.
    아이리스는 꽃받침(sepal)이 더 크고, 꽃잎(petal)이 더 작아서

    독립 = 아이리스[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
    위부분에 이렇게 컬럼을 적어주셨는데,,
    독립 = 아이리스[['꽃받침길이', '꽃받침폭', '꽃잎길이', '꽃잎목']]
    이렇게 수정이 필요하다는 생각입니다.
  3. 이선비
    클래스가 1500개 인데 독립변수가 8개라면, 아마도 현재 준비된 데이터로 학습할 수 있는 최대치가 이정도 인 것 같아요. 1500개의 클래스를 구분할 수 있을만한 정보가 데이터 안에 있어야 학습을 할 수 있습니다. 데이터의 양보다는 종속변수를 판단할 수 있는 근거가 될만한 요인들(독립변수들)을 찾아내서 데이터를 더 풍부하게 해주셔야 할 것 같아요. 데이터가 충분한지를 판단할 수 있는 기준은 해당 데이터를 가지고 사람은 판단할 수 있는가 입니다. 사람이 판단을 할 수 없는 데이터는 모델도 학습할 수 없다고 생각하시면 되겠습니다.

    만약, 위의 사람은 판단할 수 있다고, 'yes'라고 확실히 말할 수 있다면 그때는 모델을 조정하거나 데이터의 양을 늘려주는 것이 의미가 있겠습니다. 적절한 데이터의 양이 어느정도인지 판단이 어려운데요. 정확한 답이 있는 내용은 아니고, 개인적으로 클래스당 30개 정도라는 기준으로 데이터의 양을 가늠하고 있습니다. 통계에서 표본의 개수로 제시하는 기준이 30개거든요. 클래스가 1500개라고 하셨으니 이 기준으로 생각해보자면 1500 * 30 = 45000 정도의 데이터는 있는 것이 좋을 것 같아요.

    그리고 , 데이터는 train set과 test set을 분리해 두시고, 모델 검증을 할 때, 학습에 사용하지 않은 test set을 가지고 검증을 하셔야 합니다. 이 부분은 '모델 검증' 키워드로 검색을 하시면 정보를 얻으실 수 있을 거에요.
  4. dudjswp
    이선비님 답변 감사합니다.

    조언해주신데로 정수값으로 인코딩 후 loss 함수 sparse_categorical_crossentropy로 적용한 뒤 학습시키니 학습속도가 많이 개선됐습니다.

    마지막으로 한가지만 더 질문드리고 싶습니다.

    처음 질문드린것과 동일하게 "독립" 변수에 들어갈 컬럼의 종류는 8종류이고 "종속"에 들어가는 컬럼의 종류가 1500종 이상이며 데이터가 2만 로우가좀 넘을 때 학습횟수에 대해서 질문드리고 싶습니다.

    현재 전체 데이터를 2300번 정도 반복 학습을 시켜봤는데 정확도가 43%정도 밖에 안나오더라구요.
    반복 횟수가 많아질수록 정확도는 오르고 손실률은 떨어지긴 하는데.. 갈수록 정확도가 오르는 폭이 작아지니 몇번 반복해야 정확도 90%이상에 도달할지 알 수 없는 상태입니다.

    머신러닝을 접한게 이번이 처음인지라 반복횟수가 더 필요한것인지 아니면 모델을 잘못 만든건지에 대해 확신이 없습니다.
    일반적으로 이정도의 데이터를 학습시킬 때 몇번 정도의 반복 학습이 필요할까요 ?
    정확하게 몇번 이상이다 이런 구체적인 값을 원하는 것은 아닙니다만.. 현재 모델이 올바르게 생성된건지에 대해 판단할 수 있는 방법을 알지못해서 이렇게 질문드립니다.

    참고로 말씀드리면 현재 모델에 "독립" 변수는 그대로 유지하고 "종속" 변수의 데이터 종류를 7종류로 줄이고 데이터의 양을 10로우로 줄여서 현재 모델에 학습시켰을 때는 6만번 정도의 반복학습 후에 100%의 정확도로 제가 원하는 값을 반환했습니다.

    감사합니다.
    대화보기
    • 이선비
      안녕하세요. :)

      종속변수의 범주가 많을 때에는 정수(label indexing)로 인코딩 하시고 sparse_categorical_crossentropy를 이용하여 분류하시면 됩니다. 제가 활용해 본 바로는 3000개 범주도 학습하여 모델을 활용하고 있습니다.
      샘플 콜랩 노트북을 참고해주세요. https://colab.research.google.com......Ws8

      더불어, 많은 범주의 칼럼을 입력으로 사용하는 경우에는 embedding 이라는 기법을 사용하시면 되는데요. (vecterize 라고도 합니다.) 자연어처리에서 수십만개의 단어들은 원핫인코딩으로 처리할 수 없는데요. 이 때 사용하는 기법으로, 엔지니어가 지정한 수십 혹은 수백 차원의 공간으로 벡터화해서 사용하는 기법입니다.
      이와 관련되서는 아래 문서를 참고해보시면 도움이 될거에요. :)
      https://wikidocs.net/33793

      다만, embedding된 벡터를 종속변수로 사용하고자 할 때에는 이에 맞는 loss 설정해야 하는데요. mse나 cosine 유사도 함수를 사용하는 것이 가장 단순한 방법이고요. 종속변수의 특징에 따라서 loss 합수를 맞추어 주어야 제대로 된 모델을 학습시킬 수 있습니다. 모델의 결과를 다시 범주로 바꾸는 과정에서도 최근점 범주를 찾아내는 과정이 추가로 있어야 해서 추가 학습이 괘 필요할 거에요. 일단, 키워드 중심으로 이해를 해두시면 좋을 것 같아요.
      대화보기
      • dudjswp
        안녕하세요.
        생활코딩 게시물 덕에 tensorflow 입문했습니다.
        항상 양질의 정보를 제공해주셔서 정말 감사드립니다.

        이번 강의에서 소개해주신 softmax와 categorical_crossentropy를 사용해서 주문데이터 학습을 통해 배차 정보를 도출해내는 모델을 만들어서 테스트 중인데 한가지 궁금한 사항이 있어서 질문올립니다.

        만약 상기 예제에서 분류해야 하는 품종의 종류가 수백건 수천건으로 늘어날 경우 원핫 인코딩을 통해 "아이리스" 변수에 저장되는 데이터의 컬럼 수 또한 비례해서 증가할텐데 이렇게 크고 많은 양의 데이터를 학습시킬 때도 동일하게 softmax, categorical_crossentropy를 사용하는게 맞을까요 ?

        제가 테스트중인 데이터를 상기 예제에 대입시키면 "독립" 변수에 들어갈 데이터 컬럼은 8 종류이고 "종속" 변수에 들어갈 데이터는 1500 컬럼이 넘습니다.
        이 상태로 데이터를 학습시키니 속도가 너무 느려서 좀더 효율적인 방법은 없는지 찾아보다 질문올립니다.
      • apple
        야학...ㅋㅋㅋ 주학인데...ㅋ
      • 자바송장
        완료
      • kwaife
        완료
      • 솔나무
        함수로 감싸는 새로운 방법
        대학강의에서 이해가 덜 됐던 부분이 바로 이해됐어요!
        감사합니다.
      • Yu Han Noh
        완료
      • 루피밤비집사
        완료
      • 김정석
        감사합니다!
      • 완료
      • 인간지능
        수고하셨습니다. 완료
      • 김영환
        완료
      • Poroporo
        완료:)
      • 조예인
        감사합니다.
      • 매운탕탕탕수
        완료
      • shg7271
        210726
      • amuronamie
        완료!
      • Hotbrains
        완료~ 감사합니다.
      • 이덕규
        완료
      • songji
      • 이성민
        완료!
      • semin3993
        완료!
      • 210721
      • Naked Lunch
        야학 3기! 분류형 범주가 교집합을 갖는 복잡한 다이어그램 상황에서도 수치를 통해 쉽게 여러 범주중 포함된 영역을 나타낼 수 있겠다!
      • 이지윤
        완료!
      • minkey
        야학3기 21.07.20 완료
      • 엠제이
        잘 보았습니다.
      • 낭만코더
        선비 선생님 오늘도 수고하셨어요!
      • 정효빈
        완료했습니다.
      • jwoh
        21-05-06
      • 박준휘
        감사합니다!
      • 장청룡
        20210311 완료
      • 범벌
        완료
      • 청춘낭비금물
        완료
      • ericpark
        완료했습니다.
      • 조지아
        완료
      • DreamComeTrue
        완료!
      • 바이크
        완료
      • Juni
        완료
      • agg98
        완료
      • Mikiss
        [array([[ 2.7410939, 0.8725091, -1.4882833],
        [ 7.978472 , 1.2467078, -2.321665 ],
        [-11.083655 , -2.114099 , 2.0016809],
        [-14.283118 , -3.2481778, 4.83756 ]], dtype=float32), array([ 5.679383 , 3.9653516, -4.7026 ], dtype=float32)]
      • jeseung
        완료!
      • 손님입장
        완료
      • 후니
        완료
      • Noah
        완료
      • 차차caca
        완료!
      버전 관리
      이선비
      현재 버전
      선택 버전
      graphittie 자세히 보기