티스토리 뷰

들어가기에 앞서... accuracy : 0.78468 / gradient descent algorithm & logistic regression 직접 코드 짬

지난 학기에 '데이터사이언스 개론' 수업을 듣고 방학 때 롯데 엘포인트 대회를 통해 실전을 맞이했는데, 현실은 생각보다 가혹하더라. 심지어 거기서 준 데이터도 어느 정도 정리를 하고 줬을텐데... (아 근데 아닌것 같다... 가상 데이터면 가상 데이터지 정리는 1도 안하고 주신 듯... 맞죠?) 그리고 이번 학기에는 데사개의 연장선 상에 있는 '데이터마이닝과 분석' 이라는 수업을 듣고 있다. 중간고사가 끝나고 한참(?) 후에야 나온 첫 번째 과제는 Kaggle의 시작과도 같은 Machine  Learning from Disaster (과제가 나온 것 자체가 disaster...ㅋㅋㅋ), 즉 타이타닉 생존자  예측 모델링. 근데  과제의 포인트는 accuracy를 높이는 것이 아니라, logistic regression에 사용되는 gradient descent algorithm을 짜는 것. 그래서 최종 제출할 파일의 accuracy는 성별로만 생존 판별을 했을 때의 정확도인 0.76555보다만 높게 나오면 되었다.

정식으로 써 놓은 과정에 대한 글은 내 캐글 커널에  있다. 어려운 단어는 단 한개도 없으니 영어에 트라우마가 있지  않는 이상 들어가서 원문 그대로를 읽는 것이 좋을 것 같다. 왜냐묜 내가 쓴 글을 해석해서 올릴거라서 이상해 매우 이상해 오글고료... 아 원본 들어가서 업 버튼 한번씩 눌러주세요 꺄륙>< 해석을  시작해볼까아~? (진짜  그냥  커널로 들어가시는게 매우 좋을 듯...) 참고로 코드를 직접 복사해서 돌려보고 싶으신 분들은 커널로 들어가셔야할거에요, 여긴 이미지 파일이거든요.


Introduction

캐글에 입문하신 여러분 환영합니다! 이  커널을 읽기 위해 더 내려가기 전에 미리 말씀드려야 할 것이 있어요. 이 커널은 정확도를 높이는 것보다 파이썬을 통해 gradient descent 알고리즘과 logistic  regression을 패키지를 사용하지 않고 코드를 짜는 것에 포커스가 맞추어져 있어요. 그래서 random하게 발생되는 초기값에 따라 accuracy가 매우 다르고,  아래에 주어진 고정된 weight는 10번 이상의 파일 제출결과라고 보시면 됩니다.

저 역시 캐글의 입문자이기 때문에 많은 분들이 타이타닉 커널에서 시작한다는 사실을 잘 알고 있습니다. 저 역시 이 곳에서 많은 캐글러들의 도움을 받았고 그  분들 덕분에 0.78468이라는 결과를 낼 수 있었죠. 그래서 비록 여러분들이 제 커널에 관심 없어서 뒤로가기를 누르려고 해도 꼭 많은 분들의 글을 참고 했으면 좋겠고 유튜브도 큰 도움이 될 것입니다.

제 글을 계속 읽기로 결심하셨다면 저는 모든 댓글들을 환영하고 여러분의 글이 제 코드를 발전시킬 수 있다면 더할 나위  없이  기쁠 것 같아요. 그러면 시작해볼까요?

Data  Exploration & Visualization

주어진 데이터를 이해하는 것은 매우 중요해요. 데이터를 탐색하면서 feature engineering이나   data cleansing을 어떤 방향으로 할지 대략 감을 잡을 수 있고, 무엇보다 가진 데이터에  대한 안목을 기를 수 있어요.

이렇게 보니 categorical value로 부터 정보를 추출해야 할 것 같고, 나중에 logistic regression에 적용시키려면 모두 numerical value로 바꿔줘야 할 것 같네요. 주어진 데이터에 결측값은 없을까요? 네, 몇개의 feature들이  결측값을 가지고 있으니 어떻게 처리할지 결정해야 할 것 같네요.

Visualization

Feature Engineering

SibSp & Parch → FamilySize → Alone

'FamilySize'라는 새로운 feature를 정의 해볼텐데요, SibSp, Parch를  합하고 티켓 소유자인  본인까지 더한 값으로 넣어줄 예정입니다.

솔직하게 말하면 FamilySize로 정리하면 3~4개로 항목이  줄어들 줄 알았는데 예상한 것보다 많아졌네요. 그래서 조금 더 깊숙히 들어서 FamilySize를 한 번 더 정리해보도록 할게요. 이번에는 이 사람이 혼자 승선했는지, 가족과 함께 올라왔는지 알아보기   위해 'Alone'이라는  feature로 정리해서 생존률에 영향을 미치는지 살펴보도록 하겠습니다.

결과를 보아하니 혼자 탄 사람은 50% 정도의 생존률을 보이고,  가족과 함께 탄 사람은 30% 정도의 생존률을 보이네요. 데이터를 이렇게 활용하기로 하고, 'Alone'을 만들기 위해 쓰인 SibSp, Parch, FamilySize는 이제  불필요하니 data frame에서 지우도록 할게요.

Embarked

train 에서 단 2개의 결측값만 존재했으므로 전체 데이터셋에서 가장 많이 나온 'S'로 채우도록 하겠습니다.

Fare

금액은 Pclass로 그룹을 지어서 1등석, 2등석, 3등석의 요금 중앙값으로 결측값을 채워넣을거에요.

Fare가 어떻게 퍼져있는지 좀 보기 위해서 그림을 좀 그려볼게요.

Fare 데이터를 활용하려면 연속적인 fare를 범위를 지정해서 몇개의 category 로 나누어야 하는데 4개의 그룹을 만들고, 일정한 gap을 두지 않고 각 그룹에는 같은(비슷한) 양의 데이터가 들어가도록 할게요.

Age → Name(Title) → Age

이제 Age를 처리하기 위해 먼저 Name에서 '호칭'(title)을 추출해볼게요. Title을 추출하고 나면 Title 별로 그룹을 짓고 Title의 평균 값으로 결측값을 채울 예정입니다.

다 채워진 줄 알았는데 test에서 여전히 1개의 데이터가 채워지지 않았어요. 왜죠?

980번 손님의 나이가 채워지지 않은 이유는 test 데이터에서 이 분 혼자만 Ms라는 호칭을 갖고 있기 때문인데요, 이 분은 train 데이터에 Ms 호칭을 가지신 분들의 평균 나이로 채우도록 하죠.

Age도 Fare와 마찬가지로 continuous 한 numerical value를 좀 모아야 해요. 먼저 나이대가 어떤지 그래프를 그려보고 이번에는 5개의 그룹으로 나눠보도록 하겠습니다.

Cabin

Cabin 데이터는 결측값이 무려 77%를 차지하고 있으니 매우 중요한 요소일 수도 있지만 여기서는 drop 시키도록 할게요.

Data Cleansing

Gradient Descent Algorithm & Logistic Regression

tmp = 1은 후에 lost function을 구하기 위해 편미분을 할 때 첫번째 weight에 1을 곱해주기 위해 임의로 넣어준 값입니다.

사실 이부분이 accuracy에 가장 큰  영향을 미치는 부분인데,  저와 같은 결과를 내보고 싶으신 분들은 random generation하지 마시고
w_list = np.array([-0.6317466601918094, -0.05653350853635963, 0.8556811494570249, -0.03946554989032114, -0.8449024756038757, 0.2661752869088194, 0.002126179261684902]) 
로 값을 고정시켜주시고 진행해주시면 됩니다.

완성!

 

 

donaricano-btn

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