AI 이론/Machine Learning

[머신러닝, 딥러닝] 레이블인코딩 or 원핫인코딩, Training & Test

jasonshin 2021. 11. 23. 17:39

df = pd.read_csv('Data.csv')

df

Country                                     Age                         Salary                          Purchased

France 44.0 72000.0 No
Spain 27.0 48000.0 Yes
Germany 30.0 54000.0 No
Spain 38.0 61000.0 No
Germany 40.0 NaN Yes
France 35.0 58000.0 Yes
Spain NaN 52000.0 No
France 48.0 79000.0 Yes
Germany 50.0 83000.0 No
France 37.0 67000.0 Yes

NaN 처리

(NaN에 평균값 대입)

df.fillna(df.mean(), inplace=True)

 

X, Y 데이터 분리 : 즉 학습할 변수와 레이블링 변수로 분리

# x를 종속변수
# y를 독립변수

X = df.loc[ : , 'Country' : 'Salary' ] # 2차원 행렬이라 대문자로

X

CountryAgeSalary0123456789

France 44.000000 72000.000000
Spain 27.000000 48000.000000
Germany 30.000000 54000.000000
Spain 38.000000 61000.000000
Germany 40.000000 63777.777778
France 35.000000 58000.000000
Spain 38.777778 52000.000000
France 48.000000 79000.000000
Germany 50.000000 83000.000000
France 37.000000 67000.000000

y = df['Purchased'] # 1차원 데이터라 소문자로

 

X['Country'].describe() # 카테고리컬 데이터라고 확인 unique 3.

count         10
unique         3
top       France
freq           4
Name: Country, dtype: object

X['Country'].unique()

array(['France', 'Spain', 'Germany'], dtype=object)

# 문자로 되어있는 데이터는 방정식에 대입할 수가 없다.
# 따라서 문자를 숫자로 바꿔줘야 하는데
# 먼저 해당 문자열이 카테고리컬 데이터인지 확인한다.
# 카테고리컬 데이터면 정렬한다. 
# 정렬한 후의 문자열들을 앞에서부터 0부터 시작한 숫자로 변환한다. 
# 이것이 가장 기본적인 방법인데, 이를 Label Encoding 이라고 한다. 

 

sorted(X['Country'].unique())

['France', 'Germany', 'Spain']

# France : 0 , Germany : 1, Spain : 2

 

# 3개 이상의 카테고리컬 데이터는 레이블 인코딩으로 학습을 시키면 
# 학습이 잘 되지 않는 것을 발견
# 따라서 2개의 카테고리컬 데이터는 레이블 인코딩을 사용해도 되지만 
# 하지만 3개 이상의 카테고리컬 데이터는 one-Hot Encoding을 사용해야 성능이 좋아진다.

 

# France Germany Spain
#  1        0      0   => 프랑스인 경우는 프랑스만 1로 세팅
#  0        1      0   => 독일인 경우는 독일만 1로 세팅
#  0        0      1   => 스페인인 경우는 스페인만 1로 세팅

# 즉, 카테고리컬 데이터를 전부 컬럼으로 만들어서 해당 컬럼의 값만 1로 세팅하는 것을
# 원핫인코딩이라고 한다. 

 

데이터를 확인해 보니, 컴퓨터가 이해할 수 있도록 바꿔야 한다.

컴퓨터는 숫자로 처리한다.

숫자가 아닌 데이터 중에서, 카테고리로 판단되는 데이터는, 숫자로 바꿔줄 수 있다.

https://azanewta.tistory.com/46

 

One Hot Encoding 과 Label Encoding 을 비교해보자

One-Hot Encoding이란 무엇인가. 언제 우리는 Label Encoding 대신 One-Hot Encoding을 써야하는가? 데이터 과학에 일반적인 인터뷰 질문이며, 데이터 과학자는 반드시 알아야 하는 내용이다. 결론적으로 당신

azanewta.tistory.com

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

 

 

# 1. 레이블 인코딩하는 방법

encoder = LabelEncoder()

X['Country'] = encoder.fit_transform(X['Country']) <==넘파이

 

# 2-1. 원 핫 인코딩 하는 방법

from sklearn.compose import ColumnTransformer <== 넘파이

X = df.iloc[ : , 0 : 2+1]

 

ct = ColumnTransformer([('encoder', OneHotEncoder(), [0])], remainder='passthrough')

# 0이라고 쓴 이유는? X에서 원핫인코딩할 컬럼이 
# 컴퓨터가 매기는 인덱스로 0이기 때문에 0이라고 썼다
# 만약에 Salary 컬럼도 원핫인코딩한다고 가정하면
# [0, 2] 라고 컴퓨터가 매기는 인덱스를 추가로 적어주면 된다. 

 

# 원핫 인코딩이 수행된 컬럼은, 항상 행렬의 맨 왼쪽에 나온다. 
X = ct.fit_transform(X)

 

# 2-2. 원 핫 인코딩 하는 방법(2) pd.get_dummies(X, columns=['Geography']) <==데이터프레임

 

X

array([[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.40000000e+01,
        7.20000000e+04],
       [0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 2.70000000e+01,
        4.80000000e+04],
       [0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 3.00000000e+01,
        5.40000000e+04],
       [0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.80000000e+01,
        6.10000000e+04],
       [0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 4.00000000e+01,
        6.37777778e+04],
       [1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.50000000e+01,
        5.80000000e+04],
       [0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.87777778e+01,
        5.20000000e+04],
       [1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.80000000e+01,
        7.90000000e+04],
       [0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 5.00000000e+01,
        8.30000000e+04],
       [1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.70000000e+01,
        6.70000000e+04]])

y

0     No
1    Yes
2     No
3     No
4    Yes
5    Yes
6     No
7    Yes
8     No
9    Yes
Name: Purchased, dtype: object

y.describe()

count      10
unique      2
top       Yes
freq        5
Name: Purchased, dtype: object

sorted(y.unique())

['No', 'Yes']
 
encoder_y = LabelEncoder()

y= encoder_y.fit_transform(y)

 

y

array([0, 1, 0, 0, 1, 1, 0, 1, 0, 1])
 

Dataset을 Training 용과 Test용으로 나눈다.

# 숫자로 다 변환된 X와 y 를
# 학습용 데이터와 테스트용 데이터로 나눈다.
# 그 결과는 총 4개의 데이터가 나온다. 그림참고

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)

X.shape

(10, 5)

X_train.shape

(8, 5)
 
 
반응형