Data encoding
레이블(Label)인코딩과 원핫(One-hot)인코딩 소개
Last updated
레이블(Label)인코딩과 원핫(One-hot)인코딩 소개
Last updated
문자열 데이터 값들을 숫자 값(Categorical )으로 변환하는 방식이지만 숫자값들이 서로 연관이 없음에 관계성(대소관계)이 생겨 원치 않은 방향으로 흐를 수 있다.
파이썬 머신러닝완벽가이드 참조
from sklearn.preprocessing import LabelEncoder
Appliances = [ 'TV', '냉장고', '에어드레서' , '세탁기', '노트북', '모니터', '기타']
encoder= LabelEncoder() #객체생성
encoder.fit(Appliances) #틀을 만든다 생각...
Labels= encoder.transform(Appliances) #실제변환
print(Labels)
print('encoder class : ', encoder.classes_) # 인코더 클래스값
print('decoder variable?', encoder.inverse_transform([0, 2, 6, 5, 3, 4, 1])) #원본값
(Cabin,Embarked,sex variable)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
train = pd.read_csv('./train.csv')
train.head()
print('Null 값 수 ',train.isnull().sum()) #cabin의 전체 891개중 204개밖에 없음을 알 수있다.또한 embarked도 2개모자라다.
#Cabin
train['Cabin'].fillna('N',inplace=True) #891개 중 687개를 N이라는 글자로 채움
train['Cabin'] = train['Cabin'].str[:1] #객실의 방번호를 제외하고 앞글자만 가져오기
train['Cabin'].value_counts()
#Embarked
train['Embarked'].fillna('Q',inplace=True) #2개를 Q로 채
print('Null 값 수 ',train.isnull().sum())
from sklearn.preprocessing import LabelEncoder
#함수생성(labelencoder 생성 )
def encode_features(dataDF):
features = ['Cabin', 'Sex', 'Embarked']
for feature in features:
encoder= LabelEncoder() #객체생성
encoder.fit(dataDF[features]) #틀을 만든다 생각...
dataDF[features]= encoder.transform(dataDF[features])
return dataDF
#Labelencoder 함수 적
train = encode_features(train)
train.head()
피쳐 유형에 따라 새로운 피쳐를 추가하여 해당컬럼값만 1을 표시하고 이외에는 0을 표기하는 방식이 있고 더 편리한 방식으로는 Pandas의 pd.get_dummies(Dataframe)를 이용한다.
한 가지 덧붙여 말하자면, R에서는 factor값으로 변환하는데, Python에서는 factor로 변환기능이 없기로 알고 있다.
파이썬 머신러닝완벽가이드 참조
scikitlearn preprocessing 부분의 One-hot Encoder 경우 2차원 데이터로 변환하는 번거로움이 있어서 Pandas로 간단 변환하는 방식만 다루겠다.
import pandas as pd
df_appliances= pd.DataFrame( {'appliance':['TV', '냉장고', '에어드레서' , '세탁기', '노트북', '모니터', '기타']})
print(df_appliances.shape) # 초기 7행 1열의 dataframe 형태
print(df_appliances)
df_appliances=pd.get_dummies(df_appliances) #get_dummies를 이용해 피쳐 늘리기
print(df_appliances.shape)
df_appliances.head() #7행7열로 피쳐가 늘어났을 알 수 있다.
위에서 Label Encoding codereview 를 바탕으로 이어 나가겠다.
train=pd.get_dummies(train['Cabin', 'Sex', 'Embarked']) #get_dummies를 이용해 피쳐 늘리기
print(train.shape)
train.head()
Label , One-hot figure : https://medium.com/@michaeldelsole/what-is-one-hot-encoding-and-how-to-do-it-f0ae272f1179