天色グラフィティ

技術ちっくなことを書きます

決定木は本当に変換に依存しないのか?

f:id:ejinote:20190110011802j:plain

決定木をベースとしたモデル(RandomForestやXGBoost、LightGBMなど)は正規化などの前処理が必要ないと言われています。

理由として挙げられるのは「決定木は特徴量の大小関係のみに着目しており、値自体には意味がないから」というものです。

先日もkaggler-jaというSlackチャンネルでこの話が出ました(細かく読まなくて大丈夫です)。

 

自分で質問に答えておいて、「本当か?」という疑問が湧いてきたので実験してみることにしました。

結論から言うと、StandardScalerやMinMaxScalerなどの各特徴量について線形な変換に対しては結果は変化しないけど、logをかけたりするとちょっと変わるということが分かりました。

決定木のアルゴリズム(ざっくり)

決定木を作成する際のおおまかな流れは以下のとおりです。

  1. 目的変数(target)をうまく分離できる特徴量と、分割境界を決める
  2. サンプルを基準よりも小さい群と大きい群に分ける
  3. それぞれの群を繰り返し分割していく
続きを読む

2018年、たいへんお世話になりました。

f:id:ejinote:20181231235259j:plain

晦日なので実家に帰っています。あまり酒を嗜んだりはしない両親とシャンパンを飲み、話しているうちにこんな時間になってしまいました。

帰省する前は「親と話すことなんてそんなに多くはないよなぁ」と思っていましたが、24歳になって昔(中高時代など)を振り返っているうちに「あの頃自分はこう思っていたんだ。親のことをこう見ていたんだ」と伝えたくなりました。

父方、母方の祖母がともに今年亡くなったこともあり、残った人生を謳歌しようとしている両親を見ていると考えさせられるものがあります。

さて。本年を振り返ってみますと、良くも悪くも技術漬けの毎日であったように思います。

プログラミング言語としてはPythonC++Golang、Rustあたりをちょいちょいと触っていましたし、要素技術としては機械学習、特にKaggleに多く触れた一年でした(研究をしろ)。

今年のKaggle戦績は銀2枚銅1枚で、それなりにコミットしたコンペでそれなりの結果を残したということに終止するかと思います。来年は金ピカのメダルとお金を狙っていきたいですね。DeNAは強い人ばかりなので、入社前にMasterになりたいという欲求が強いです。

f:id:ejinote:20181231234914p:plain

競技プログラミングは結局水色でフィニッシュしてしまいました。特に終盤でRatedのコンテストに全然出られなかったのが足を引っ張ったかと思います。来年は予定の調整を頑張っていきたいです。

f:id:ejinote:20181231235009p:plain

プログラミングまわりで少し頑張ったのは、9/21から毎日草を生やしたということでしょうか。もちろん途中にはすごくしょうもないコミットが挟まっていて、「手段の目的化」という言葉が頭をよぎらないわけではないですが、どんな日でも毎日PCを開いてコードを書くという習慣付けが行えたことは価値があることだと思っています。

f:id:ejinote:20181231234929p:plain

ブログは自分としてはがんばって書きました。このブログは今年の4月に開設しましたが、現在読者数が47人になり、ちらほらと読んでいただけているようです。切りの良い数字を目指したいので、年末やることがなくてこの記事を読んでいる方は読者登録ボタンをぽちりと押して頂けると幸いです。来年は月1回以上書くという超低い目標を設定してやっていきたいと思います。金メダル取りました!って記事が書けるといいですね。

年末っぽいコンテンツとしては、Amazonの購入履歴などを見ながら今年買って(契約して)よかったものを挙げておきましょう。順番は思いついた順です。

  • Google Home
    • 声で指示するのが予想以上にストレスフリーだった。主に使用している機能はNature Remoと組み合わせた家電の制御と、目覚まし。あとは天気予報。今はAmazonで売ってないっぽいです。
  • Netflix
    • 月額1000円以下で無限にコンテンツがあってしまうので学生にはおすすめできない。
  • アイリスオーヤマのふとん乾燥機
    • 睡眠時のQOLが爆上がりする。知らない間に汗を吸って重たくなっていた布団が軽くなる。最高。
  • ラムダッシュの5枚刃のやつ
    • 今まで3枚刃を使っていたけど完全に時間の無駄だった。仕上がりのクオリティとかかる時間が格段に違う。クリスマスプレゼントでもらった。
  • Dashlane
    • パスワードを覚えたり、手入力したりという手間から開放された。1年契約した。
  • Happy Hacking KeyBoard BT
    • タイプ感がすごく良い。MBPと組み合わせた際の優雅さを犠牲に満足感を得る感じ。彼女にもプレゼントした。
  • ダンボールをお手軽にゴミに出すやつ
    • Amazonを多用することもあって家にダンボールがあふれかえる。紐で縛るのはめちゃめちゃめんどくさいけど、これを使えばちょっとめんどくさいくらいで済む。300円くらいなのでめっちゃおすすめ。
  • Kyash
    • VISAカードとして使えるウォレットアプリ。手軽に送金が行えてユーザー体験が良いです。ユーザーが増えてくれると嬉しいです。

来年の目標の話をしましょう。

すでに上のほうでだいぶ書いてしまっていますが、まずは金メダルがほしいですね。修論をサクッと片付けてコミットしていきたいです。長期的な視野で行くと、キャリアについての考え方を固めていきたいです。自分の好みはユーザーの顔が想像できる所で施策を考えたり分析をしたりするところにあるのですが、それがどういう仕事になり、どういう場所で生きていくのかについて考えていきたいです。

4月から生活が大きく変わるので、早いうちに順応したいものです。いろいろな兼ね合いもあって修論時期と引っ越し先を探す時期と諸々がかぶってなかなか大変になりそうです。

いつもの通り、Amazon欲しいものリストがこちらです。新生活を控えた3月ごろになると生々しいリストになっているかと思いますが、今はかわいいもんです。

ついでにKyashのバーコードがこちらです。

手軽に投銭できるので、ぜひ僕で試してみてください。

それではみなさま、2018年は大変お世話になりました。2019年もどうぞよろしくお願いいたします。

間に合った!

コピペで使える。Kaggleでの実験を効率化する小技まとめ

f:id:ejinote:20181220184224j:plain

この記事はKaggle Advent Calendar 201820日目の記事です。当初の予定ではPLAsTiCCコンペの振り返りをするはずだったのですが、時空の狭間に吸い込まれた結果0サブミットでフィニッシュしてしまいました。何ででしょうね。 そこで、代わりにKaggleで使える便利なスニペットまとめを書くことにします。

ちなみにもうひとネタあったのでいつか書きたいですが、修論があるのでいったん見送り……

  • LINEに通知を送る
  • 処理にかかる時間を計測する
  • LightGBMの学習結果をログに出す
  • Google Spreadsheetに結果を記録する
    • Google Spreadsheet側の設定
    • Pythonからアクセスする
  • Notebook上でライブラリを毎回再読込する
  • DataFrameのメモリを節約する
  • まとめ

LINEに通知を送る

f:id:ejinote:20181220181419p:plain
Home Creditコンペで実際に送っていたログ

「思考は止めてもサーバーは止めるな」とはkaggler-jaの管理者であるtkmさんの名言です。サーバーを止めないためには正常・異常問わず計算終了時に通知を送ることが重要です。

import requests

def send_line_notification(message):
    line_token = 'YOUR_LINE_TOKEN'  # 終わったら無効化する
    endpoint = 'https://notify-api.line.me/api/notify'
    message = "\n{}".format(message)
    payload = {'message': message}
    headers = {'Authorization': 'Bearer {}'.format(line_token)}
    requests.post(endpoint, data=payload, headers=headers)
  1. https://notify-bot.line.me/my/ からパーソナルアクセストークンを発行する
  2. 発行したアクセストークンをYOUR_ACCESS_TOKENに入れる

これでLINE通知を送ることができます。アクセストークンはコンペが終わったら無効化すれば、GitHubにコードをそのままpushしても大丈夫です。

副作用として、計算が終了したことがわかってしまうというものがあります。

続きを読む

2018年11月を振り返ってみる

先月に引き続き11月の振り返りをやっていきます。

やったこと

毎日GitHubに草を生やした

先月に引き続き毎日草を生やせました。

授業のTAの一環で簡単なコンペを開催するツールを作った(公開準備中)

KaggleのInClassコンペのように、限られた人だけが参加するデータ分析コンペを簡単に作れるソフトウェアを書きました。

取り回しに若干バギーなところ(サブミットがAPIを直に叩かないとできないとか)が残っているので、それを直して公開に持っていきたいです。

ロジックはFlaskで書いていて、フロントエンドはBulmaを使っています。

HHKBデビューした

HHKB BTのUS配列無刻印バージョンを買いました。超かっこいいです。

研究室で使っているキーボードはRealforceで、あのぬるぬるした打鍵感も嫌いじゃないですが、HHKBのシュコシュコ感はなかなか癖になります。けっこうおすすめです。

JIS→USの移行は1週間ぐらい大変な苦痛を伴いましたが、今では慣れました。無刻印はそんなに違和感なく使うことができています。 そもそもキーボード見ながらタイピングしているわけじゃないし、他の人にキーボード貸すわけでもないので、違和感なく使えるのは当たり前といえば当たり前です。

キーボード買ったことによる副次的な効果として、他人のキーボードを観察するようになりました。HHKBユーザーを見つけると勝手に親近感を感じています。

(ちなみに彼女へのクリスマスプレゼントもこれになりました)

統計検定

終わった

AppBrewでバイト

コスメの口コミアプリLIPSを開発している株式会社AppBrewで週2〜3くらいのペースで働いています。 データ分析周りのこまごました処理を主に行っています。

AppBrewはデータの民主化をがんばっていて、エンジニアじゃない人もSQLが叩けるのが好印象です。

面白かった記事

買った本

今月はあまり本を買っていないことにいま気がついた。

イノベーション・オブ・ライフ ハーバード・ビジネススクールを巣立つ君たちへ

イノベーション・オブ・ライフ ハーバード・ビジネススクールを巣立つ君たちへ

ちはやふる(40) (BE LOVE KC)

ちはやふる(40) (BE LOVE KC)

12月に向けて

修論をそろそろ書いていかないとまずいような気がしています。

LightGBMのcallbackを利用して学習履歴をロガー経由で出力する

KaggleなどでLightGBMを使っていて学習履歴を見たとき、ログファイルにも残してほしいと思うことがあります。

公式にはそのような機能は実装されていないようなので、LightGBMのコールバックで対応したいと思います。 LightGBMではfitメソッドの引数としてコールバック関数を渡すことができ、内部的にはEarlyStoppingや学習履歴を標準出力に吐くのに使われています。

LightGBMのコールバックを実装

lightgbm/callback.pyを見ると、学習時に標準出力に履歴を表示する関数があります。

def print_evaluation(period=1, show_stdv=True):
    """Create a callback that prints the evaluation results.
    Parameters
    ----------
    period : int, optional (default=1)
        The period to print the evaluation results.
    show_stdv : bool, optional (default=True)
        Whether to show stdv (if provided).
    Returns
    -------
    callback : function
        The callback that prints the evaluation results every ``period`` iteration(s).
    """
    def _callback(env):
        if period > 0 and env.evaluation_result_list and (env.iteration + 1) % period == 0:
            result = '\t'.join([_format_eval_result(x, show_stdv) for x in env.evaluation_result_list])
            print('[%d]\t%s' % (env.iteration + 1, result))
    _callback.order = 10
    return _callback

これをベースにしてカスタマイズしてあげればよさそうです。

実装例は以下のとおりです。基本的にはprint_evaluationと一緒で、logging.Loggerとログレベルを新たに受け取れるようにしてあります。

import logging

from lightgbm.callback import _format_eval_result


def log_evaluation(logger, period=1, show_stdv=True, level=logging.DEBUG):
    def _callback(env):
        if period > 0 and env.evaluation_result_list and (env.iteration + 1) % period == 0:
            result = '\t'.join([_format_eval_result(x, show_stdv) for x in env.evaluation_result_list])
            logger.log(level, '[{}]\t{}'.format(env.iteration+1, result))
    _callback.order = 10
    return _callback

使い方

ロガーを予め作成しておいて log_evaluation の引数に渡してあげれば動くはずです。

# ロガーの作成
logger = logging.getLogger('main')
logger.setLevel(logging.DEBUG)
sc = logging.StreamHandler()
logger.addHandler(sc)
fh = logging.FileHandler('hoge.log')
logger.addHandler(fh)

# データのロードなどは省略

# 訓練時にコールバックのリストを渡す
clf = lgb.LGBMClassifier()
callbacks = [log_evaluation(logger, period=10)]
clf.fit(X_train, y_train, eval_set=[(X_val, y_val)], callbacks=callbacks)

LightGBMのコールバックの実装方法

コールバック関数のリストをfit()時のcallbacks引数に渡してあげるとコールバックが呼ばれます。

コールバック関数は引数をひとつ取る必要があります。その引数には以下のように学習状況などが入ったnamedtupleが渡されます。

namedtuple(
    "LightGBMCallbackEnv",
    ["model",
     "params",
     "iteration",
     "begin_iteration",
     "end_iteration",
     "evaluation_result_list"])

例えば env.iteration のようにすれば現在のイテレーション数が取れます。(0始まりなので+1するのが良いと思います)

コールバック関数にパラメータを設定したい場合は今回のようにクロージャ(関数を返す関数)にしてあげると良いです。

まとめ

  • LightGBMのコールバックを作成すると学習履歴をロガーに渡すことができる
  • lightgbm/callback.pyはシンプルなので読んでみるとよい

お役立ちリンク

2018年10月を振り返ってみる

最近、Dynalistというサービスを使ってやったことをメモしていました。それを元に今月を振り返りをやっていきます。

やったこと

毎日GitHubに草をはやした

f:id:ejinote:20181031173219p:plain

前半はGoのツールで、後半はPLAsTiCCコンペでコミットを稼いだ。 苦し紛れでAtCoderの適当な問題を埋めてたりするけど、個人的には結構がんばったつもり。

Goで簡単なCLIツールを書いた

まとまった単位でコードを書いていかないといつまで経っても書けるようにならないという知見を得た。

初めて勉強会でLTした

勉強会駆動開発というのをしてみた。だいたい1週間くらいで発表のネタを作って、ぱぱっとconnpassで登録した。何事も飛び込んでみるもんだ。

面白かった記事

買った本

結構本を買った。前半が技術書で、後半がその他。

今月のコンセプトは「わかったつもりになったものを、体系的に学び直す」みたいな感じ。 Webから仕入れた知識だとどうしても断片的になってしまう。わかったつもりになってる内容でも、書籍で体系的に学び直すと新たな気付きがあって良い。

技術書

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

  • Kubernetesに入ったところまで読んだ
  • 最近KaggleでDocker使っていて大変はかどっている
  • ハンズオンのような進め方で、進み方自体にも違和感がなくて良い

入門 自然言語処理

入門 自然言語処理

  • 前半を読み終わった時点で途中を飛ばし、日本語に対する自然言語処理について読んだ

Vue.js入門 基礎から実践アプリケーション開発まで

Vue.js入門 基礎から実践アプリケーション開発まで

  • Vueはざっと使えるつもりだけど、コンポーネントの分割のベストプラクティスとかが知りたくて買った

ゼロから作るDeep Learning ? ―自然言語処理編

ゼロから作るDeep Learning ? ―自然言語処理編

  • 積んでいる

技術同人誌を書こう!  アウトプットのススメ (技術書典シリーズ(NextPublishing))

技術同人誌を書こう! アウトプットのススメ (技術書典シリーズ(NextPublishing))

  • アウトプットの機運が高まって買った
  • 技術書展出たい
  • 予想以上に実践的な内容。同人誌の表紙はどうつくるか、サークルの登録はどうするか、締切の設定方法、とかが書いてあったりする。

その他

なんか研究室のノリで統計検定1級を受けることになったが、全然できなくて絶望している。

数理統計学 (数学シリーズ)

数理統計学 (数学シリーズ)

日本統計学会公式認定 統計検定 1級・準1級 公式問題集[2016〜2017年]

日本統計学会公式認定 統計検定 1級・準1級 公式問題集[2016〜2017年]

欲しい本

Go言語による並行処理

Go言語による並行処理

速習 強化学習 ―基礎理論とアルゴリズム―

速習 強化学習 ―基礎理論とアルゴリズム―

  • 作者: Csaba Szepesvari,小山田創哲,前田新一,小山雅典,池田春之介,大渡勝己,芝慎太朗,関根嵩之,高山晃一,田中一樹,西村直樹,藤田康博,望月駿一
  • 出版社/メーカー: 共立出版
  • 発売日: 2017/09/21
  • メディア: 単行本
  • この商品を含むブログを見る

なんと、ここに私の欲しいものリストがあります。

使い始めたツール・サービス

  • Kindle Unlimited
    • かゆいところには全く手が届かないラインナップ
    • 読みたい本はだいたい読んだので、しばらくしたら退会するつもり
  • Dynalist
    • アウトライナー
    • 無料、デザインがきれい、取り回しに違和感がない、の三拍子
    • ブログの下書きとか、思考の整理とかに使う。この記事の下書きもDynalist
    • Boostnoteから乗り換え
    • エクスポートが柔軟にできると嬉しいなー

最近意識していること

  • ドキュメント駆動開発
    • 闇雲にコードを書くのではなく、先にドキュメントを書いてそれに沿って開発をすすめる
    • やるべきタスクがクリアになるので効率が上がる
    • これに限らず、自分が今何をすべきかを意識することの大切さを知った

11月に向けて

  • 修士研究
  • GitHubの草継続
  • PLAsTiCC Astronomical Classificationコンペ
  • 統計検定

あたりを頑張りたいと思います。

Goあんこ4kgでLTしました

知らない人にはGoあんこってなんだよって話だと思いますが。

GoあんことはGo(Un)Conferenceの略で、Go言語のゆるふわLT会のことです。4kgは4回目って意味です。かわいい。

発表資料はこちらです。

主催者は@deadcheatさんと@syossan27さんのおふたりで、株式会社アイスタイル(@cosmeを作ってる会社)で開催されました。 久しぶりにギロッポン行きましたけど、ギロッポンってなんか「ビジネスーーーーッ! オラオラオラーーーッ」みたいな雰囲気して近寄りがたくないですか?

他の登壇者はみなさん業務でバリバリGoを使ってらっしゃるようで、僕はハードル下げる枠でした。初心者歓迎ゆるふわLT会たらしめる役目は果たしたと思います。

発表の要点をかいつまんで書くと、

  • 新しい言語を勉強した人は「本当になんでもいいから」アウトプットしよう
  • Goを使うと最初のハードルがほんとに低いのでおすすめ
  • LTの予定を入れて勉強会駆動開発しよう

の3点です。

プログラミング言語って本やチュートリアルで勉強しただけだと全く身につかなくて、何かに使って初めて身につくものですよね。 でも、初心者はこう考えてしまいます。 「作れるものはたかが知れてるし、ツールを実装しようにもアイディアがないし」 そんなことを言ってるうちにせっかく勉強した言語は忘れてしまうでしょう。

そこで「全く役に立たないツールを作ろう」と発想を転換すると、あら不思議。ツールのアイディアが湧いてきます。 ぱぱっと作ってぱぱっとLTしちゃいましょう。

みたいな話をしました。

僕みたいなにわかGopherが会場にも隠れキリシタンのようにいらっしゃったでしょうし、「Goあんこ行ってみたいけど……」みたいにslideshareを眺めてる方もいらっしゃると思います。そんな方々に届いてほしいLTでした。

聴衆のみなさまもあたたかく、とても良い勉強会でした。また参加したいと思います。

次回は「Goで始めるシステムトレード」みたいなタイトルで発表できたら良いな、なんて考えています。

以下は面白かった発表です。資料がアップロードされたら詳細を追記します。

  • 自宅サーバーを実現するためにwanpollをつくった話」 @kawasin73 さん
  • 「複雑になってきたCLIコマンドをちゃんとテストする」@LightTiger2505 さん
  • 「Wrap(err) in production」 @izumin5210 さん

もらったフェルトのGopherくん。