티스토리 뷰
▶kaggle
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 데이터로 내가 학습한 모델 평가를 해주는 것입니다.
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])
여기까지 타이타닉 데이터셋을 이용해 실습을 해보았습니다 :)
'빅데이터 인공지능 > 머신러닝' 카테고리의 다른 글
[머신러닝] ⑥ 회귀(Regression) 분석 A to Z (0) | 2022.08.12 |
---|---|
[머신러닝] ⑤ 파이썬 파이토치(Pytorch) (0) | 2022.08.11 |
[머신러닝] ④ 파이썬 텐서플로우(TensorFlow) (0) | 2022.08.11 |
[머신러닝] ② 사이킷런 모듈 (0) | 2022.08.02 |
[머신러닝] ① 머신러닝의 개념 (0) | 2022.08.02 |
- Total
- Today
- Yesterday
- 디프만
- styled-components
- 자바스크립트 기초
- testing
- CSS
- 리액트
- 프로젝트 회고
- 리액트 훅
- 머신러닝
- frontend
- 프론트엔드 기초
- 프론트엔드
- 자바스크립트
- jest
- react
- JSP
- 스타일 컴포넌트 styled-components
- 자바
- HTML
- next.js
- 타입스크립트
- 파이썬
- rtl
- 인프런
- 데이터분석
- react-query
- TypeScript
- 딥러닝
- 프론트엔드 공부
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |