본문으로 바로가기

 

차례

1. 불필요한 칼럼 제거하기 (drop)

2. 문자열 값을 숫자형 카테고리로 변환 (LabelEncoder)

3. 결측치 바꾸기 (fillna)

4. 데이터셋 분할 (train_test_split)

 

 


 

 

데이터전처리는 맛있는 요리를 만들기 위한 '재료손질'입니다.  

모델링에 앞서 수집된 데이터의 누락된 부분, 오차 등을 확인하여 다듬는 작업입니다.

 

우리는 이전 포스팅에서 데이터 불러오는 작업까지 마쳤습니다.

우리의 목표는 평가용 데이터에 있는 2,482명 고객의 성별(*남자일 확률)을 예측하는 것입니다.

 

[빅분기] 데이터 불러오기

차례 1. 데이터 불러오기 2. 인덱스(custid)와 변수(features) 분리 3. 데이터 구조 확인하기 1. 데이터 불러오기 데이터를 불러오는 방법은 두 가지입니다. 1. 링크 호출(url) 2. 컴퓨터에 저장된 데이터

bohemihan.tistory.com

 

 

1. 불필요한 칼럼 제거하기 (drop)

 

데이터프레임 X 입니다.

목표값인 성별(gender)를 예측하는데 도움이 되지 않는 칼럼을 제거하는 것만으로 모델의 성능은 올라갑니다.

판단은 주관적인 도메인 지식에 의지할 때가 많습니다. '주구매지점' 칼럼을 삭제한다고 가정하겠습니다. 

 

# 데이터분석에 필요없다고 생각되는 칼럼(열) 삭제
# 데이터프레임명.drop(['칼럼명'], axis=1, inplace)  
# axis = 1 (열 선택)
# inplace = True / False (덮어쓰기 여부)

X.drop(['주구매지점'], axis=1, inplace=True)
X

 

여러 컬럼을 삭제하고 싶은 경우 직접입력하거나 변수를 사용합니다. 

# 직접입력 

X.drop(['주구매상품', '내점일수'], axis=1, inplace=True)
X

# 변수사용

drop_col = ['주구매상품', '내점일수']
X.drop(drop_col, axis=1, inplace=True)
X

 

drop함수에서 inplace를 True로 설정한 경우, 해당 코드이후부터 데이터가 삭제됩니다.

데이터를 복원하고 싶은 경우 read_csv부터 코드를 다시 실행하여 데이터를 불러와야 합니다.

저는 칼럼을 삭제하고 싶지 않아서 데이터프레임("X")을 원상태로 복원하였습니다.

 

 

 

2. 문자열 값을 숫자형 카테고리로 변환 (LabelEncoder)

 

ⓒmedium.com/@chexki

 

라벨인코딩은 문자열 값을 숫자형 카테고리 값으로 변환합니다.

예를 들면 문자 A, B, C ...숫자 0, 1, 2...로 변환합니다.

 일부 Machine Learning 알고리즘은 숫자를 가중치로 잘못 인식하여 값에 왜곡이 생기기기도 합니다.

보통 남/녀, 성공/실패 등 50:50으로 구분되는 값에만 사용합니다.  

 

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le_col = ['주구매상품', '주구매지점']

X.loc[:, le_col] = X.loc[:, le_col].apply(le.fit_transform)
X_test.loc[:, le_col] = X_test.loc[:, le_col].apply(le.fit_transform)

①. Scikit-learn 라이브러리에 있는 LabelEncoder를 사용합니다.

②. LabelEncoder 함수와 인코딩할 칼럼을 각각 변수(le, le_col)로 놓습니다. 

③. apply 함수는 데이터프레임의 각 열에 연산을 적용(vetorizing)하는 방법입니다.

④. LabelEncoder 함수를 적용합니다 (le.fit_transform)

 

# LabelEncoder 적용

X

LabelEncoder가 적용되면 문자열 데이터가 수치형데이터로 변환됩니다. 

 

 

 

3. 결측치 바꾸기 (fillna)

 

결측치(값)는 값이 누락된 데이터를 말합니다. 

값이 누락된 상태에서 모델링을 진행하면 성능이 저하되는 경우가 있습니다. 

따라서 결측치를 중간값, 근처값 등으로 변경해주는 것이 좋습니다.

 

# 결측치확인

print(X.isnull().sum())
print()
print(X_test.isnull().sum())

 

데이터프레임에 있는 결측치를 확인합니다.

결측치를 대체하는 가장 기초적인 방법은 영향을 최소화하기 위해 단순히 '0'으로 채우는 것입니다.

 

# NaN to zero

X.loc[:, ['환불금액']] = X.loc[:, ['환불금액']].fillna(0)
X_test.loc[:, ['환불금액']] = X_test.loc[:, ['환불금액']].fillna(0)
# 다시 결측치를 확인합니다

print(X.isnull().sum())
print()
print(X_test.isnull().sum())

 

 

 

4. 데이터셋 분할 (train_test_split)

 

ⓒ IT위키


데이터 전처리의 마지막 단계입니다.

데이터셋을 세 가지 데이터세트로 나눕니다.



• 훈련 데이터셋(training set): 모델을 훈련시키는 용도입니다. 

• 검증 데이터셋(validation set): 초매개변수(Hyper parameter)를 튜닝하는 데 사용합니다.

• 테스트 데이터셋(testing set): 모델의 성능을 평가하는데 사용합니다.



이와 같이 데이터셋을 나누는 이유는 과적합을 피하고 편향을 제거한 데이터로 모델 성능을 평가하기 위해서입니다.

일반적으로 훈련 데이터셋과 검증 데이터셋은 모델을 튜닝하고 개선하는 데 사용합니다.

검증 데이터셋은 훈련을 조기 종료할지 결정하는 데 사용하기도 합니다.

이 말은 모델의 검증 데이터셋 예측 성능이 더 이상 좋아지지 않는 시점에 훈련을 종료한다는 의미입니다.

이 방식은 신경망의 과적합을 방지하는 효과가 있다.

테스트 데이터셋은 홀드아웃(holdout) 데이터셋이라고도 합니다.

신경망을 훈련시키는데 사용되지 않으며, 오로지 모델 성능을 최종 평가하는 데 사용합니다. 



데이터셋을 나누는 비율도 중요합니다.

훈련 데이터셋을 많이 할당하면 모델 성능은 향상시킬 수 있지만 과적합이 발생합니다.

반대로 검증 데이터셋과 테스트 데이터셋을 많이 할당하면 훈련 데이터셋이 부족해 모델 성능이 감소합니다.

(출처 : https://thebook.io/080232/ch02/06/03/)

 

# model_selection

from sklearn.model_selection import train_test_split
X1, X2, y1, y2 = train_test_split(X, y, test_size=0.3, random_state=999, stratify = y)

①. Scikit-learn에서 제공하는 데이터셋 분할기능을 사용합니다. (train_test_split)

②. train_test_split 안에  X(변수features), y(목표값)를 넣습니다. test_size는 30% 입니다. 

③. random_state는 일정한 숫자를 넣으면 무작위성이 사라집니다.

④. stratify는 비율을 고려한 층화추출법입니다. 

 

데이터프레임 X, y가 훈련용(70%), 테스트용(30%) 비율에 맞춰 X1, X2, y1, y2로 나뉘어졌습니다.

 

Scikit-learn에서 제공하는 가이드입니다.

 

>>> import numpy as np
>>> from sklearn.model_selection import train_test_split
>>> X, y = np.arange(10).reshape((5, 2)), range(5)
>>> X
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])
>>> list(y)
[0, 1, 2, 3, 4]
>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.33, random_state=42)
...
>>> X_train
array([[4, 5],
       [0, 1],
       [6, 7]])
>>> y_train
[2, 0, 3]
>>> X_test
array([[2, 3],
       [8, 9]])
>>> y_test
[1, 4]
>>> train_test_split(y, shuffle=False)
[[0, 1, 2], [3, 4]]

 

 

 


 

#빅데이터분석기사후기 #빅데이터분석기사실기 #빅데이터분석기사필기pdf #빅데이터분석기사합격률 #빅데이터분석기사쓸모 #빅데이터분석기사2022일정 #빅데이터분석기사전망 #빅데이터분석기사실기 #빅데이터분석기사실기파이썬 #빅데이터분석기사실기파이썬 #빅데이터분석기사실기문제 #빅데이터분석기사실기합격률 #빅데이터분석기사실기준비 #빅데이터분석기사필기기출문제 #빅데이터분석기사필기복원 #빅분기기출 #빅분기정리 #빅분기난이도 #빅분기필기복원