AI 부트캠프 - 5일차

Cookie Baking·2024년 10월 7일

AI 부트 캠프 TIL

목록 보기
5/42

데이터 전처리

1. IQR을 사용한 이상치 탐지
IQR은 1사분위 수 (Q1)과 3사분위 수 (Q3)의 차이로, 이 범위를 벗어나는 데이터를 이상치로 간주할 수 있음

Q1 = df["age"].quantile(0.25)
Q3 = df["age"].quantile(0.75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

outliers = df[(df["age"] < lower_bound) | (df["age"] > upper_bound)]

print(outliers)
  • 나이를 구해야 하는데 0보다 작은 값들이 bound로 나왔다? -> 이상치임
  • 이상치를 구하는 기준은 절대적이지 않음을 주의하자
  • 이상치에 민감함
  • 별로 비추천
  • 추천하는 탐지 방법으로는 기술 통계량 확인, 시각화가 있겠음

2. 이상치 처리

1. 이상치 감지

  • titanic.info() 하면 Non-Null 갯수가 나오게 됨 전체에서 Non-Null 갯수를 빼주면 Null 갯수가 나오게 되겠음

2-1. 결측치 처리

  • Null 값 채워넣기 : df["처리하고자 하는 열"].fillna(df["처리하고자 하는 열"].mean, inplace=True)를 함
  • Null 값들 버리기 : df["처리하고자 하는 열"].dropna()

2-2. 이상치 처리

  • IQR 방법을 사용해 DataFrame에 적용

3. 데이터 전처리
- 데이터 정규화

정규화는 데이터의 범위를 0과 1 사이로 변환하는 과정이다.
이는 서로 다른 범위를 가진 데이터를 동일한 스케일로 맞추어 비교하기 쉽게 만듦

전처리를 위한 라이브러리 : scikit-learn

  • 사용을 할 때에는 sklearn을 해야 함
  • MinMaxScalar : 최솟값은 0, 최댓값은 1로 바꿔주는 정규화
 from sklearn.preprocessing import MinMaxScaler
 
 scaler = MinMaxScaler()
 normalized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
 print(normalized_df)
  1. Z-점수 표준화
    데이터에서 평균을 빼고 표준 편차로 나누어, 모든 데이터가 표준 정규분포 (평균 0, 표준편차 1)을 따르도록 만듭니다.
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
standardized_df = pd.DataFrame(scaler.fit_transform(df), columns = df.columns)

print(standardized_df)
  1. 비선형 변환
    데이터의 비정상적인 분포를 정규 분포에 가깝게 만들기 위해 사용함 대표적인 방법으로는 로그 변환, 제곱근 변환, 박스-콕스 변환 등이 있음
  • 로그 변환
    로그 변환은 양의 데이터에서 주로 사용되며, 데이터의 분포를 좁히는 데 유용함
    특히 지수 분포를 가진 데이터를 다룰 때 효과적임

  • 제곱근 변환
    제곱근 변환은 데이터의 분포를 평탄하게 만들기 위한 또 다른 방법임. 특히, 포아송 분포를 가진 데이터에서 사용됨

(특정 시간 동안 콜센터에 걸려오는 전화의 수, 도로를 통과하는 차량의 수, 페이지에 나타나는 오타의 수 등이 포아송 분포의 예가 될 수 있습니다. - ChatGPT)

  • 박스-콕스 변환
    박스-콕스 변환은 다양한 형태의 데이터 분포를 정규 분포에 가깝게 변환하기 위해 사용됨. 이 방법은 함수 데이터에서만 사용 가능함

(모델이 정규 분포를 따를 때 사용하면 모델의 성능을 더 높여줄 수 있겠음)

  • !pip3 install scipy
import numpy as np

df["특성1_log"] = np.log(df["특성1"])

print(df)

df["특성1_sqrt"] = np.sqrt(df["특성1_sqrt"])

print(df)

from scipy.stats import boxcox

df["특성1_boxcox"], _ = boxcox(df["특성1"])

print(df)


# RobustScaler 사용하기
# 중앙값과 IQR 방법을 이용해서 scaling 하는 것임

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
scaled_df = scaler.fit_transform(df)

scaled_df = pd.DataFrame(scaled_df, columns=df.columns)
scaled_df

3. 데이터 전처리
- 인코딩

  • 예시 : 범주형 데이터를 수치형 데이터로 변환함
from sklearn.preprocessing import LabelEncoder

data = {"과일" : ["사과", "바나나", "오렌지", "바나나"]}
df = pd.DataFrame(data)
label_encoder = LabelEncoder()
df["과일_인코딩"] = label_encoder.fit_transform(df["과일"])

# 그러면 과일_인코딩 칼럼에 과일 이름이 인코딩한 결과값이 들어가게 됨
  • 원-핫 인코딩
    원-핫 인코딩은 각 범주를 이진 벡터로 변환함
    각 범주는 고유한 열을 가지며, 해당하는 열에는 1을, 나머지 열에는 0이 할당됨

  • 장점 : 범주형 데이터에 순서가 없을 때 사용하기 좋음, 모델이 범주 간의 순서나 관계를 인식하지 않고 각 범주를 독립적으로 처리할 수 있음

df_one_hot = pd.get_dummies(df["과일"], prefix="과일")
df_one_hot
  • 차원 축소 인코딩
    - 범주형 데이터가 많을 때 유용함
    각 범주를 데이터셋 내에서 출현 빈도로 인코딩함
df["과일_빈도"] = df["과일"].map(df["과일"].value_counts())

print(df)
  • 순서형 인코딩
    - 순서가 있는 범주형 데이터를 그 순서에 따라 숫자로 변환하는 방식
    직접 인코딩을 하는 방식으로 매핑이 중요할 경우 사용함
data = {"등급" : ["낮음", "중간", "높음", "중간", "높음"]}
df = pd.DataFrame(data)


# 순서형 인코딩
order = {"낮음": 1, "중간": 2, "높음": 3}
df["등급_인코딩"] = df["등급"].map(order)
print(df)
  1. 임베딩
    고차원 데이터를 저차원 데이터로 바꿔주는 것임
    유사할수록 유사도가 높게 나오는 것이 특징임

0개의 댓글