머신러닝 과정
1. 문제정의 : 프로젝트 목적, 어떤 모델을 만들지?, 지도학습 vs 비지도학습
2. 데이터 수집
3. 데이터 전처리 : 분석 전에 깔끔하게 만들어 줌(이상치 제거, 결측치 처리...)
4. 탐색적 데이터 분석 : 컬럼(변수)간의 관계 확인, 기술통계량
5. 모델 선택 및 학습
6. 모델 예측 및 평가
7. 모델을 가지고 서비스화(웹,앱)
목표
생존자/사망자 예측하는 모델을 만들어보자
머신러닝 모델 종류는 여러가지지만 tree모델 사용해보자
머신러닝 전체 과정을체험해보자
kaggle 경진대회에 참여해서 순위를 확인해보자
데이터 수집
- kaggle 사이트로부터 train, test, submission 다운로드
- train : 학습 시키기 위한 데이터
- test : 학습이 잘 됐는지 예측해보기 위한 데이터
- submission : 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 사이트에 접속 후 Search에 titanic을 검색해주자
빨간네모 클릭 후
Data 탭에서 Download All 클릭해서 타이타닉 데이터를 받아오자
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns # 시각화 라이브러리(모듈)
방금 받아온 타이타닉 데이터 불러온 후 확인해보기 (인덱스를 PassengerId로 지정 해 주자)
# train = pd.read_csv('경로 및 파일명')
train = pd.read_csv('./titanic/train.csv',index_col='PassengerId')
train.shape
train
891개의행과 11개의 컬럼으로 구성된 것을 확인할 수 있다.
# Sibsp : 배우자 + 형제자매 수
# Parch : 부모 + 자식 수
# Cabin : 객실(층, 몇번방)
# Embarked : 승선항
test = pd.read_csv('./titanic/test.csv',index_col = 'PassengerId')
display(test.head())
test.shape
이번에는 상위 5개만 출력 해 보자
display : 출력함수로 본래 가지고 있는 형태를 그대로 출력 print와 유사하나 다르다.
데이터 전처리 및 데이터 탐색
- 결측치 확인
train.info()
test.info()
- train : Age, Cabin, Embarked null값 존재
- test : # Age, Fare, Cabin null값 존재
train-Embarked 결측치 처리(채우기)
# 사람들이 가장 많이 승선한 항을 찾아 결측치 값으로 처리
# train 기준으로 살펴보기 : 학습용 데이터 기준으로 살펴봐야함, 머신러닝 모델의 학습 영향을 주기 때문
# 가장많이 승선한 항 : S
train['Embarked'].value_counts()
# boolean indexing을 통해서 Embarked에 결측치가 있는 행 확인
train[train['Embarked'].isnull()]
# 널값을 채워보자
# fillna('채울값'): 1. 결측치 자리 찾기 2. 결측치 있으면 채우기
train['Embarked'] = train['Embarked'].fillna('S')
train[train['Embarked'].isnull()]
# 상관관계 확인하는 함수 : corr()
# 상관계수 출력
# 상관계수 -1~1 :-1,1 상관관계가 높음/ 0 상관관계가 낮음
# Pclass가 Fare컬럼이랑 가장 상관관계가 높다
# 제외된 컬럼들은 알파벳이 포함 돼 있어서 숫자연산 불가능
train.corr()
# fare를 기준으로
train.corr()['Fare']
# fare를 기준으로 절댓값 내림차순
train.corr()['Fare'].abs().sort_values(ascending= False)
# Pclass를 기준으로 평균 요금 조회
train[['Pclass','Fare',]].groupby('Pclass').mean()
# 성별 컬럼까지 연관해서 기술통계량 확인
train[['Pclass','Fare','Sex']].groupby(['Pclass','Sex']).mean()
# test - Fare 결측치 있는 행 확인하기
test[test['Fare'].isnull()]
# 값 채워보기 - 3등급 남성 : 12.661633
test['Fare'] = test['Fare'].fillna(12.661633)
Age 결측치 처리(채우기)
- 다른 컬럼과의 상관관계를 확인 후 결측치를 채워보자
- corr() 함수를 이용해보자
# train 기준으로 살펴보기
train.corr()['Age'].abs().sort_values(ascending=False)
#Pclass 컬럼이 상관관계가 가장 높음 -> 등급으로 그룹화하여 나이의 평균값 확인
gb1 = train[['Age','Pclass','Sex']].groupby(['Pclass','Sex']).mean()
# 멀티인덱스
gb1
# 멀티인덱스 인덱싱 하는 방법
gb1.loc[(3,'female')]
# train - Age 컬럼 결측치 행 모두 확인하기
train[train['Age'].isnull()]
# 데이터에 복잡한 처리를 하는 함수 연결하는 기능(함수) : apply
1. 사용자 정의 함수 : 복잡한 처리
2. 대상 데이터와 apply를 통해 연결
3. 처리가 완료된 데이터를 실제에 반영함(초기화)
# row 행단위로 처리하게 만드는 함수
# 결측치가 있을 때 처리하는 조건문
def fill_age(row):
if np.isnan(row['Age']):
return gb1.loc[(row['Pclass'],row['Sex'])]
# 없으면 숫자값 그대로 반환 조건문
else :
return row['Age']
# apply 함수 이용해서 fill_age 함수 적용하기
train['Age'] = train.apply(fill_age, axis=1).astype('int64')
train.info()
# fill_age 함수 이용해서 test 데이터 나이 결측치 처리
# age 컬럼과 상관관계 확인하기
test.corr()['Age']
test['Age'] = test.apply(fill_age,axis=1).astype('int64')
test.info()
Cabin 결측치 처리(채우기)
# Cabin에 어떤 값이 들어있는지 확인
train['Cabin'].unique()
# nan 결측치
# EX) C85 (C층,85번째 방)
# 임의로 'M' 값으로 결측치 채우기
train['Cabin'] = train['Cabin'].fillna('M')
test['Cabin'] = test['Cabin'].fillna('M')
# 알파벳만 추출해보자
train['Cabin'] = train['Cabin'].str[0]
train['Cabin']
test['Cabin'] = test['Cabin'].str[0]
test['Cabin']
데이터 탐색
- train 데이터를 기준으로 탐색 : 모델 학습에 도움이 되는 데이터이기 때문
- test를 탐색하는 것은 모델 일반화에 도움이 되지 않음
범주형 데이터 시각화
- Cabin 시각화
- Cabin 컬럼과 생존/사망의 관계 확인핸보기
train_cabin = train[['Cabin','Survived','Name']].groupby(['Cabin','Survived']).count()
train_cabin
# sns 라이브러리로 시각화
- > M층에서는 상대적으로 사망율이 높음
sns.countplot(data = train, x = 'Cabin', hue = 'Survived')
Pclass 시각화
- 승객 등급과 사망/생존 관계 확인해보기
-> 등급이 높을수록 생존율이 높음
sns.countplot(data = train, x = 'Pclass', hue = 'Survived')
Cabin과 Pclass 시각화
- M층에서 왜 사람이 많이 죽었는지 확인해보기
- 등급과 연관이 있는 것인지 확인해보기
- > M층에서 사망율이 높은 이유는 승객의 등급이 3등급인 사람이 많이 있었음
sns.countplot(data = train, x = 'Cabin', hue = 'Pclass')
Sex,Embarked 시각화
- 성별이 사망/생존과 얼마나 연관이 있는지 확인
sns.countplot(data = train, x = 'Sex', hue = 'Survived')
- 승선항이 사망/생존과 얼마나 연관이 있는지 확인
sns.countplot(data = train, x = 'Embarked', hue = 'Pclass')
수치형 데이터 시각화
- Age컬럼 생존/ 사망 관계 확인하기
# 바이올린 플롯
plt.figure(figsize=(15,5))
sns.violinplot(data=train, x ='Sex', y = 'Age', hue = 'Survived', split = True)
# y값 범위 지정해주기 ylim(시작범위,끝범위)
plt.ylim(0,80)
# 남자아이일 경우에 생존율이 높음
# 여자아이일 경우에 사망율이 높음
train['Age'].describe()
Fare 시각화
# Fare 요금의 기술통계량, 확인해보기!
# 일반적인 사람들은 중앙값 기준으로 14정도 내고 승선했을 것 (= 대푯값)
# 평균이 대표가 될 수 없는 이유 512라는 큰값의 영향을 받았을 수 있기 때문
train['Fare'].describe()
# 바이올린 플롯
plt.figure(figsize=(15,5))
sns.violinplot(data=train, x ='Sex', y = 'Fare', hue = 'Survived', split = True)
# y값 범위 지정해주기 ylim(시작범위,끝범위)
plt.ylim(0,512)
# 성별에 상관없이 요금이 낮을수록 사망율이 높음
'Machine Learning' 카테고리의 다른 글
[Machine Learning] Colab사용 OpenCV 실습 (0) | 2022.07.20 |
---|---|
[Machine Learning] 손글씨데이터 활용 분류 실습 (0) | 2022.07.20 |
[Machine Learning] 타이타닉 데이터 활용하여 생존/사망 분류 실습02 (0) | 2022.07.19 |
[Machine Learning] Pandas와 Matplotlib을 사용해서 카카오톡 대화 전처리 실습 (0) | 2022.07.12 |