210709 FUNDAMENTAL 10. 포켓몬

시에나 Sienna·2021년 7월 9일
0

AIFFEL

목록 보기
9/66
post-custom-banner

numpy.pandas/pandas 문법과 메서드/matplotlib/train&test 모델 학습을 종합적으로 활용해 보는 시간!! 떨린다😂 겸사겸사 다시 정리해보자! 화이팅!!😆


※ EDA(Exploratory Data Analysis, 탐색적 데이터 분석)

1. 데이터 준비

데이터셋 이해 -> 데이터 가져오기

	> mkdir -p ~/aiffel/pokemon_eda/data
        > ln -s ~/data* ~/aiffel/pokemon_eda/data
    

  • numpy & pandas : 1차원/2차원 형식의 표 데이터 라이브러리
  • seaborn & matplotlib : 시각화
    • matplotlib : raw한 느낌
    • seaborn : 고급화된 그래프

3. 데이터 살펴보기

1) 전체 컬럼이해 및 결측치

컬럼명data type설명
#int포켓몬 Id number
Namestr포켓몬 이름(unique)
Type1str첫번째 속성
Type2str두번째 속성(없는 경우 결측값 NaN)
Totalint총 Stats 합
HPint포켓몬 체력
Attackint물리 공격
Defenseint물리 방어력
Sp.Atkint특수 공격력
Sp.Defint특수 공격에 대한 방어력
Speedint수치가 높을 수록 선공격권 획득
Generationint포켓몬 세대(1~6세대)
Legendarybool전설의 포켓몬 True/False

4)

  • DataFrame.sum() : 요청된 축에 대한 값의 합계
    • axis : 0 index / 1 columns
  • scatterplot() : 산점도
    • hue = 'Legendary' : different colors by group
    • style = , # different shapes by group
    • s = : marker size

5)

(이걸 어떻게 정리하나??🙄)

4. 전설포켓몬 🆚 일반포켓몬 차이 비교

1) Total 값

(1) 전설 포켓몬

총 65마리의 전설의 포켓몬이 9개의 Total값만 가진다는 것은, 약 7.22마리 끼리는 같은 Total 스탯 값을 가진다는 의미

(2) 일반 포켓몬

약 3.77마리만 같은 Total 스탯 값을 가짐

(3) 결론

  • Total값의 다양성 : 일반포켓몬 = 전설포켓몬의 2배

  • 일반 포켓몬이 갖지 못하는 전설 포켓몬의 Total값 : 680, 720, 770, 780

    Total은 속성값의 다양성과 특수성(unique)을 확인함.
    전설 포켓몬 여부를 예측하는데 영향을 주는 요소

2) 이름

  • .concat() : DataFrame끼리 합치는 방법
  • .reset_index() : 기존 행 인덱스 제거하고 새로 인덱스를 데이터 열로 추가
    • Drop = : 인덱스로 세팅한 열을 DateFrame 내에서 삭제 여부
    • inplace = : 원본 객체 변경 여부
  • .apply() : DataFrame의 columns에 복잡한 연산을 vectorizing하는 함수
    • map() 대신 DataFrame 자료에서 적용

시사점

  1. 만약 "Latios"가 전설의 포켓몬이라면, "%%% Latios" 또한 전설의 포켓몬이다!
  2. 적어도 전설의 포켓몬에서 높은 빈도를 보이는 이름들의 모임이 존재한다!
  3. 전설의 포켓몬은 긴 이름을 가질 확률이 높다!

그렇다는데... 이해는 잘 안가....그래서 정리를 어찌해야할지...

5. 데이터 전처리

머신러닝을 수행할 사이킷런(scikit-learn)모델은 문자열을 입력값으로 허용하지 않음
숫자 데이터 또는 부울(bool) 데이터 등으로 전처리 과정(원-핫인코딩)이 필요

1) 이름의 길이

name_count 컬럼을 생성 후 길이가 10을 넘는지 아닌지에 대한 categorical 컬럼을 생성

2) 토큰 추출

legendary 포켓몬에서 많이 등장하는 이름 토큰 추출
» 토큰 포함 여부를 원-핫 인코딩(One-Hot Encoding) 처리

  • .isalpha() : 알파벳으로만 이루어졌는지 확인
  • .replace(찾을 값, 바꿀 값, [바꿀횟수]) : 문자열 변경

토큰화 하기

  • 정규 표현식을 사용
    • [A-Z] : 대문자 중 하나
    • [a-z] : 소문자 중 하나
    • * :하나 이상인 패턴 (*는 정규표현식 중에서 "반복"을 나타내는 기호)
  • ' '(띄어쓰기) 기준으로 이름을 토큰화 (??????뭔소리)
  • tokenize(name) : 문자열 토큰화
  • Counter 객체 : 개수를 세는데 특화된 클래스, 없는 내역은 Error 대신 0 반환
    • Counter.most_common(숫자) : 요소 빈도 수별 정렬, 숫자 만큼 출력
  • .str.contains() : Pandas에서 문자열 데이터셋의 특정 문구 포함여부 확인

3) Type1 & Type2 범주형 데이터 전처리

  • 범주형 데이터(Categorical Data)를 수치형 데이터(Numerical Data)로 변환하는 방식
    • 정수 인코딩(Integer Encoding)
      • but! 서수 관계(ordinal relationship)가 존재하지 않는 범주형 변수의 경우, 정수 인코딩으로는 충분하지 못 함
    • 원-핫 인코딩(One-Hot Encoding)❗❕❗❕

6.???

1) 베이스라인(Baseline)

  • 가장 기초적인 방법으로 만든 모델
  • 성능 하한선을 제공

2) 의사결정트리(Decision Tree)로 학습시키기

  • random_state 인자 : test 단계에서 랜덤성에 의한 학습결과 차이를 방지
  • random_state는 random 값을 고정하는 역할이나 어떤 수가 오든 상관없음
  • 즉, random_state 인자는 random 함수의 seed값(시작 숫자)

가설검정

실제 True실제 False
통계적결정 TrueTP(True Positive)
옳은 결정(1α1-\alpha)
FP(False Positive)
제2종오류(β\beta = 검정력)
통계적결정 FalseFN(False Negative)
제1종오류(α\alpha = 유의수준)
TN(True Negative)
옳은 결정(1β1-\beta)

정확도(Accuracy) : 실제값으로 얼마나 가까이 있는지 나타냄
$$ (Accurancy) = \frac{TP + TN}{TP+TN +FP+FN} $$

정밀도(Precision)

  • 모델이 True라고 분류한 것 중에서 실제 True인 것의 비율
    $$ (Precision) = \frac{TP}{TP+FP}$$

재현율(Recall)

  • 실제 True인 것 중에서 모델이 True라고 예측한 것의 비율
    $$ (Recall) = \frac{TP}{TP+FN} $$

성능평가 종류

  • confusion_matrix(y_true, y_pred)
  • accuracy_score(y_true, y_pred)
  • precision_score(y_true, y_pred)
  • recall_score(y_true, y_pred)
  • fbeta_score(y_true, y_pred, beta)
  • f1_score(y_true, y_pred)
  • classfication_report(y_true, y_pred)
  • roc_curve
  • auc
    분류 성능평가

피쳐 엔지니어링(Feature Engineering)

  • 원시 데이터에서 새로운 특성 생성, 전처리 등의 가공을 하는 것
  • 머신러닝 문제에 대해서 타겟에 대해서 최고로 잘 표현할 수 있게 가공되지 않은 데이터를 가공하는 것
post-custom-banner

1개의 댓글

comment-user-thumbnail
2021년 7월 12일

정리 깔끔하게 하셨네요!👍 6번은 노드에 없던 내용 같은데, 따로 찾으신 내용인가 보네요.

답글 달기