안녕하세요!
27년차가 되버린 진로탐색꾼 조녁입니다!
다들 잘 지내셨나요?! 저는 한동안 눈건강이 안좋았어서 잘 쉬고 왔습니다 ㅎㅎ
안타깝게도 제가 퇴사 직후인 11월 말에 들었던 강의에 대한 복습을 한달반이 지난 지금하고 있네요 ㅠㅠ 반성 ..
그래도 하나씩 해보려고요!
오늘은 5일차에 했던 실습 중 타이타닉호 생존자를 머신러닝을 통해 예측해볼까 합니다!
Kaggle(케글)은 해외 머신러닝 경진대회 사이트입니다. 이미 대회가 끝나 많은 분들의 코드가 존재하는 타이타닉 생존자 예측과 같은 것들을 풀어보면 머신러닝 학습에 도움이 크게 되니 강추입니다!!!
저는 우선 첫 시작으로 타이타닉을 풀어봤는데 아래 포스팅 따라서 코드 작성해보고 csv 파일 출력 및 케글 제출&채점까지 같이 해보면 좋을거같아요 ㅎㅎ
차근차근 하나씩 해보겠습니다~! 직접 코드를 작성해보는 게 중요하다고 생각해서 설명은 최소화하고 직접 하나하나 따라오실 수 있도록 코드와 결과값 첨부해놨습니다!! 혹시나 모르겠는 부분은 댓글에 남겨주세요.
* 저는 Colab에서 작성하였습니다. 각각의 줄에 대한 출력값들은 캡쳐해서 첨부할게요.
#1.Import Libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#2. Read Data
from google.colab import files
uploaded = files.upload() #글 상단에 올려놓은 t_train.csv 와 t_test.csv를 업로드
train_df = pd.read_csv('t_train.csv',index_col='PassengerId')
print(train_df.shape)
train_df.head()
train_df.info() #None == Not a number , so none != null
train_df.describe() #문자열로 된 열은 제공 X
이제 똑같이 test 값도 불러온 후 정보 확인.
test_df = pd.read_csv('t_test.csv',index_col ='PassengerId')
print(test_df.shape)
test_df.head()
test_df.info() ; test_df.describe()
3.Preprocessing(전처리)
: 여기서 아까 확인한 info에서 확인한 열 중에 값이 비어있는 부분 채워주고 데이터 타입 사용할 수 있도록 숫자로 바꿔준다.
train_df.loc[train_df['Sex'] =='female','Sex'] =0 #loc 함수를 써서 [조건이 맞을때 ,항목]= 0으로 값을 바꾼다.
train_df.loc[train_df['Sex'] == 'male','Sex'] =1
train_df
test_df.loc[test_df['Sex'] =='female','Sex'] =0
test_df.loc[test_df['Sex'] == 'male','Sex'] =1
test_df
train_df[train_df['Fare'].isnull()] #비어있는 값이 있나 확인
test_df[test_df['Fare'].isnull()]
mean_third_fare = train_df[train_df['Pclass']== 3]['Fare'].mean()
print(mean_third_fare)
# >>> 13.675550101832997 ... 3등급이라 요금이 확실히 저렴
test_df.loc[test_df['Fare'].isnull(),'Fare'] = mean_third_fare
test_df[test_df['Fare'].isnull()]
mean_age_1 = train_df[train_df['Pclass']==1].Age.mean()
mean_age_2 = train_df[train_df['Pclass']==2].Age.mean()
mean_age_3 = train_df[train_df['Pclass']==3].Age.mean()
print(mean_age_1)
print(mean_age_2)
print(mean_age_3)
train_df.loc[train_df['Pclass']==1,'Age'] =mean_age_1
train_df.loc[train_df['Pclass']==2,'Age'] =mean_age_2
train_df.loc[train_df['Pclass']==3,'Age'] =mean_age_3
train_df[train_df['Age'].isnull()]
3-1. One hot encoding
: S,C,Q로 표현되는 선박장(Embarked)을 구분하여 나타내기 위해 One hot encoding 사용
train_df['Embarked_C'] = train_df['Embarked'] =='C'
train_df['Embarked_S'] = train_df['Embarked'] =='S'
train_df['Embarked_Q'] = train_df['Embarked'] =='Q'
train_df
test_df['Embarked_C'] = test_df['Embarked'] =='C'
test_df['Embarked_S'] = test_df['Embarked'] =='S'
test_df['Embarked_Q'] = test_df['Embarked'] =='Q'
test_df
train_df['Pclass_1'] = train_df['Pclass'] == 1
train_df['Pclass_2'] = train_df['Pclass'] == 2
train_df['Pclass_3'] = train_df['Pclass'] == 3
train_df
train_df['Pclass'].value_counts()
test_df['Pclass_1'] = test_df['Pclass'] == 1
test_df['Pclass_2'] = test_df['Pclass'] == 2
test_df['Pclass_3'] = test_df['Pclass'] == 3
test_df
4. Train(학습)
: 이제 위에서 전처리한 train_df의 column 중에 예측하는데 도움될만한 feature만 선정해서 사용한다.
feature_names = ['Sex', 'Age', 'SibSp', 'Parch',
'Fare','Embarked_C', 'Embarked_S', 'Embarked_Q',
'Pclass_1', 'Pclass_2', 'Pclass_3']
feature_names
x_train = train_df[feature_names] x_train에 train_df 중에 내가 정한 feature_names 항목만 남긴다. 그림 확인
print(x_train.shape)
x_train.head()
x_test= test_df[feature_names]
print(x_test.shape)
x_test.head()
y_train = train_df['Survived'] #train_df의 생존자 값을 y_train값으로 지정
y_train
하이퍼 파라미터 설명 : max_depth 는 최대 깊이, n_estimators : 결정 트리의 갯수 , random_state는 내가 좋아하는 수 넣으면 된다. 다만, 다음에 모델 정의할 때도 같은 숫자를 넣어야 동일한 조건에서 학습 가능 , max_features : 최적의 분할을 위해 고려해야할 최대 피쳐갯수 (지금같이 float으로 줄 경우 비중)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(max_depth=100,
max_features=0.8,
n_estimators=500,
random_state=42)
model
model.fit(x_train, y_train) #불러온 모델을 학습시킨다.
prediction = model.predict(x_test)
print(prediction.shape)
4-1. Feature Importance
importances = model.feature_importances_ #feature 중에 결과에 영향을 많이 주는 순서 확인!!
importances
indices = np.argsort(importances)[::-1]
indices
importance_names = [feature_names[i] for i in indices]
importance_names
plt.figure()
plt.bar(range(len(importance_names)), importances[indices])
plt.xticks(range(len(importance_names)),importance_names, rotation=90)
plt.show()
# pick up proper features
from sklearn.feature_selection import SelectFromModel
model = RandomForestClassifier(max_depth=100,
max_features=0.8,
n_estimators=500,
random_state=42)
model
selector = SelectFromModel(model, threshold=0.1)
selector
features_important = selector.fit_transform(train_df[feature_names], train_df['Survived'])
features_important
model.fit(features_important, y_train)
proper_features = train_df[feature_names].columns[selector.get_support()]
proper_features
5.Validation
: 케글은 제출하면 점수를 알려주는데, 제출하기 전에 어느정도 나올 지 한번볼게요.
from sklearn.metrics import accuracy_score #직접 data를 나눠서 할 수도 있지만 내장함수를 써서 점수를 바로 볼 수 있어요.
print('Accuracy: ', accuracy_score(model.predict(x_train), y_train)) # features_important
from sklearn.metrics import mean_squared_error
print('MSE(Training data) : ', mean_squared_error(model.predict(x_train), y_train)) # features_important
6. Submit
prediction = model.predict(x_test[proper_features]) #proper_features
print(prediction.shape)
from google.colab import files
upload = files.upload()
submit =pd.read_csv('t_gender_submission.csv',index_col='PassengerId')
print(submit.shape)
submit.head()
submit['Survived'] = prediction
submit
submit.to_csv('re_submit.csv')
이제 추출한 csv 파일을 kaggle에 제출해볼건데요! 아래 링크에 들어가셔서 다운로드 그림있는 곳에 제출해주시면 알아서 채점해줍니다!!
www.kaggle.com/c/titanic/submit
이상으로 타이타닉호에 탑승했던 승객들에 대한 생존자 예측을 해봤습니다!!
처음 풀어봤을 때는 사실 강사님이 알려주신대로 따라갔었는데, 다시 풀려니까 뭔 소리인 지 기억이 안나서 당황했습니다..
그래도 다시 풀면서 하나하나 복습하면서 더 공부가 되었던 것 같아요!
비록 아직 케글했다기엔 점수가 낮지만 머신러닝을 통한 예측이 어떻게 이뤄지는 지 익히고 파이썬 공부랑 수학 공부도 하면 나중엔 더 높은 점수로 풀 수 있지 않을까 싶습니다!!
다음 게시물로는 동일하게 케글에서 진행했던 전기 자전거 대여 시간을 날씨,날짜 등의 조건을 주고 예측해보는 문제를 풀건데요. 최근에 따릉이와 같은 공유자전거의 수요가 늘어나면서 지역별 사용량을 예측해서 효율적으로 잘 분배하는 데 도움이 되지 않을까 싶어요.
'프로그래밍 공부 > 코드프레소 교육' 카테고리의 다른 글
[코드프레소XAI양재허브]AI/ML 기초교육 6일차 (1)_ 자전거 공유 수요 예측 (4) | 2021.01.19 |
---|---|
[코드프레소XAI양재허브] 인공지능 실무과정 2일차 (0) | 2020.12.08 |
[코드프레소XAI양재허브]AI/ML 기초교육 5일차 (1) (0) | 2020.12.07 |
[코드프레소XAI양재허브]AI/ML 기초교육 4일차 (2) (2) | 2020.12.04 |
[코드프레소XAI양재허브]AI/ML 기초교육 4일차 (1) (2) | 2020.12.03 |