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 등)로 트레인 데이터와 테스트 데이터를 나눔
- 데이터를 나눌 때는 무작위로 샘플을 선택하여 분리하는 것이 일반적
- 무작위로 선택하는 것은 데이터의 편향을 방지하고 모델이 데이터의 일반적인 패턴을 학습하도록 함
- 데이터를 나눌 때는 트레이닝 데이터가 더 많아야 함 / 트레이닝 데이터가 적으면 모델이 제대로 학습되지 않을 수 있음