TIL. (Today I Learned)

Day33. 머신러닝 결측치 인코딩/ TIL. 20240611

체대이터 2024. 6. 11. 21:44
To do list.

-머신러닝 활용 심화

-통계 4회차 세션

 


결측치

: 존재하지 않는 데이터

 

수치형데이터

-평균값으로 대치

-중앙값으로 대치(평균값이 대표성이 없는 경우)

 

범주형데이터

-최빈값으로 대치

 

사용함수

-간단한 삭제 / 대치

# 인포 매서드로 결측치 확인 ( age와 cabin에서 결측치가 있음을 알 수 있다)
titanic_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
#dropna 비어있는 행을 전부 삭제했으므로 데이터가 많이 날아감
titanic_df.dropna(axis= 0).info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 183 entries, 1 to 889
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  183 non-null    int64  
 1   Survived     183 non-null    int64  
 2   Pclass       183 non-null    int64  
 3   Name         183 non-null    object 
 4   Sex          183 non-null    object 
 5   Age          183 non-null    float64
 6   SibSp        183 non-null    int64  
 7   Parch        183 non-null    int64  
 8   Ticket       183 non-null    object 
 9   Fare         183 non-null    float64
 10  Cabin        183 non-null    object 
 11  Embarked     183 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 18.6+ KB
# Age컬럼의 비어있지 않은 값들만 조회
cond3 = (titanic_df['Age'].notna())
titanic_df[cond3].info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 714 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  714 non-null    int64  
 1   Survived     714 non-null    int64  
 2   Pclass       714 non-null    int64  
 3   Name         714 non-null    object 
 4   Sex          714 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        714 non-null    int64  
 7   Parch        714 non-null    int64  
 8   Ticket       714 non-null    object 
 9   Fare         714 non-null    float64
 10  Cabin        185 non-null    object 
 11  Embarked     712 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 72.5+ KB
# fillna 이용한 대치
age_mean = titanic_df['Age'].mean().round(2)
titanic_df['Age_mean'] = titanic_df['Age'].fillna(age_mean)

 

인코딩

: 어떤 정보를 정해진 규칙에 따라 변환하는것 - ex)숫자가 아닌 데이터를 숫자로 바꾸는것

-> 반대 : 디코딩

 

레이블 인코딩(Label Encoding)

  • 정의: 문자열 범주형 값을 고유한 숫자로 할당
    • 1등급 → 0
    • 2등급 → 1
    • 3등급 → 2

 

 

원-핫 인코딩(One-Hot Encoding)

  • 정의: 각 범주를 이진 형식으로 변환하는 기법
    • 빨강 → [1,0,0]
    • 파랑 → [0,1,0]
    • 초록 → [0,0,1]
# CSR 데이터 데이터프레임으로 만들기
csr_df = pd.DataFrame(csr_data.toarray(), columns = oe.get_feature_names_out())
# 기존 데이터프레임에 붙이기(옆으로)
pd.DataFrame([titaninc_df,csr_df], axis = 1)

 

 


데이터 분리

: 과대적합(Overfitting)이란 데이터를 너무 과도하게 학습한 나머지 해당 문제만 잘 맞추고 새로운 데이터를 제대로 예측 혹은 분류하지 못하는 현상 => 데이터 분리가 필요

 

과적합 해결 - 테스트 데이터의 분리

 

트레인 데이터와 테스트 데이터 분리 방식:

  • 일반적으로 데이터셋의 일정 비율(예: 70:30, 80:20 등)로 트레인 데이터와 테스트 데이터를 나눔
  • 데이터를 나눌 때는 무작위로 샘플을 선택하여 분리하는 것이 일반적
  • 무작위로 선택하는 것은 데이터의 편향을 방지하고 모델이 데이터의 일반적인 패턴을 학습하도록 함
  • 데이터를 나눌 때는 트레이닝 데이터가 더 많아야 함 / 트레이닝 데이터가 적으면 모델이 제대로 학습되지 않을 수 있음