[삼성 SDS Brightics #4-2] 브라이틱스 스튜디오로 Kaggle Competition에 제출해보기 3탄 (마지막)
안녕하세요!!
오늘은 캐글 타이타닉 대회 참가하기 3탄 (마지막!!!)을 갖고 왔습니다.
지난주에 제출한 점수보다는
더 좋은 결과가 나왔답니다
몇 등 했는지는 블로그 마지막에 올릴 테니
끝까지 봐주세요!
참고로
캐글 타이타닉 대회의 목적은
탑승객들의 여러 가지 특징을 통해
생존 여부를 맞추는 거예요.
(0 = 생존하지 못함, 1=생존함)
아 그리고 이번 실습은 macOS 대신 windows 컴퓨터로 사용해서
제일 최신 버전의 브라이틱스 스튜디오를 썼어요.
더 많은 함수가 들어있어서 좋았어요 (특히 string split진짜 좋음..)
+ macOS 도 버전이 업데이트 됐는데 제 컴터가 고장나서,,
이건 전체적인 그림!
위에 있는 python script 줄은 train.csv 파일이고
밑에 있는 python script 줄은 test.csv 파일이에요.
아 그리고 시작하기 전에 브라이틱스 사용 꿀팁..!
우측 상단에 있는 run 버튼을 누르면
모든 함수가 실행되거든요,,
새로운 함수 추가했을때
함수 한개씩 run 버튼 누르지말고
전체 run 버튼 눌러주면 정말 편합니다!!
이번 실습을 위해, 아직 브라이틱스 스튜디오 설치 안 하신 분들은
아래 블로그를 확인해 주세요!!
+ macOS 버전도 업데이트 됐습니다!!!
https://blog.naver.com/hasong0131/222387019316
설치하신 분들은 바로 아래 링크를 클릭해 주세요.
Step 1) 브라이틱스에 CSV 데이터 업로드하기
사용된 함수: Python Script
우측에 있는 팔레트에 가서
'Python Script'를
열면
다음과 같이 입력해 줍니다.
import pandas as pd
df(이 변수는 이름 바꿔도 상관없음) = pd.read_csv('파일 경로')
12줄에 있는 Cabin 을 설명하자면
Cabin 데이터 형식이 E15, A23 이런 식으로 되어있는데
앞에 있는 알파벳만 가져오기 위해
df['Cabin'] = df['Cabin].str.slice(0,1)
이렇게 해주었어요.
업로드를 했으면, 다음 분석 단계는
데이터 전처리인데
먼저 'Statistic Summary' 와 String Summary'를 사용해
Null 값이 있는지 확인해 주세요.
Age, Cabin, embarked는 null 값이 있으니
전처리 단계에서 처리해 줄게요.
Step 2) 데이터 정제' Name Column'
사용된 함수: String Split
저는 'Name' column에 있는 honorific (경칭)만 불러오기 위해서
'String Split'함수를 써줬어요.
Input Column: Name
Delimeter: , (comma 뒤에 스페이스 한칸이 필요해요)
Output Column Count: 1
Output Column Type: string
이렇게 하면 Name column 이
Mr. Mrs. 와 같은 honorific으로
시작돼요.
또 한 번 'String Split'함수를 사용해서
다음과 같이 입력해 주세요.
Input Column: Name
Delimeter: .
Output Column Count: 1
Output Column Type: string
여러붕.. String split 은 혁명이에요 ㅜ^ㅜ
업데이트 되기 전 버젼에서 string split 하고싶으면
python script 로 직접 입력해야됐는데
이젠 정말 코딩이 필요없어져버린...
Step 2) 데이터 정제' Age Column'
사용된 함수: Replace Missing Number
아까
'Statistic Summary'에서 확인해본 결과
Age에 Null 값이 있더라고요.
앞서 추출한 'split_0' column
즉 경칭만 모아둔 column의 평균값을 이용해
null 값을 채워줄 거예요.
이 column 을 사용하기로 한 이유는
경칭에는 나이에 대한 정보도 담겨있기 때문이에요.
예를 들어
Master는 18세 이하의 어린 남성의 경칭이고
Miss는 30세 이하의 미혼 여성의 경칭이에요.
때문에
master라고 불리는 사람의 나이가 null일 경우
'male'의 평균 나이를 사용하는 것보다
'master'의 평균 나이를 사용하는 게 더 정확하겠죠.
아래와 같이 입력해 주세요.
Input Column: Age
Fill Value: Mean
Group By: split_o
'Group By' 라는 기능 활용해
아주 간편하고 빠르게
null 값이 잘 채워졌네요.

Step 2) 데이터 정제
' Cabin'
사용된 함수: Replace Missing String
Input Column: Cabin
Fill Holes With: N
Consider Empty String as Null: True
'String Summary'로 확인해본 결과
Cabin 도 null 값이 있기 때문에
저는 이걸 N으로 입력해 주었어요.
Step 2) 데이터 정제
' Embarked'
사용된 함수: Delete Missing Data
이건 train.csv 에만 해당되는 전처리 단계인데,
Embarked에 null 값이 두 개 있어서
'Delete Missing Data'함수로 지워줄 거예요.
Step 3) 데이터 변환
' Embarked, Sex, Cabin'
사용된 함수: One Hot Encoding, Add Function Column
Embarked, Sex, Cabin 과 같은
범주형 변수 (categorical variable)는
변수 내 값의 대소를 비교하기 힘들기 때문에
범주형 변수를 숫자로 만들기 위한
Encoding 작업이 필요합니다.
Encoding 은 Label Encoding 과 One Hot Encoding 이 있습니다.
Label Encoding 은 각각의 데이터를 숫자로 변환시키고
One Hot Encoding 은 각각의 데이터를
가변수 (dummy variable)로 생성하여
0,1의 값을 가지게 만듭니다.
titanic dataset 같은 경우
Label Encoding 을 사용한다면
(예를 들어 Embarked_C = 1, Embarked_Q = 2, Embarked_S=3)
ranking 이 없는 범주형 데이터에
ranking을 주기 때문에
'One Hot Encoding'을 사용하겠습니다.
인코딩을 파이썬으로 작업하려면 이렇게나 많은 코드가 필요한데
브라이틱스에는 'One Hot Encoding' 이라는 함수가
내제되어있어서
클릭하나로 정말 빠르게 인코딩을 할 수 있었어요!!
Embarked는 (C, Q, S)로 총 세 개의 값으로만 이루어져 있는데
위에 사진을 보면
각 데이터 별로 가변수가 3개 생긴 걸 볼 수 있어요.
Suffix Type에서 기본값인 Index를 사용하면
Embarked_0, Embarked_1, Embarked_2로 생성이 되고
Label 을 사용하면
Embarked_C, Embarked_Q, Embarked_S로 생성이 됩니다.
Index를 사용하면 나중에 뭐가 뭔지 헷갈리기 쉬우니
저는 Label 을 사용해 주었어요.
하지만 Label 을 사용할 땐 값에 공백 / 특수기호 없이
칼럼명으로 쓰기 적당해야 합니다.
titanic dataset의 경우 label로 써도 되지만
나중에 다른 데이터 셋을 쓸 땐 이 점을
알아두는 게 좋을 것 같아요.
Sex 와 Cabin 도 같은 방법으로 인코딩 해주었습니다.
마지막으로 'SibSp' 와 'Parch' 변수를 더해
'Famsize'로 변환해 주었습니다.
여기서 SibSp는 형제자매 / 배우자 수
Parch는 부모 / 자녀 수입니다.
Step 4) 모델링
'Logistic Regression'
사용된 함수: Select Column, Logistic Regression Train, Logistic Regression Predict, Plot Roc and PR Curves
모델링을 시작하기 앞서,
데이터 정제와 변환 후 너무 많은 column 이 생겼으니
'select column' 함수를 사용해서
모델링 할 때 필요한 변수들만 남길게요.
다음과 같이 필요한 칼럼에만
체크박스를 눌러주세요.
저는 PassengerID, Survived, Pclass, Age,
sex_female, sex_male,
Cabin_A~Cabin_N (cabin T는 한개밖에 없어서 제외했습니다)
Embarked_C, Embarked_Q, Embarked_S,
Fam Size만 남겨주었습니다.
음.. 클릭한방으로 데이터 정리가 되었네요.
서포터즈라 과장하는게 아니라,,
진.짜. 클릭만 했는데 이것저것 다 되는게 신기하네유..
2탄에서는 Linear Regression을 사용했지만
이 데이터 셋에서는
범주형 변수가 많기 때문에
거기에 더 적합한
'Logistic Regression Train'으로
학습시켜주었습니다.
Feature Column 은
passenger Id 와 survived 제외 나머지를 선택했고
Label Column 은
타이타닉의 생존 여부를 맞추는 것으로
Survived를 선택해 주었습니다.
그다음 'Logistic Regression Train' 과
test.csv에서 전처리를 끝낸 'Select Column' 함수를
'Logistic Regression Predict'에 연결시켜줍니다.
'Logistic Regression Predict'를 실행시키면
함수를 사용하여 'prediction'과 'probability_0','probability_1'이 나옵니다.
probability_0은 결과가 0일 확률이고
probability_1은 결과가 1일 확률이며
prediction 은 'threshold'에 의해서
최종적으로 나온 값입니다.
이 threshold를 확인해보기 위해서
'Plot ROC and PR Curves'함수를 사용해보겠습니다
threshold는 0.5로 나왔네요.
원래 이 함수는 모델의 성능을 평가하기 위해서 사용되는데
저는 test 데이터로 survived 가 없는 캐글 파일을 사용했기 때문에
캐글에 제출해서 제 모델이 잘 처리됐는지 확인해볼게요!
Step 5)
캐글 점수 / 등수
이렇게 해서 제출한 제 등수는,,
50649명 중 32039이었답니다.
점수는 0.77033로
대략 77%의 탑승객의 생존 여부를 맞혔다는 뜻이에요!
지난번에 받은 점수는 0.63157로
49012명 중 47680이었으니까
저번보다는 더 나은 점수를 받았네요...!!
가변수를 활용한 범주형 변수변환
Cabin 변수 추가
그리고 threshold 가 더 낮아진게 도움이 되었던 것 같아요.
물론 개선이 더 필요한 부분이 있지만,,
잘생각해보면
저는 코딩없이 일주일만에 이 점수를 받았다는게
놀랍지 않나요?!?!
일단 저는 놀랍습니다.ㅎㅎ

미니 실습은 이번주가 마지막이라
아마 다음주부터 그룹 프로젝트를 하게 될 텐데
서포터즈가 마무리될 때쯤 한 번 더 제출해 보고 싶네요 ㅎㅅㅎ
(그때쯤이면 실력이 조금 더 늘었을 거라 예상해보겠습니다,,)
브라이틱스 한달 사용후기
블로그가 너무 길어져서,,
다른 블로그에서 후기 남기겠습니다!
아래링크를 통해 확인해주세용
https://blog.naver.com/hasong0131/222413346841
[본 포스팅은 Brightics 서포터즈로서 직접 체험하고 작성한 리뷰입니다.]