본문 바로가기
Tech

Ch6. 데이터 전처리 - 레이블 인코딩, 스케일링, 변수선택

by keneth 2024. 6. 8.
반응형

Sec2. 범주형 인코딩(Categorical Encoding)

- 컴퓨터가 데이터를 이해할 수 있도록 범주형 데이터를 수치형 데이터로 변환하는 과정

 

1. 레이블 인코딩

범주형 데이터에 숫자 레이블을 할당, 알파벳 순으로 번호를 메기는 것

 

1) 판다스에서 레이블 인코딩

판다스는 등장하는 순서대로 숫자를 매핑함

# 데이터 구간화 전에 원본 불러오기
df=df_origin.copy()
# factorize로 airline 칼럼 레이블 인코딩
df["label_encoding"]=pd.factorize(df["airline"])[0].reshape(-1,1)
df.head()

# 제대로 인코딩 되었는지 확인하기 위해 airline과 label_encoding 칼럼의 빈도표 만들기
print(df['airline'].value_counts())
print(df['label_encoding'].value_counts())

print 함수를 사용한 이유는, 두 행을 같이 실행시키기 위해서임..

print 함수 없이 두 행을 같이 실행하면 아래 행만 실행됨

 

2)사이킷런으로 레이블 인코딩(sckit-learn)

파이선에서 머신러닝 분석할 때 사용하는 라이브러리

#사이킷런 패키지의 LabelEncoder 불러오기
from sklearn.preprocessing import LabelEncoder

# LabelEncoder로 airline 칼럼 레이블 인코딩 하기
le = LabelEncoder()
df["airline_Label_Encoder"] = le.fit_transform(df['airline'])
df.head()

# 제대로 인코딩 되었는지 확인하기 위해 airline과 airline_Label_Encoder 칼럼의 빈도표 만들기
print(df['airline'].value_counts())
print(df['airline_Label_Encoder'].value_counts())

알파벳 순으로 인코딩 되었음

 

inverse_transform으로 역변환 가능

le.inverse_transform(df["airline_Label_Encoder"]).reshape(-1,1)

2. 원핫 인코딩

한개의 컬럼에 나오는 엔트리를 각각의 컬럼으로 분리하고, 

엔트리에 맞는 행만 1로, 나머지는 0으로 변환하는 인코딩

 

1) 판다스에서 원핫 인코딩 하기

판다스에서 get_dummies 메소드 사용

# 2.원핫인코딩(OneHotEncoding)

df=df_origin.copy()
pd.get_dummies(df['class'])

 

# 원핫인코딩 결과를 데이터에 반영하기
df=pd.get_dummies(df, columns =['class'])
df.head()

class 컬럼이 없어지고 class_Business와 class_Economy 칼럼이 생성되었음

 

 

2) 사이킷런으로 원핫 인코딩 하기

판다스의 get_dummies처럼 바로 데이터프레임에 반영하지 못함

원한 인코딩 후 데이터를 추가하기 위해 칼럼을 만들고 추가하는 작업이 필요함

# 원본 데이터 불러오기
df=df_origin.copy()

#사이킷런에서 OneHotEncoding 불러오기
from sklearn.preprocessing import OneHotEncoder

# OneHotEncoder로 원핫 인코딩 하기
oh = OneHotEncoder()
encoder=oh.fit_transform(df['class'].values.reshape(-1,1)).toarray()

# 원핫 인코딩 결과를 데이터프레임으로 만들기
df_OneHot = pd.DataFrame(encoder, columns=["classsss_"+str(oh.categories_[0][i]) for i in range (len(oh.categories_[0]))])

# 원핫 인코딩 결과를 원본 데이터에 붙여넣기
df1=pd.concat([df, df_OneHot], axis=1)
df1.head()

 

 

 

 

Sec3. 스케일링

수치형 데이터의 상대적 크기차이를 제거하는 과정

1. 정규화(min-Max scaling) : 데이터의 범위를 0~1로 변환하여 데이터 분포를 조정하는 가장 일반적인 정규화 방법

x(std)=(xi-Xmin)/(Xmax-Xmin)

# 원본 불러오기
df=df_origin.copy()

# 수치형 데이터만 분리하여 데이터프레임 만들기
df_num=df[['duration','days_left','price']]

# 정규화 수식 적용하기
df_num=(df_num - df_num.min())/(df_num.max()-df_num.min())
df_num.head()

df_num.describe()

최소값과 최대값이 0과 1로 정규화 되었음

정규화는 극단적인 이상치에 민감하므로, 이상치를 처리한 뒤 정규화를 해야 함

 

2. 표준화

수치형 데이터를 평균이 0이고, 표준편차가 1인 표준정규분포로 변환하는 과정

Xnorm = (Xi-Xmean)/Xstd

# 수치형데이터만 분리해서 데이터프레임 만들기
df_num=df[['duration','days_left','price']]

# 표준화 수식 적용하기
df_num=(df_num-df_num.mean())/df_num.std()
df_num.head()

 

표준화를 위해 #요약데이터, #요약통계량 확인해보기

# 요약통계량 확인하기
df_num.describe()

평균이 0(에 매우 가깝고), 표준편차가 1로 표준화 되었음

 

데이터프레임에 표준화된 데이터 붙이기

# 표준화된 데이터 붙이기
# 기존 데이터 삭제
df=df.drop(['duration','days_left','price'], axis=1)

# 표준화된 데이터 붙이기
df=pd.concat([df, df_num], axis=1)
df.head()

Sec4. 변수 선택하기

1. 신규 변수 생성하기

1) 하나의 데이터로 여러 개의 새로운 컬럼 만들기

apply, lambda 활용

lambda는 이름없는 함수를 정의하는 기능, 재사용 가능성이 없는 함수 만들어 쓸때 유용

 

항공기 기체명을 제조사와 모델명으로 분리하여 새로운 칼럼을 만드는 실습

# 항공기 기종을 제조사와 모델명으로 분리하는 함수 만들기
def split_flight(xx):
    # - 문자 앞을 제조사로 지정
    manufacture=xx.split("-")[0]
    # - 문자 뒤를 모델명ㅇ로 지정
    model=xx.split("-")[1]
    # 제조사, 모델명을 리턴
    return manufacture, model
# df['flight']를 split_flight의 파라미터로 넣어 실행하는 lambda, apply를 적용하기
# zip 함수 사용해 df['manufacture'], df['model_#']에 저장하기
df['manufacture'], df['model_#']=zip(*df['flight'].apply(lambda x : split_flight(x)))
df.head()

2) 여러 개의 데이터로 하나의 새로운 칼럼 만들기

lambda와 apply 적용

 

실습: 출발지와 도착지를 합쳐, 경로 칼럼 만들기

df['route']=df.apply(lambda x : (x['source_city'], x['destination_city']), axis=1)
df.head()

 

2. 변수 선택하기

1) RFE(Recursive Feature Elimination) : 머신러닝에 사용되는 변수선택방법, 원하는 변수에 도달할 때까지 가장 중요하지 않은 변수를 재귀적으로 제거하는 방법

변수의 중요성은 의사결정나무의 번수 중요도, 선형 모델의 계수값 또느 ㄴ신경망의 가중치 계수의 크기 등의 점수 지표를 기반으로 결정됨

2) RFE-CV(RFE with Cross Validation) RFE의 단점은 몇개의 변수를 남겨야 하는지 사용자가 직접 정의 해야 함, 이런 단점을 극복하기 위해 등장한 것이 RFE-CV

변수 선택 과정에서 교차검증을 추가한 것

3) UFS(Univariate Feature Selection) 일변량 통계 테스트를 기반으로 최상의 변수를 선택하여 작동함

반응형