Machine_Learning_Project
포켓몬스터 일반/전설 몬스터 분류하기
전체 Flow
- 전설몬스텅 분류를 위한 데이터 셋 분석
- 그래프, 피벗테이블을 활용 EDA 진행
- 전처리
- 데이터셋 분리, Base_line 과 비교하며 학습
총 코드 참조 링크
Github
하고자 하는 목적이 뭔지 정확하게 설정부터 필요!
목적에 영향을 줄 수 있는 피처 고려
1. 데이터셋 만들기
- 라이브러리 호출
- 데이터 불러오기 (DataFrame화 되어 있는 dataset) - pandas 활용
- 데이터 샘플 확인
- 원본 데이터 유지(.copy)
- 데이터 셋의 피처(컬럼) 확인
(label 컬럼이 존재)
- legendary, originary 데이터 구분
2. EDA (영향을 주는 컬럼들 어떻게 처리할지 분석하는 과정)
- 빈 데이터(결측치 NaN) 여부 확인
- 전체 컬럼 이해하기(큰 데이터셋이 아니므로 전체적으로 확인)
- 컬럼 수와 컬럼명 확인
- 컬럼 별 type 확인
(범주형 데이터와 수치형 데이터 구분해서 전처리 하기 위함)
- len, set 함수로 중복 데이터 확인
(unique 값 확인을 위함, ex. name 같은 경우는 unique 한 경우가 많고, '#'컬럼은 중복이 있음)
- Type1,2 속성 확인(랜덤 인덱스 확인)
- Type1,2 속성의 각 종류가 몇가지 인지 확인
- 종류의 수가 다르기 때문에 (차집합 함수로 다른 type 확인)
- Type 변수에 저장 처리
(일반/전설 속성 분포를 확인 위함)
- Type2에 다른 값 NaN 확인 (.isna().sum() 함수 활용)
- 데이터 분포 시각화 (plot 활용, plt)
1) 속성 별 데이터 분포 확인 (그래프)
2) 속성 별 데이터 비율 확인 (피벗 테이블, pivot_tabel).sort(정렬)
- Type2 분포도 시각화
- Total 값 검층 (Total=stats 별 합)
(stats을 전부 더한 컬럼 추가 생성 후 Total 컬럼과 비교)
- 전설/일반 몬스터 Total 값에 대한 분포 plot
- 각각의 stats 컬럼 별 분포 확인 (각 stats 마다의 분석을 위함)
- Generation(세대) plot 으로 확인
- Total 값들의 집합 확인 (일반/전설의 토탈 별 몬스터 수 분포 확인)
(전설 몬스터가 특정 Total 값에 집중되어 있음 확인)
- Name 컬럼도 영향이 있는지 확인 (pd.concat().reset_index로 전설 이름 확인)
- Name에 전설 몬스터는 특정 단어가 많이 들어가 있음을 확인
(분류에 있어 영향을 줌)
- Name이 긴 경우도 전설일 경우가 많다 (해당 피처 생성)
- Name의 길이 컬럼도 시각화
(길이 10 이상의 이름이 많은 경우 확인)
3. 전처리
- 분류에 영향을 주는 데이터
1) Name(토큰화)
2) Total,stats
3) Type1,2 (인코딩)
- Name의 길이 10 기준 위아래 판별 categorical 컬럼 생성 (True,False)
- Name 컬럼 전처리
1) 많이 쓰이는 토큰 확인하고 컬럼 생성
2) 띄어쓰기 없애는 컬럼 생성 (.apply(lambda 식 활용)
3) 알파벳이 아닌 문자를 포함하는 경우 처리 후 컬럼 생성
- 알파벳이 아닌 데이터 알파벳으로 전환 (isalpha == False)
- Name 토큰화
1) 라이브러리 re 호출
2) 샘플 데이터 변수에 저장
3) 공백 기준으로 쪼개기 (토큰)
4) 1번째 인덱스 변수에 저장
5) 대문자 자르기 (정규표현식 사용)
6) 위 쪼개는 과정을 for문으로 반복해서 token 화
7) 토큰화를 모든 이름에 적용시킬 함수 생성
8) 전체 전설의 데이터셋에 적용 (중복 확인까지)
- 최빈 토큰 추출 (collections Counter 라이브러리 활용)
- 가장 많이 등장하는 요소 횟수 정렬
- 전설 몬스터 Name에 최빈도 토큰 있는지 여부의 컬럼 생성 (True면 전설일 확률이 높다)
- Type1, 2 전처리 (one-hot-Encoding)
4. Baseline 모델 만들기
- 원본 데이터 호출
- 문자열을 빼야 해서 컬럼 확인 후 필요 컬럼 리스트 생성
- target 데이터인 Legendary 컬럼 변수에 저장
- 필요 컬럼 리스트 (features) x에 저장
5. 의사결정트리 모델 학습
- train, test 데이터 분리 후 모델 학습
- 채점 (confusion_matrix(), classification_report 활용)
6. 전처리 데이터로 모델 학습
- 데이터가 크지 않으니 사용할 컬럼 변수 저장 (요약할 수 있는 코드 고민해보자)
- target 저장
- 전처리 한 데이터 x에 저장
- y에 target 컬럼 저장
- 전처리한 데이터 분리
- 모델 학습 및 예측
- 채점 (confusion_matrix(), classification_report 활용)
- recall 0.62 > 0.92로 상승 확인