세조목

머신러닝 심화 복습(결측치, 인코딩&스케일링)(24.05.07) 본문

데이터 분석 공부/머신러닝

머신러닝 심화 복습(결측치, 인코딩&스케일링)(24.05.07)

세조목 2024. 5. 7. 13:12

결측치

표준편차가 크다 = 평균에서 벗어난 값들이 많다
so 표준편차가 크다면 결측치를 평균값으로 대체하기보단 중앙값으로 대체하는게 낫다.
 ※ 범주형 데이터의 경우 최빈값으로 대체
표준편차가 큰지는 어떻게 알 수 있지??
→ 평균값과 비교
   - 평균값보다 표준편차가 크다면 데이터들이 평균값에서 많이 벗어나 있다는 의미임
 

결측치 확인

.notna()
→ 결측치 없는 데이터만 확인 가능
.isna()
→ 결측치인 데이터만 확인 가능
 

결측치 처리

from sklearn.impute import SimpleImputer
si = SimpleImputer()
si.fit(titanic_df[['Age']])
titanic_df['Age_si_mean'] = si.transform(titanic_df[['Age']])
# default 값은 평균값

 

인코딩 & 스케일링

범주형 데이터 인코딩

1. 레이블 인코딩

→ 범주에 속하는 값에 고유한 숫자를 할당함

<예시>
A → 0
B → 1
C → 2
D → 3

※ 인코딩 결과값인 0~3은 크기를 나타내는 것이 아닌데 나타내는 것으로 모델이 잘못 해석할 수 있음
※ 따라서 순서 구분이 필요한 범주형 데이터만 레이블 인코딩 진행해줘야 함

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

le.fit(titanic_df[['Sex']])
titanic_df['Sex_le'] = le.transform(titanic_df[['Sex']])

 
 

2. 원-핫 인코딩

→ 각 범주를 이진 형식으로 변환함

from sklearn.preprocessing import OneHotEncoder
oe = OneHotEncoder()

oe.fit(titanic_df[['Embarked']])
embarked_csr = oe.transform(titanic_df[['Embarked']])
embarked_csr_df = pd.DataFrame(embarked_csr.toarray(), columns=oe.get_feature_names_out())

pd.concat([titanic_df, embarked_csr_df], axis=1)

 

수치형 데이터 스케일링

1. 표준화(Standardization)

 - 각 데이터에서 평균을 빼고, 그 값을 표준편차로 나누어줌
 - 평균을 0으로 분산을 1로 조정해줌

from sklearn.preprocessing import StandardScaler
sd_sc = StandardScaler()

# fit, transform 분리
sd_sc.fit(titanic_df[['Fare']])
titanic_df['Fare_sd_sc'] = sd_sc.transform(titanic_df[['Fare']])

# fit_transform 메서드 사용
titanic_df['Fare_sd_sc'] = sd_sc.fit_transform(titanic_df[['Fare']])

 

2. 정규화(Normalization)

 - 각 데이터에서 최소값을 빼고, 그 값을 최대값 - 최소값의 차로 나누어 줌
 - 모든 값이 0과 1 사이로 들어옴

from sklearn.preprocessing import MinMaxScaler
mm_sc = MinMaxScaler()

# fit, transform 분리
mm_sc.fit(titanic_df[['Age_mean']]
titanic_df['Age_mean_mm_sc'] = mm.sc.transform(titanic_df[['Age_mean']]

# fit_transform 메서드 사용
titanic_df['Age_mean_mm_sc'] = mm_sc.fit_transform(titanic_df[['Age_mean']])

 

3. 로버스트(Robust)

 - 각 데이터에서 중앙값을 빼고, 그 값을 IQR(3분위값 - 1분위값)으로 나누어 줌

from sklearn.preprocessing import RobustScaler
rb_sc = RobustScaler()

# fit, transform 분리
rb_sc.fit(titanic_df[['Fare']])
titanic_df['Fare_rb_sc'] = rb_sc.transform(titanic_df[['Fare']])

# fit_transform 메서드 사용
titanic_df['Fare_rb_sc'] = rb_sc.fit_transform(titanic_df[['Fare']])