2016년 돌아보기 – Competition

2016년에 참가한 대회 성적은 아래와 같다.

2016년에는 대회에서 전년도에 비해 부진한 결과를 거뒀다.  2015년에 워낙 좋은 성과를 거두었고, 해마다 대회가 더 치열해지기도 했지만, 어느 정도 계획한 바이기도 하다.

지난 해에는 회사와 내 인지도를 올리기위해 수상을 목표로 팀을 구성해서 대회에 참가했다.  넷플릭스 대회 우승자인 Michael을 비롯해 미국, 중국, 일본, 싱가폴 등지에서 전문가들을 섭외했었다.

하지만 올해에는 회사 팀원들에게 발전기회를 주기 위해 팀원들과 LA에 있는 보다 경험이 부족한 사람들과 함께 대회에 참가했다.

때문에 올해의 결과에 어느 정도 만족한다.  멤버들의 실력이 많이 향상되었고 갈수록 팀내에서 내 기여도가 줄어들고 있다.  내년에는 이 멤버로 대회 수상을 하는 것이 목표이다.

 

2016년 하반기 돌아보기 – 운동

 

2016년 하반기에 내가 한 운동은 러닝머신과 팔굽혀펴기 뿐이다.

  • 러닝머신은 6개월 간 총 20회 헬스장에 방문해서 매번 2마일씩 총 40마일을 뛰었다 – 점심시간 전후 30분 정도 시간이 있는 날이면 무조건 회사 근처 헬스장에가서 뛴다.  헬스장 왕복에 30분, 뛰는데 20분, 샤워하는데 20분, 샌드위치로 점심 먹는데 20분, 총 1시간 30분 걸린다.
  • 팔굽혀펴기는 틈틈히 한 번에 나이 수대로 하고 있다 – 주로 샤워하기 전, 출근 후, 잠자기 전에 한다.

30분 유산소 운동은 신경가소성 (Brain Plasticity)를 촉진시킨다고 한다.  점심시간에 운동을 시작한 이후로 확실히 몸이 가벼워지고 집중력이 향상된 것을 느낀다.

페이스북의 마크 주커버그는 일년에 365마일을 뛰는 것을 목표로 한다.  그만큼은 아니더라도 내년에는 일년에 200마일, 6개월에 100마일을 뛰어봐야겠다.

2016년 하반기 돌아보기 – 책

2016년 하반기에는  아래와 같이 11권의 책을 읽었다.   이 중 가장 인상깊었던 책은 Ericsson 교수의 Peak.  자신과 자녀들의 가능성을 극대화시키기를 바라는 모든 분들에게 일독을 권한다.


신앙/영성

1. The Reason for God

2008년 발간된 팀 켈러의 초기 저서. CS 루이스의 순전한 기독교의 21세기 버전이라고 할만하다.


역사/인물

2. World War II: A Military and Social History

원준이의 추천으로 듣게 된 UPenn의 Childers교수의 제 2차 세계대전에 대한 강의. 총 30강, 15시간짜리 강의내내 영화를 보는 듯 흥미진진했다.

3. Creativity, Inc.

픽사의 공동창업자이자 회장인 Ed Catmull의 애니메이션을 위한 50여년의 여정.


비지니스

4. The Ten Commandments for Business Failure

전 코카콜라 회장 Don Keough이 들려주는 조언.

5. Competing Against Luck

Innovator’s Dilemma의 저자이자 하버드 경영대학원 교수인 Christensen의 최신 저서. 혁신의 기회를 어떻게 찾을 것인가에 대한 페러다임으로 “Jobs-to-be-Done”을 제시.

6. Rework

새로운 시대의 새로운 일하는 방식.  사업계획을 새우는 것은 해롭고, 외부투자자는 필요없고, 경쟁사는 신경쓰지 말아야하고, 야근하지 말고, 직원 늘리지 말고, 재택근무를 권장해야한다.

8. Remote

Rework의 저자들이 쓴 재택근무에 관한 책.


인문학

9. Peak

엘리트 연구분야의 권위자 Ericsson 교수가 전하는 보통사람의 특별한 가능성.  당신도 월드클래스가 될 수 있다.

10. Talent is Overrated

Peak과 같은 맥락의 책.  Peak보다 일반인들의 일상적인 직장생활을 중점적으로 다루고 있다.  매주 40시간씩 직장에 투자하는데 왜 당신은 성공하고 있지 않는가.

11. The Structure of Scientific Revolutions

과학의 혁신은 기존의 페러다임을 점진적으로 발전시킴으로써 이루어지기보다 새로운 페러다임의 출현을 통해 이루어진다.

2016년 상반기 돌아보기 – 책

2016년 상반기에는  아래와 같이 10권의 책을 읽었다.  이 중 가장 인상깊었던 책은 Superforecasting.


신앙/영성

1. NIV, Holy Bible

90일 플랜으로 연초부터 읽다가 늦춰져서 결국 6개월을 채워서 마침.  읽을 때마다 새로운 부분이 있는 것은 왜일까.


통계/데이터사이언스

2. Superforecasting

작년에 읽은 The Signal and the Noise가 전문가 예측에 대한 기대치를 낮추어주었다면 (no better than dart throwing chimps), 이 책은 다른 전문가 그룹에 비해 월등히 우수한 예측을 하는 슈퍼 예측가들이 있다는 사실을 밝히고 그들이 어떻게 슈퍼 예측가가 되었는지를 알려준다.

3. The Master Algorithm

머신러닝, 인공지능 분야의 다섯 가지 주류 연구 동향을 비교/소개 하고 궁극적인 마스터 알고리즘에 대한 방향을 제시한다.  자기 PR 부분만 제외하고 읽으면 머신러닝의 역사 및 최근 연구 동향을 리뷰하는데 더 없이 좋은 입문서이다.


역사/인물

4. Waterloo

유럽의 역사 상 가장 중요한 전투 중 하나인 워털루 전쟁.  그 전쟁의 기승전결을 생생히 그려낸 책.  나폴레옹과 웰링턴의 역사적인 한 판 승부.

5. Elon Must

스티브 잡스 이후 가장 큰 이슈가 되고 있는 CEO.  대단한 인물이지만 타인에 대한 배려가 없다는 점에서 본받고 싶지는 않다.


비지니스

6. The Hard Thing About Hard Things

저명한 VC 호로비츠의 자전적 비지니스 서적.  스타트업/중견기업 경영 실무에서 자신에게 가장 힘들고 어려웠던 일들에 대한 조언.

7. The Effective Executive

피터 드러커의 경영 고전.  핵심은 시간 관리.


인문학

8. Influence

어떻게 설득할 것인가.  어떻게 설득 당하지 않을 것인가.

9. Crucial Conversation

상대의 감정을 상하지 않고 중요하고 민감한 주제에 대해 대화하는 방법.


소설

10. The Hitchhiker’s Guide to the Galaxy

말이 필요없는 공상과학소설의 고전.

2015년 돌아보기 – Competition

2015년을 돌아보기에 많이 늦은 감이 있지만 better late than never.

2015년에는 competition에서 많은 성과를 올린 한 해였다. 그 중 가장 큰 성과는 KDD Cup 2015에서 1등. 덕분에 내 인지도도 높아지고 회사 세일즈에도 큰 기여를 했다. 그 다음으로는 Kaggle 전체 랭킹 10위. 연초에 아내에게 1등 한 번하고, Kaggle에서 전체 10등 안에 들면 competition에서 은퇴하겠다고 했었는데, 두 가지 모두 달성한 것이다. 하지만 은퇴는 아직… 쿨럭;

아무튼 2015년에 Competition 부문에서 이룬 전체 성과는 아래와 같다.

특히 KDD Cup은 정말 우승하고 싶었던 competition이었다. KDD Cup 2012년에는 아쉽게 2등을 했었다. 2015년에는 1등을 하겠다고 작정을 하고 잘하는 멤버들을 꾸준히 영입해서 드림팀을 만들었다. 내 competition 스승이자 절친인 오스트리아 듀오 Michael과 그의 단짝 Andreas, 싱가폴에 있는 Tam, 뉴욕에 있는 Song, 북경에 있는 Peng과 Xiaocong, 일본에 있는 Kohei, 그리고 회사 부하직원 Mert까지 총 9명의 팀이었다. 그럼에도 불구하고 종료 이틀 전까지 일본 FEG&NSSOL팀과 대만 NTU팀에 뒤처져 3위에 머무르고 있었다. 그러다 마지막 날, Kohei가 새로 발견한 feature가 우리 모델의 예측 성능을 크게 향상 시켰고, 결국 1위로 마무리 지을 수 있었다.

KDD Cup을 포함하여 모두 내 실력만으로는 이룰 수 없었던 성과들을 누린 한 해였다. 참 감사하다. 🙂

2015년 돌아보기 – 책

2015년에는 다시 읽은 4권을 포함해서 아래와 같이 20권의 책을 읽었다.


신앙/영성

1. Walking with God through Pain and Suffering

팀 켈러.고통과 불행을 이해하고, 맞서고, 하나님과 함께 헤쳐나가는 지침서.

2. Man’s Search for Meaning

빅터 프랭클. 2차 세계대전 중 아우슈비츠 수용소에서의 극심한 고난 가운데 찾는 삶의 의미.

3. How Will You Measure Your Life

이노베이터의 딜레마의 저자이자 하버드 비지니스 스쿨 교수인 클레이톤 크리스틴슨의 인생철학이 담긴 책.

4. Simply Jesus

NT 라이트. 1세기 중동 유대인들의 역사적 문맥 속에서 예수를 이해하기.

5. Preaching

팀 켈러의 설교에 대한 설교. “you should preach the truth, not just your opinion; you should preach the good news, not just good advice; and you should preach to make the truth real to the heart, not just clear to the mind.”

6. NIV, Holy Bible

박사과정 중 성경을 9번 읽었다는 원준이의 말에 자극받아 9월 말에 성경 통독을 시작해서 12월 초에 마쳤다. 짧은 시간에 완독한 것이 성경 전체의 흐름을 이해하는데 도움이 된다. 매년 해야겠다.


통계/데이터사이언스

7. The Signal and the Noise

미국 선거 결과를 정확하게 예측한 통계학자 네이트 실버가 전하는 예측 모델 이야기. 왜 예측이 어렵고 잘못되기 쉬운가. 어떻게 나은 예측을 할 수 있나.

8. Freakonomics

일상에서 가질 수 있는 궁금증들을 통계와 데이터로 답한 책. 마약 중계상이 돈을 많이 번다면 왜 엄마와 함께 살까?


역사/인물

9. Why Nations Fail

“Inclusive institution이 국가의 성공과 실패를 결정한다”라는 단순한 가정을 북남미, 아프리카, 유럽, 아시아, 오세아니아, 중동의 여러 국가들의 역사를 통해 확인한다.

10. Steve Jobs

언제 읽어도 재밌다. 풍운아.

11. The Autobiography of Benjamin Franklin

앞서 스티브 잡스와는 정반대의 인물. Man of Integrity.

12. Outliers

말콤 글래드웰. 성공에 대한 오해를 데이터를 통해 파헤친다. 아웃라이어는 정말 아웃라이어였나.

13. David and Goliath

말콤 글래드웰. 골리앗은 다윗에게 질 수 밖에 없었다. 언더독의 장점. 이노베이터의 딜레마와 일맥상통.


비지니스

14. Zero To One

15. The 4-Hour Workweek

16. The Innovator’s Solution

17. Lean Startup

18. Good to Great


창작/글쓰기

19. The Elements of Style

20. On Writing

인생은 벡터

인생은 벡터다.  “얼마나 열심히 사는가” (magnitude)뿐 아니라 “어떻게 사는가” (direction)가 더 중요하다.

I go by the name of Vector. It's a mathematical term, represented by an arrow with both direction and magnitude. Vector! That's me, because I commit crimes with both direction and magnitude. Oh yeah!
I go by the name of Vector. It’s a mathematical term, represented by an arrow with both direction and magnitude. Vector! That’s me, because I commit crimes with both direction and magnitude. Oh yeah!

서둘러 시작하기

아침에 알람이 울린 시각보다 한참을 더 침대에서 뒤척이다 일어났다. 바쁜 마음에 서둘러 준비하고 일어난지 15분 만에 집을 나섰다.

남여 준비하는데 걸리는 시간
남여 준비하는데 걸리는 시간

차가운 아침 공기를 가르고 차가 있는 곳까지 단숨에 도착했는데.

웬걸.  키가 없다.  OTL

난 서두르다 제대로 준비하지 못하고 시작해서 낭패를 보거나, 꼭 낭패까지는 아니어도 초초함에 일을 효율적으로 하지 못하는 때가 많다.

빨리 하는 것보다 제대로 하는 것이 중요하다.  제대로 하기 위해서는 시작하기 전에 신중히 계획하고 검토하는 것이 중요하다.

너희 중에 누가 망대를 세우고자 할찐대 자기의 가진 것이 준공하기까지에 족할는지 먼저 앉아 그 비용을 예산하지 아니하겠느냐 – 누가복음 14:28

서두르지 말자.  분주하지 말자.

 

Kaggler’s Toolbox – Setup (from Kaggler.com)

This article is originally posted on Kaggler.com.


I’d like to open up my toolbox that I’ve built for data mining competitions, and share with you.

Let me start with my setup.

System

I have access to 2 machines:

  • Laptop – Macbook Pro Retina 15″, OS X Yosemite, i7 2.3GHz 4 Core CPU, 16GB RAM, GeForce GT 750M 2GB, 500GB SSD
  • Desktop – Ubuntu 14.04, i7 5820K 3.3GHz 6 Core CPU, 64GB RAM, GeForce GT 620 1GB, 120GB SSD + 3TB HDD

I purchased the desktop from eBay around at $2,000 a year ago (September 2014).

Git

As the code repository and version control system, I use git.

It’s useful for collaboration with other team members.  It makes easy to share the code base, keep track of changes and resolve conflicts when two people change the same code.

It’s useful even when I work by myself too.  It helps me reuse and improve the code from previous competitions I participated in before.

For competitions, I use gitlab instead of github because it offers unlimited number of private repositories.

S3 / Dropbox

I use S3 to share files between my machines.  It is cheap – it costs me about $0.1 per month on average.

To access S3, I use AWS CLI.  I also used to use s3cmd and like it.

I use Dropbox to share files between team members.

Makefile

For flow control or pipelining, I use makefiles (or GNU make).

It modularizes the long process of a data mining competition into feature extraction, single model training, and ensemble model training, and controls workflow between components.

For example, I have a top level makefile that defines the raw data file locations, folder hierarchies, and target variable.

[code title=”Makefile” lang=”bash”]
# directories
DIR_DATA := data
DIR_BUILD := build
DIR_FEATURE := $(DIR_BUILD)/feature
DIR_VAL := $(DIR_BUILD)/val
DIR_TST := $(DIR_BUILD)/tst

DATA_TRN := $(DIR_DATA)/train.csv
DATA_TST := $(DIR_DATA)/test.csv

Y_TRN := $(DIR_DATA)/y.trn.yht

$(Y_TRN): $(DATA_TRN)
cut -d, -f2 $< | tail -n +2 > $@
[/code]

Then, I have makefiles for features that includes the top level makefile, and defines how to generate training and test feature files in various formats (CSV, libSVM, VW, libFFM, etc.).

[code title=”Makefile.feature.feature3″ lang=”bash”]
include Makefile

FEATURE_NAME := feature3

FEATURE_TRN := $(DIR_FEATURE)/$(FEATURE_NAME).trn.sps
FEATURE_TST := $(DIR_FEATURE)/$(FEATURE_NAME).tst.sps

FEATURE_TRN_FFM := $(DIR_FEATURE)/$(FEATURE_NAME).trn.ffm
FEATURE_TST_FFM := $(DIR_FEATURE)/$(FEATURE_NAME).tst.ffm

$(FEATURE_TRN) $(FEATURE_TST): $(DATA_TRN) $(DATA_TST) | $(DIR_FEATURE)
src/generate_feature3.py –train-file $< \
–test-file $(lastword $^) \
–train-feature-file $(FEATURE_TRN) \
–test-feature-file $(FEATURE_TST)
%.ffm: %.sps
src/svm_to_ffm.py –svm-file $< \
–ffm-file $@ \
–feature-name $(FEATURE_NAME)

[/code]

Then, I have makefiles for single model training that includes a feature makefile, and defines how to train a single model and produce CV and test predictions.

[code title=”Makefile.xg” lang=”bash”]
include Makefile.feature.feature3

N = 400
DEPTH = 8
LRATE = 0.05
ALGO_NAME := xg_$(N)_$(DEPTH)_$(LRATE)
MODEL_NAME := $(ALGO_NAME)_$(FEATURE_NAME)

PREDICT_VAL := $(DIR_VAL)/$(MODEL_NAME).val.yht
PREDICT_TST := $(DIR_TST)/$(MODEL_NAME).tst.yht
SUBMISSION_TST := $(DIR_TST)/$(MODEL_NAME).sub.csv

all: validation submission
validation: $(METRIC_VAL)
submission: $(SUBMISSION_TST)
retrain: clean_$(ALGO_NAME) submission

$(PREDICT_TST) $(PREDICT_VAL): $(FEATURE_TRN) $(FEATURE_TST) \
| $(DIR_VAL) $(DIR_TST)
./src/train_predict_xg.py –train-file $< \
–test-file $(word 2, $^) \
–predict-valid-file $(PREDICT_VAL) \
–predict-test-file $(PREDICT_TST) \
–depth $(DEPTH) \
–lrate $(LRATE) \
–n-est $(N)

$(SUBMISSION_TST): $(PREDICT_TST) $(ID_TST) | $(DIR_TST)
paste -d, $(lastword $^) $< > $@

[/code]

Then, I have makefiles for ensemble features that defines which single model predictions to be included for ensemble training.

[code titile=”Makefile.feature.esb9″ lang=”bash”]
include Makefile

FEATURE_NAME := esb9

BASE_MODELS := xg_600_4_0.05_feature9 \
xg_400_4_0.05_feature6 \
ffm_30_20_0.01_feature3 \

PREDICTS_TRN := $(foreach m, $(BASE_MODELS), $(DIR_VAL)/$(m).val.yht)
PREDICTS_TST := $(foreach m, $(BASE_MODELS), $(DIR_TST)/$(m).tst.yht)

FEATURE_TRN := $(DIR_FEATURE)/$(FEATURE_NAME).trn.csv
FEATURE_TST := $(DIR_FEATURE)/$(FEATURE_NAME).tst.csv

$(FEATURE_TRN): $(Y_TRN) $(PREDICTS_TRN) | $(DIR_FEATURE)
paste -d, $^ > $@

$(FEATURE_TST): $(Y_TST) $(PREDICTS_TST) | $(DIR_FEATURE)
paste -d, $^ > $@
[/code]

Finally, I can (re)produce the submission from XGBoost ensemble with 9 single models described in Makefile.feature.esb9 by (1) replacing include Makefile.feature.feature3 in Makefile.xg with include Makefile.feature.esb9 and (2) running:

$ make -f Makefile.xg

SSH Tunneling

When I’m connected to Internet, I always ssh to the desktop for its computational resources (mainly for RAM).

I followed Julian Simioni’s tutorial to allow remote SSH connection to the desktop.  It needs an additional system with a publicly accessible IP address.  You can setup an AWS micro (or free tier) EC2 instance for it.

tmux

tmux allows you to keep your SSH sessions even when you get disconnected.  It also let you split/add terminal screens in various ways and switch easily between those.

Documentation might look overwhelming, but all you need are:
# If there is no tmux session:
$ tmux

or

# If you created a tmux session, and want to connect to it:
$ tmux attach

Then to create a new pane/window and navigate in between:

  • Ctrl + b + " – to split the current window horizontally.
  • Ctrl + b + % – to split the current window vertically.
  • Ctrl + b + o – to move to next pane in the current window.
  • Ctrl + b + c – to create a new window.
  • Ctrl + b + n – to move to next window.

To close a pane/window, just type exit in the pane/window.

 

Hope this helps.

Next up is about machine learning tools I use.

Please share your setups and thoughts too. 🙂

Kaggler 0.4.0 Released (from Kaggler.com)

This article is originally posted at Kaggler.com.

UPDATE on 9/15/2015

I found a bug in OneHotEncoder, and fixed it.  The fix is not available on pip yet, but you can update Kaggler to latest version from the source as follows:

$ git clone https://github.com/jeongyoonlee/Kaggler.git
$ cd Kaggler
$ python setup.py build_ext --inplace
$ sudo python setup.py install

If you find a bug, please submit a pull request to github or comment here.


I’m glad to announce the release of Kaggler 0.4.0.

Kaggler is a Python package that provides utility functions and online learning algorithms for classification.  I use it for Kaggle competitions along with scikit-learn, LasagneXGBoost, and Vowpal Wabbit.

Kaggler 0.4.0 added the scikit-learn like interface for preprocessing, metrics, and online learning algorithms.

kaggler.preprocessing

Classes in kaggler.preprocessing now support fit, fit_transform, and transform methods. Currently 2 preprocessing classes are available as follows:

  • Normalizer – aligns distributions of numerical features into a normal distribution. Note that it’s different from sklearn.preprocessing.Normalizer, which only scales features without changing distributions.
  • OneHotEncoder – transforms categorical features into dummy variables.  It is similar to sklearn.preprocessing.OneHotEncoder except that it groups infrequent values into a dummy variable.

[code language=”python”]
from kaggler.preprocessing import OneHotEncoder

# values appearing less than min_obs are grouped into one dummy variable.
enc = OneHotEncoder(min_obs=10, nan_as_var=False)
X_train = enc.fit_transform(train)
X_test = enc.transform(test)
[/code]

kaggler.metrics

3 metrics are available as follows:

  • logloss – calculates the bounded log loss error for classification predictions.
  • rmse – calculates the root mean squared error for regression predictions.
  • gini – calculates the gini coefficient for regression predictions.

[code language=”python”]
from kaggler.metrics import gini

score = gini(y, p)
[/code]

kaggler.online_model

Classes in kaggler.online_model (except ClassificationTree) now support fit, and predict methods. Currently 5 online learning algorithms are available as follows:

  • SGD – stochastic gradient descent algorithm with hashing trick and interaction
  • FTRL – follow-the-regularized-leader algorithm with hashing trick and interaction
  • FM – factorization machine algorithm
  • NN (or NN_H2) – neural network algorithm with a single (or double) hidden layer(s)
  • ClassificationTree – decision tree algorithm

[code language=”python”]
from kaggler.online_model import FTRL
from kaggler.data_io import load_data

# load a libsvm format sparse feature file
X, y = load_data(‘train.sparse’, dense=False)

# FTRL
clf = FTRL(a=.1, # alpha in the per-coordinate rate
b=1, # beta in the per-coordinate rate
l1=1., # L1 regularization parameter
l2=1., # L2 regularization parameter
n=2**20, # number of hashed features
epoch=1, # number of epochs
interaction=True) # use feature interaction or not

# training and prediction
clf.fit(X, y)
p = clf.predict(X)
[/code]

Latest code is available at github.
Package documentation is available at https://pythonhosted.org/Kaggler/.

Please let me know if you have any comments or want to contribute. 🙂