2. Categorical Feature Encoding Challenge
2. Categorical Feature Encoding Challenge
난이도 | 2 | |||
---|---|---|---|---|
경진대회명 | 범주형 데이터 이진분류 경진대회 | |||
미션 | 다양한 범주형 데이터를 활용해 타겟값 1에 속할 확률 예측 | |||
문제유형 | 이진분류 | 평가지표 | ROC AUC | |
제출시 사용한 모델 | 로지스틱 회귀 | |||
파이썬 버전 | 3.7.10 | |||
사용 라이브러리 버전 | numpy == 1.19.5 pandas == 1.3.2 seaborn == 0.11.2 matplotlib == 3.4.3 sklearn == 0.32.2 scipy ==1.7.1 |
학습 목표
- 범주형 데이터를 활용해 이진분류하는 경진대회에 참가
- 피처 구성을 이해하기 위해 탐색적 데이터 분석을 자세히 학습
- 데이터 특성에 따른 맞춤형 인코딩 방법 학습
- 최종적으로 프라이빗 리더보드에서 2등을 기록하는 모델 제작
학습 순서
- 경진대회 이해
- 탐색적 데이터 분석
- 베이스라인 모델(로지스틱 회귀)
- 성능개선 I (피처 엔지니어링 강화)
- 성능 개선 II (검증 데이터까지 훈련에 이용)
학습 키워드
- 유형 및 평가 지표 : 이진분류, ROC AUC
- 탐색적 데이터 분석 : 피처 요약표, 타겟값 분포, 이진/명목형/순서형/날짜 피처 분포
- 머신러닝 모델 : 로지스틱 회귀
- 피처 앤지니어링 : 원-핫 인코딩, 피처 맞춤 인코딩, 피처 스케일링
- 하이퍼파라미터 최적화 : 그리드 서치
1. 경진대회 이해
- 본 대회의 목표는 범주형 feature 23개를 활용해 해당 데이터가 타겟값 1에 속할 확률을 예측하는 것이다.
- 본 경진대회의 특징
본 대회는 인위적으로 만든 데이터를 제공한다. (연습용으로는 인공 데이터가 오히려 좋다.)
각 피처와 타겟값의 의미를 알 수 없다. 자전거 대여 수요 예측은 다르게 날씨가 좋을수록 자전거 대여 수량이 많을것이라 예상할 수 있었지만 이런 경우 활용할 수 있는 배경 지식이 없기 때문에 순전히 데이터만 보고 접근해야 한다.
- 제공되는 데이터가 모두 범주형이다. 값이 두개로만 구성된 데이터부터 순서형 데이터(ordinal data), 명목형 데이터(nominal data), 날짜 데이터까지 다양하게 제공된다.
- bin_로 시작하는 피처는 이진 피처, nom_로 시작하는 피처는 명목형 피처, ord_로 시작하는 피처는 순서형 피처이다.
- 순서형 피처 중 ord_3, ord_4, ord_5 는 알파벳순으로 고윳값 순서가 매져있다.
- 타겟값도 범주형 데이터 이다. 0과 1 두개로 구성되어 있다.
확률 예측
분류 문제에서는 타겟값이 0이냐 1이냐가 아니라 ‘1일 확률’을 예측한다. 보통 음성 값일 확률보다는 양성 값일 확률로 예측한다. 일반적으로 0은 음성, 1은 양성을 나타낸다. 스팸 메일을 거르는 문제라면 0은 일반 메일, 1은 스팸 메일을 뜻한다. 암을 진단하는 문제에서도 0은 정상, 1은 암 진단을 의미한다. 이런 문제들에서 우리가 알고싶은건 스팸 메일일 확률이나 암일 확률이기 때문에 양성값인 1일 확률을 예측한다.
2. 탐색적 데이터 분석
분석 과정은 아래와 같은 순서로 진행된다.
2.1 탐색적 데이터 분석
kaggle competitions download -c cat-in-the-dat
데이터 로드 및 shape 확인
데이터를 읽어올 때 index_col 파라미터에 데이터가 가지고 있는 id를 전달했다. 열 이름을 전달하면 해당 열을 인덱스로 지정하며 명시하지 않으면 0부터 시작하는 새로운 열을 생성해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
import numpy as np
data_path = 'datasets/'
train = pd.read_csv(data_path + 'train.csv', index_col = 'id')
test = pd.read_csv(data_path + 'test.csv', index_col = 'id')
submission = pd.read_csv(data_path + 'sample_submission.csv', index_col = 'id')
print(train.shape, test.shape)
'''
(300000, 24) (200000, 23)
'''
train, test, submission의 첫 5행 출력
1
train.head()
bin_0 | bin_1 | bin_2 | bin_3 | bin_4 | nom_0 | nom_1 | nom_2 | nom_3 | nom_4 | ... | nom_9 | ord_0 | ord_1 | ord_2 | ord_3 | ord_4 | ord_5 | day | month | target | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | |||||||||||||||||||||
0 | 0 | 0 | 0 | T | Y | Green | Triangle | Snake | Finland | Bassoon | ... | 2f4cb3d51 | 2 | Grandmaster | Cold | h | D | kr | 2 | 2 | 0 |
1 | 0 | 1 | 0 | T | Y | Green | Trapezoid | Hamster | Russia | Piano | ... | f83c56c21 | 1 | Grandmaster | Hot | a | A | bF | 7 | 8 | 0 |
2 | 0 | 0 | 0 | F | Y | Blue | Trapezoid | Lion | Russia | Theremin | ... | ae6800dd0 | 1 | Expert | Lava Hot | h | R | Jc | 7 | 2 | 0 |
3 | 0 | 1 | 0 | F | Y | Red | Trapezoid | Snake | Canada | Oboe | ... | 8270f0d71 | 1 | Grandmaster | Boiling Hot | i | D | kW | 2 | 1 | 1 |
4 | 0 | 0 | 0 | F | N | Red | Trapezoid | Lion | Canada | Oboe | ... | b164b72a7 | 1 | Grandmaster | Freezing | a | R | qP | 7 | 8 | 0 |
5 rows × 24 columns
train.head()로 출력하면 중간에 피처가 생략된 상태로 출력돼 보기 불편하다. 이때 T 메서드를 호출하면 한눈에 보기 편하게 행과 열의 위치가 바뀐다.
1
train.head().T
id | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
bin_0 | 0 | 0 | 0 | 0 | 0 |
bin_1 | 0 | 1 | 0 | 1 | 0 |
bin_2 | 0 | 0 | 0 | 0 | 0 |
bin_3 | T | T | F | F | F |
bin_4 | Y | Y | Y | Y | N |
nom_0 | Green | Green | Blue | Red | Red |
nom_1 | Triangle | Trapezoid | Trapezoid | Trapezoid | Trapezoid |
nom_2 | Snake | Hamster | Lion | Snake | Lion |
nom_3 | Finland | Russia | Russia | Canada | Canada |
nom_4 | Bassoon | Piano | Theremin | Oboe | Oboe |
nom_5 | 50f116bcf | b3b4d25d0 | 3263bdce5 | f12246592 | 5b0f5acd5 |
nom_6 | 3ac1b8814 | fbcb50fc1 | 0922e3cb8 | 50d7ad46a | 1fe17a1fd |
nom_7 | 68f6ad3e9 | 3b6dd5612 | a6a36f527 | ec69236eb | 04ddac2be |
nom_8 | c389000ab | 4cd920251 | de9c9f684 | 4ade6ab69 | cb43ab175 |
nom_9 | 2f4cb3d51 | f83c56c21 | ae6800dd0 | 8270f0d71 | b164b72a7 |
ord_0 | 2 | 1 | 1 | 1 | 1 |
ord_1 | Grandmaster | Grandmaster | Expert | Grandmaster | Grandmaster |
ord_2 | Cold | Hot | Lava Hot | Boiling Hot | Freezing |
ord_3 | h | a | h | i | a |
ord_4 | D | A | R | D | R |
ord_5 | kr | bF | Jc | kW | qP |
day | 2 | 7 | 7 | 2 | 7 |
month | 2 | 8 | 2 | 1 | 8 |
target | 0 | 0 | 0 | 1 | 0 |
테스트 데이터 인덱스가 300,000 부터 시작하기 때문에 submission id는 300,000 부터 시작한다.
1
submission.head()
target | |
---|---|
id | |
300000 | 0.5 |
300001 | 0.5 |
300002 | 0.5 |
300003 | 0.5 |
300004 | 0.5 |
1
test.head().T
id | 300000 | 300001 | 300002 | 300003 | 300004 |
---|---|---|---|---|---|
bin_0 | 0 | 0 | 1 | 0 | 0 |
bin_1 | 0 | 0 | 0 | 0 | 1 |
bin_2 | 1 | 0 | 1 | 1 | 1 |
bin_3 | T | T | F | T | F |
bin_4 | Y | N | Y | Y | N |
nom_0 | Blue | Red | Blue | Red | Red |
nom_1 | Triangle | Square | Square | Star | Trapezoid |
nom_2 | Axolotl | Lion | Dog | Cat | Dog |
nom_3 | Finland | Canada | China | China | China |
nom_4 | Piano | Piano | Piano | Piano | Piano |
nom_5 | 0870b0a5d | a5c276589 | 568550f04 | c5725677e | e70a6270d |
nom_6 | 9ceb19dd6 | 1ad744242 | 1fe17a1fd | a6542cec0 | 97b6a3518 |
nom_7 | 530f8ecc3 | 12e6161c9 | 27d6df03f | 30c63bd0c | a42386065 |
nom_8 | 9d117320c | 46ae3059c | b759e21f0 | 0b6ec68ff | f91f3b1ee |
nom_9 | 3c49b42b8 | 285771075 | 6f323c53f | b5de3dcc4 | 967cfa9c9 |
ord_0 | 2 | 1 | 2 | 1 | 3 |
ord_1 | Novice | Master | Expert | Contributor | Grandmaster |
ord_2 | Warm | Lava Hot | Freezing | Lava Hot | Lava Hot |
ord_3 | j | l | a | b | l |
ord_4 | P | A | G | Q | W |
ord_5 | be | RP | tP | ke | qK |
day | 5 | 7 | 1 | 2 | 4 |
month | 11 | 5 | 12 | 3 | 11 |
2.2 피처 요약표 생성
피처 요약표는 피처별 데이터 타입, 결측값 개수, 고윳값 개수, 실제 입력값 등을 정리한 표이다.
피처 요약표를 만드는 3단계
1. 피처별 데이터 타입 DataFrame 생성*
2. 인덱스 재설정 후 열 이름 변경
3. 결측값 개수, 고윳값 개수, 1~3행 입력값 추가
1. 피처별 데이터 타입 DataFrame 생성
DataFrame 객체에서 dtypes를 호출하면 피처별 데이터 타입을 반환해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
train.dtypes
'''
bin_0 int64
bin_1 int64
bin_2 int64
bin_3 object
bin_4 object
nom_0 object
nom_1 object
nom_2 object
nom_3 object
nom_4 object
nom_5 object
nom_6 object
nom_7 object
nom_8 object
nom_9 object
ord_0 int64
ord_1 object
ord_2 object
ord_3 object
ord_4 object
ord_5 object
day int64
month int64
target int64
dtype: object
'''
이 값을 입력으로 DataFrame을 새로 생성하면 피처별 데이터 타입이 입력된 DataFrame이 만들어진다. 이 때 다음과 같이 columns 파라미터로 원하는 열 이름을 설정할 수 있다.
1
2
summary = pd.DataFrame(train.dtypes, columns = ['데이터 타입'])
summary.head()
데이터 타입 | |
---|---|
bin_0 | int64 |
bin_1 | int64 |
bin_2 | int64 |
bin_3 | object |
bin_4 | object |
2. 인덱스 재설정 후 열 이름 변경
현재 피처 이름들이 인덱스로 사용중이기 떄문에 현재 인덱스를 열로 옮기고 새로운 인덱스를 만든다.
reset_index()를 호출하면 현재 인덱스를 열로 옮기고 새로운 인덱스를 만든다. 새로운 인덱스는 0부터 시작해 1씩 증가하는 정수이며, 옮겨진 열의 이름은 ‘index’가 된다.
1
2
3
summary = summary.reset_index()
summary.head()
index | 데이터 타입 | |
---|---|---|
0 | bin_0 | int64 |
1 | bin_1 | int64 |
2 | bin_2 | int64 |
3 | bin_3 | object |
4 | bin_4 | object |
현재 피처 이름이 포함된 열 이름이 index 이기 때문에 rename()함수를 사용해 열 이름을 ‘피처’로 바꾼다.
1
2
3
summary = summary.rename(columns={'index':'피처'})
summary.head()
피처 | 데이터 타입 | |
---|---|---|
0 | bin_0 | int64 |
1 | bin_1 | int64 |
2 | bin_2 | int64 |
3 | bin_3 | object |
4 | bin_4 | object |
3. 결측값 개수, 고유값 개수, 1~3행 입력값 추가
DataFrame에 결측값 개수, 고윳값 개수, 첫 세 개 행에 입력된 값을 추가해 보자.
피처별 결측값 개수를 DataFrame에 추가한다. isnull()은 결측값 포함 여부를 True, False로 반환하는 함수이다. True는 1, False는 0으로 간주되어 isnull()을 적용한 DataFrame에 sum() 함수를 호출하면 True의 개수, 즉 피처별 결측값 개수를 구해준다.
피처별 고유값 개수를 추가한다. nunique()는 피처별 고윳값 개수를 구하는 함수이다.
훈련 데이터 1~3행에 입력된 값을 요약표 DataFrame에 추가한다. 각 피처에 실제 어떤 값들이 들어있는지 확인하기 위함이다. loc[0]은 첫 번째 행, loc[1]은 두번째 행, loc[2]는 세번째 행의 값을 의미한다.
values 를 적용하지 않으면 반환 타입인 Series는 인덱스(bin_0, bin_1 등)과 값(0 등)의 쌍으로 이루어져 있다. 따라서 values를 호출해 값만 추출하여 summary에 추가한다.
axis 값 | 기준 방향 | 작동 방향 | 의미 |
---|---|---|---|
axis=0 | 행(row) 기준 | 위→아래 방향 | 열(column) 단위 계산 |
axis=1 | 열(column) 기준 | 왼→오 방향 | 행(row) 단위 계산 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 피처별 결측값 개수
summary['결측값 개수'] = train.isnull().sum().values
'''
- isnull() ➝ 원소 단위로 작동해서 True / False 값을 가진 동일 크기의 DataFrame을 반환
- sum() ➝ 기본적으로 열 단위(axis=0)로 작동해서 각 열의 결측값 개수를 반환
'''
# 2. 피처별 고윳값 개수
summary['고윳값 개수'] = train.nunique().values
'''
nunique()는 기본적으로 열(axis=0) 단위로 작동
'''
# 3. 1~3행에 입력되어 있는 값
summary['첫 번째 값'] = train.loc[0].values
summary['두 번째 값'] = train.loc[1].values
summary['세 번째 값'] = train.loc[1].values
summary.head()
피처 | 데이터 타입 | 결측값 개수 | 고윳값 개수 | 첫 번째 값 | 두 번째 값 | 세 번째 값 | |
---|---|---|---|---|---|---|---|
0 | bin_0 | int64 | 0 | 2 | 0 | 0 | 0 |
1 | bin_1 | int64 | 0 | 2 | 0 | 1 | 1 |
2 | bin_2 | int64 | 0 | 2 | 0 | 0 | 0 |
3 | bin_3 | object | 0 | 2 | T | T | T |
4 | bin_4 | object | 0 | 2 | Y | Y | Y |
4. 피처 요약표 생성함수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def resumetable(df):
print(f'데이터셋 형상: {df.shape}')
# 스텝 1: 피처별 데이터 타입 DataFrame 생성
summary = pd.DataFrame(df.dtypes, columns=['데이터 타입'])
# 스텝 2: 인덱스 재설정 후 열 이름 변경
# 2-1: 인덱스 재설정
summary = summary.reset_index()
# 2-2: 열 이름 변경
summary = summary.rename(columns={'index': '피처'})
# 스텝 3: 결측값 개수, 고윳값 개수, 1~3행 입력값 추가
# 피처별 결측값 개수
summary['결측값 개수'] = df.isnull().sum().values
# 피처별 고윳값 개수
summary['고윳값 개수'] = df.nunique().values
# 1~3행에 입력되어 있는 값
summary['첫 번째 값'] = df.loc[0].values
summary['두 번째 값'] = df.loc[1].values
summary['세 번째 값'] = df.loc[2].values
return summary
resumetable(train)
데이터셋 형상: (300000, 24)
피처 | 데이터 타입 | 결측값 개수 | 고윳값 개수 | 첫 번째 값 | 두 번째 값 | 세 번째 값 | |
---|---|---|---|---|---|---|---|
0 | bin_0 | int64 | 0 | 2 | 0 | 0 | 0 |
1 | bin_1 | int64 | 0 | 2 | 0 | 1 | 0 |
2 | bin_2 | int64 | 0 | 2 | 0 | 0 | 0 |
3 | bin_3 | object | 0 | 2 | T | T | F |
4 | bin_4 | object | 0 | 2 | Y | Y | Y |
5 | nom_0 | object | 0 | 3 | Green | Green | Blue |
6 | nom_1 | object | 0 | 6 | Triangle | Trapezoid | Trapezoid |
7 | nom_2 | object | 0 | 6 | Snake | Hamster | Lion |
8 | nom_3 | object | 0 | 6 | Finland | Russia | Russia |
9 | nom_4 | object | 0 | 4 | Bassoon | Piano | Theremin |
10 | nom_5 | object | 0 | 222 | 50f116bcf | b3b4d25d0 | 3263bdce5 |
11 | nom_6 | object | 0 | 522 | 3ac1b8814 | fbcb50fc1 | 0922e3cb8 |
12 | nom_7 | object | 0 | 1220 | 68f6ad3e9 | 3b6dd5612 | a6a36f527 |
13 | nom_8 | object | 0 | 2215 | c389000ab | 4cd920251 | de9c9f684 |
14 | nom_9 | object | 0 | 11981 | 2f4cb3d51 | f83c56c21 | ae6800dd0 |
15 | ord_0 | int64 | 0 | 3 | 2 | 1 | 1 |
16 | ord_1 | object | 0 | 5 | Grandmaster | Grandmaster | Expert |
17 | ord_2 | object | 0 | 6 | Cold | Hot | Lava Hot |
18 | ord_3 | object | 0 | 15 | h | a | h |
19 | ord_4 | object | 0 | 26 | D | A | R |
20 | ord_5 | object | 0 | 192 | kr | bF | Jc |
21 | day | int64 | 0 | 7 | 2 | 7 | 7 |
22 | month | int64 | 0 | 12 | 2 | 8 | 2 |
23 | target | int64 | 0 | 2 | 0 | 0 | 0 |
2.3 피처 요약표 해석
이진(binary) 피처: bin_0 ~ bin_4
명목형(nominal) 피처: nom_0 ~ nom_9
순서형(ordinal) 피처: ord_0 ~ ord_5
그 외 피처: day, month, target
1. 이진(binary) 피처: bin_0 ~ bin_4
이진 피처들은 고윳값이 모두 2개이다. 이중 bin_0, bin_1, bin_2 는 데이터 타입이 int64고, 실젯값이 0 또는 1로 구성돼 있다.
bin_3, bin_4는 object 타입이고, 실젯값은 T 또는 F(bin_3 피처), Y 또는 N(bin_4 피처) 이다.
따라서 T와 Y는 1로, F와 N은 0으로 인코딩 한다.
2. 명목형(nominal) 피처: nom_0 ~ nom_9
- 명목형 피처는 모두 object 타입이고 결측값은 없다. nom_0 부터 nom_4는 고윳값이 6개 이하인데, nom_5 부터 nom_9는 고윳값이 많으며 의미를 알 수 없는 값을 확인할 수 있다.
3. 순서형(ordinal) 피처: ord_0 ~ ord_5
ord_0 피처만 int64 타입이고 나머지는 object 타입니다. 명목형 데이터와 다르게 순서형 데이터는 순서가 매우 중요하다.
순서에 따라 타겟값에 미치는 영향이 다르기 때문에 순서에 유의하여 인코딩 해야한다.
ord_0, ord_1, ord_2 feature 고윳값 확인
unique()함수를 통해 고윳값을 구할 수 있다.
1
2
3
4
5
6
7
8
9
for i in range(3):
feature = 'ord_' + str(i)
print(f'{feature} 고윳값: {train[feature].unique()}')
'''
ord_0 고윳값: [2 1 3]
ord_1 고윳값: ['Grandmaster' 'Expert' 'Novice' 'Contributor' 'Master']
ord_2 고윳값: ['Cold' 'Hot' 'Lava Hot' 'Boiling Hot' 'Freezing' 'Warm']
'''
unique() 함수는 고윳값이 등장한 순으로 출력한다. ord_0 피처의 고윳값은 숫자 크기에 순서를 맞추면 되고 ord_1 피처의 고윳값은 등급에 따라 Novice, Contributor, Expert, Master, Grandmaster 순으로 맞춘다.
ord_2 피처는 춥고 더움 정도를 나타내므로 Freezing, Cold, Warm, Hot, Boiling Hot, Lava Hot 순으로 맞춘다.
미리 정리해놔야 인코딩할 때 순서에 맞게 매핑하기 편하다.
고윳값 개수가 많은 ord_3, ord_4, ord_5 feature 고윳값 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
for i in range(3, 6):
feature = 'ord_' + str(i)
print(f'{feature} 고윳값 : {train[feature].unique()}', end='\n\n')
'''
ord_3 고윳값 : ['h' 'a' 'i' 'j' 'g' 'e' 'd' 'b' 'k' 'f' 'l' 'n' 'o' 'c' 'm']
ord_4 고윳값 : ['D' 'A' 'R' 'E' 'P' 'K' 'V' 'Q' 'Z' 'L' 'F' 'T' 'U' 'S' 'Y' 'B' 'H' 'J'
'N' 'G' 'W' 'I' 'O' 'C' 'X' 'M']
ord_5 고윳값 : ['kr' 'bF' 'Jc' 'kW' 'qP' 'PZ' 'wy' 'Ed' 'qo' 'CZ' 'qX' 'su' 'dP' 'aP'
'MV' 'oC' 'RL' 'fh' 'gJ' 'Hj' 'TR' 'CL' 'Sc' 'eQ' 'kC' 'qK' 'dh' 'gM'
'Jf' 'fO' 'Eg' 'KZ' 'Vx' 'Fo' 'sV' 'eb' 'YC' 'RG' 'Ye' 'qA' 'lL' 'Qh'
'Bd' 'be' 'hT' 'lF' 'nX' 'kK' 'av' 'uS' 'Jt' 'PA' 'Er' 'Qb' 'od' 'ut'
'Dx' 'Xi' 'on' 'Dc' 'sD' 'rZ' 'Uu' 'sn' 'yc' 'Gb' 'Kq' 'dQ' 'hp' 'kL'
'je' 'CU' 'Fd' 'PQ' 'Bn' 'ex' 'hh' 'ac' 'rp' 'dE' 'oG' 'oK' 'cp' 'mm'
'vK' 'ek' 'dO' 'XI' 'CM' 'Vf' 'aO' 'qv' 'jp' 'Zq' 'Qo' 'DN' 'TZ' 'ke'
'cG' 'tP' 'ud' 'tv' 'aM' 'xy' 'lx' 'To' 'uy' 'ZS' 'vy' 'ZR' 'AP' 'GJ'
'Wv' 'ri' 'qw' 'Xh' 'FI' 'nh' 'KR' 'dB' 'BE' 'Bb' 'mc' 'MC' 'tM' 'NV'
'ih' 'IK' 'Ob' 'RP' 'dN' 'us' 'dZ' 'yN' 'Nf' 'QM' 'jV' 'sY' 'wu' 'SB'
'UO' 'Mx' 'JX' 'Ry' 'Uk' 'uJ' 'LE' 'ps' 'kE' 'MO' 'kw' 'yY' 'zU' 'bJ'
'Kf' 'ck' 'mb' 'Os' 'Ps' 'Ml' 'Ai' 'Wc' 'GD' 'll' 'aF' 'iT' 'cA' 'WE'
'Gx' 'Nk' 'OR' 'Rm' 'BA' 'eG' 'cW' 'jS' 'DH' 'hL' 'Mf' 'Yb' 'Aj' 'oH'
'Zc' 'qJ' 'eg' 'xP' 'vq' 'Id' 'pa' 'ux' 'kU' 'Cl']
'''
ord_3, ord_4, ord_5 피처는 알파벳순으로 정렬되어 있다. 이 피처들은 알파벳순으로 인코딩 한다.
그 외 features: day, month, target
1
2
3
4
5
6
7
8
9
print('day 고윳값: ', train['day'].unique())
print('month 고윳값: ', train['month'].unique())
print('target 고윳값: ', train['target'].unique())
'''
day 고윳값: [2 7 5 4 3 1 6]
month 고윳값: [ 2 8 1 4 10 3 7 9 12 11 5 6]
target 고윳값: [0 1]
'''
day 피처의 고윳값이 7개 이다. 요일을 나타낸다고 짐작할 수 있다.
month 피처의 고윳값은 1부터 12이다. 월을 나타낸다.
타겟값은 0 또는 1로 구성돼 있다.