티스토리 뷰

▶kaggle

 

Kaggle: Your Machine Learning and Data Science Community

Kaggle is the world’s largest data science community with powerful tools and resources to help you achieve your data science goals.

www.kaggle.com

kaggle에서는 전세계 데이터 사이언티스트들이 다양한 데이터를 분석하고 토론할 수 있는 커뮤니티를 제공하고 있습니다.

또한 데이터 분석 및 머신러닝, 딥러닝 대회를 개최 및 다양한 데이터셋, 파이썬 자료, R 자료들을 제공하고 있습니다.

 

이번 글에서는 kaggle에서 제공하고 있는 가장 대표적인 데이터셋인 타이타닉 데이터셋으로 실습을 진행해보겠습니다.

 

▶필요한 라이브러리 import

import numpy as np
import pandas as pd

 

▶csv 파일 불러오기

data = pd.read_csv('https://bit.ly/fc-ml-titanic')

 

▶데이터 파악하기

data.head()

out:

  • PassengerId: 승객 아이디
  • Survived: 생존 여부(1:생존, 0:사망)
  • Pclass: 등급
  • Name: 승객 이름
  • Sex: 성별
  • Age: 나이
  • SibSp: 형제, 자매, 배우자 수
  • Parch: 부모, 자식 수
  • Ticket: 티켓 번호
  • Fare: 요금
  • Cabin: 좌석 번호
  • Embarked: 탑승 항구

 

▶데이터 전처리

▷feature 데이터와 label 데이터 추출

여기서 feature 데이터와 label 데이터는 분석에 직접 사용할 데이터가 되겠습니다.

다시말해 feature 데이터로 label 데이터를 예측하려는 것입니다.

feature = ['Pclass', 'Sex', 'Age', 'Fare']
label = ['Survived']

 

▷사이킷런 모듈로 train 데이터셋과 valid 데이터셋 나누기

train / validation / test 분리하는 이유

우선 train과 test로 분리한다고 많이들 알고 있습니다.

하지만 머신러닝 모델을 train 데이터를 100% 학습시킨 후 test 데이터에 모델을 적용했을 때 성능이 생각보다 좋지 않은 경우가 많습니다.

이러한 현상을 과적합(overfitting) 되었다고 합니다.

여기서 과적합은 train 데이터에 너무 딱 맞게 학습이 되어 새로운 데이터가 들어왔을 때는 예측을 잘 하지 못하는 것을 말합니다.

그렇기 때문에 과적합을 방지하여 전체적인 모델 성능을 높여야만 합니다.

 

따라서 Validation set으로 검증 단계를 추가하여 과적합을 방지해야 합니다.

 

기존 train / test로 구분 되어 있었던 데이터 셋을 train에서 train / validation 으로 일정 비율 쪼갠 다음에 학습 시에는 train 데이터로 학습 후 중간중간 validation 데이터로 내가 학습한 모델 평가를 해주는 것입니다.

test 데이터셋은 오차가 줄어들다가 특정 지점부터는 오히려 오차가 증가합니다.

 

train 데이터에 대해서는 계속 오차를 줄여나갈 수 있지만, test 데이터셋에 대해서는 오차가 줄어들다가 과적합된 모델에 대해 어느 지점부터는 오차가 오히려 증가합니다.

따라서 test 데이터셋의 오차가 최소화되는 지점을 찾는 것이 중요하겠습니다.

 

우선 여기서는 train / validation 데이터셋으로 나눠보겠습니다.

from sklearn.model_selection import train_test_split
x_train, x_valid, y_train, y_valid = train_test_split(
	test[feature], test[label], test_size=0.2, random_state=10) # 8:2 비율로 split

 

▶결측치 처리

▷데이터 info 살펴보기

data.info()

out:

전체 891 entries 가 있는 것을 확인할 수 있습니다.

이보다 작은 데이터가 있는 feature들은 결측치가 있는 것으로 해석할 수 있습니다.

즉 'Age', 'Cabin', 'Embarked'에 결측치가 있다고 볼 수 있습니다.

 

자세하게 결측치를 확인해보겠습니다.

data.isnull().sum()

out:

 

▷SimpleImputer로 결측치 처리하기

사이킷런에 있는 라이브러리로, 2개 이상의 feature를 한번에 함수 또는 수식을 처리할 수 있습니다.

 

우선 라이브러리를 import 하겠습니다.

from sklearn.imput import SimpleImputer

객체를 만들어주겠습니다.

imputer = Simpleimputer(strategy='mean') # 평균값으로 일괄 적용

strategy = mean(평균값) | median(중앙값) | most_frequent(최빈값) | constant(특정값)

으로 작성할 수 있습니다.

 

이제 fit(학습), transform(값 변화를 적용) 해보겠습니다.

참고로 결측치가 있었던 'Age'와 'Pclass'에 대해 적용해보겠습니다.

result = imputer.fit_transform(test[['Age', 'Pclass']])

값 변화가 적용된 데이터를 원본 데이터에 넣어주겠습니다.

그러면 기존에 있었던 결측치가 평균값(strategy='mean')으로 대치되는 것입니다.

data[['Age', 'Pclass']] = result

 

이번에는 결측치가 있었던 'Embarked'와 'Cabin'에 대해서는 결측치를 일괄 최빈값으로 적용해주겠습니다.

imputer = SimpleImputer(strategy='most_frequent')
result = imputer.fit_transform(data[['Embarked', 'Cabin']])
train[['Embarked', 'Cabin']] = result

 

▶Label Encoding

레이블 인코딩은 문자형 값들을 숫자형 값으로 변환해주는 방식입니다.

범주형 데이터를 수치형 데이터로 변환해주는 것을 말합니다.

예를 들어 '사과', '포도', '복숭아'를 1, 2, 3으로 변환해주는 것입니다.

 

우선 왜 문자형을 숫자형으로 인코딩해야 할까요?

기본적으로 사이킷런의 머신러닝 알고리즘은 문자열 값을 입력 값으로 허락하지 않습니다.

그렇기 때문에 모든 문자열 값들을 숫자형으로 인코딩하는 전처리 작업이 필요합니다.

대표적인 인코딩 방식에는 레이블 인코딩(Label Encoding)과 원 핫 인코딩(One Hot Encoding)이 있습니다.

 

다만, 레이블 인코딩의 주의할 점이 있습니다.

위에서 '사과'를 1, '포도'를 2, '복숭아'를 3으로 변환해주었다고 했을 때,

머신러닝은 데이터의 관계성을 찾아 '사과' + '포도' = '복숭아'로 학습할 수가 있습니다(잘못된 학습입니다.).

 

따라서 독립적인 데이터 즉 서로 관계성이 없는 데이터들(명목형 데이터)은 별도의 column으로 분리하고 각각의 컬럼에 해당하는 값만 True, 나머지는 False 값을 갖게 함으로써 관계성을 갖지 않도록 할 수 있습니다(이게 바로 다음 공부할 원 핫 인코딩입니다.)

범주형 데이터의 종류

명목형 데이터라면 레이블 인코딩을 지양해야 합니다.

 

여기서는 인코딩 하는 방법을 알아보기 위해 데이터 타입을 생각하지 않고 우선 인코딩을 적용해보겠습니다 :)

우선 레이블 인코딩부터 해보겠습니다.

이전에 info를 보았을 때 object형인 feature 중 'Sex'가 있었습니다.

참고로 'male'과 'female'로 이루고 있습니다.

직접 함수를 정의해서 인코딩하는 방식과 사이킷런을 이용하여 인코딩하는 방식 두 가지를 해보겠습니다.

 

① 함수로 인코딩

def convert(data):
	if data == 'male':
   		return 1
    elif data == 'female':
  		return 0
data['Sex'].apply(convert)

 

② 사이킷런으로 인코딩

from sklearn.preprocessing import LabelEmcoder
data['Sex_num'] = LabelEncoder.fit_transform(data['Sex'])

잘 변환되었는지 확인해보겠습니다.

data['Sex_num'].value_counts()

out:

뭐가 1이고 뭐가 0인지 알 수 있는 방법은 다음과 같습니다.

LabelEndoer.classes_

out:

인덱스로 확인하면 됩니다.

즉 0은 'female'을 의미하고 1은 'male'을 의미한다는 것입니다.

 

▶One Hot Encoding

object형 feature인 'Embarked' 를 이용해 원 핫 인코딩을 해보겠습니다.

pd.get_dummies(data[Embarked])

 


여기까지 타이타닉 데이터셋을 이용해 실습을 해보았습니다 :)

728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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 30
글 보관함