30 Mar 2018, 16:27

xgboostの学習をtensorboardで可視化してみた

はじめに

Google の TensorBoardは、TensorFlowの学習をクールに可視化する。今回、xgboostや scikit-learnの学習結果を、TensorBoardで可視化できないかなと調べたところ、方法を見つけた。

tensorboard_logger

tensorboard_loggerをつかうと、tensorboardで表示できる形式でログ出力できる。

これとxgboostの callbacksの機能を利用して学習の結果を可視化する。

https://gyazo.com/9da25151162b5e5db0106a55439ef647

26 Mar 2018, 20:38

Emacsでデータサイエンス用環境構築(Python)

はじめに

肥大化してデブになった emacs設定を一旦捨て去り、一から作り直すことにした。

デブは自分のお腹だけで十分だ!(名言)

Motivation

以前は、こんな感じの設定ファイルを作っていたのだけれども、複雑になりすぎた。

また、データサイエンスをやるにつれて、以下のようなことがあり、Emacsを使いたくなってきた。

  • 自宅サーバにsshで自習室からつないで作業することが多いので、Pycharm使えない。
  • Jupyter Notebookを使うことが多いが、Jupyter Notebookでは、スクリプトかけない。
  • 今まで素の Emacsでしのいできたのだけれども、辛くなってきた。
  • ターミナルかっこいい\(o)/

目指す姿

  • データサイエンス、もっと言えばPythonに特化した環境を作りたい
  • 軽い環境を作りたい
  • できるだけシンプルにしたい

Environment

  • Ubuntu 16.04
  • Python 3.6(Anaconda)
  • Emacs 25.x

最新版Emacsを投入

まずは、Ubuntuに25系のversionをインストールする。

sudo add-apt-repository ppa:kelleyk/emacs
sudo apt-get update
sudo apt-get install emacs25
sudo update-alternatives --config emacs

リポジトリ & 設定ファイルを作成

.emacs.dを gitで世代管理して、githubにバックアップしたい。まずは、emacs用のリポジトリを作成。

init.elも作成。ここを参考にして、カスタムディレクトリを起点に起動できるように記述。

(when load-file-name
  (setq user-emacs-directory (file-name-directory load-file-name)))

続いて、このリポジトリを利用して起動するためのスクリプトを作成して、パスの通ったところに置く。

#!/bin/bash                                                                                                                                                                                                          
emacs -nw -q -l /home/tsu-nera/dotemacs-for-data-science/init.el $1

パッケージ管理をどうするか?

以前はuse-packageを使っていた。しかし、今回はシンプルにしたいので、デフォルトで搭載されているパッケージ管理ツール package.elを使うことにする。以下の記事によると、25.1からはインストールされたパッケージが package-selected-package 変数に保持されるようになったらしい。

以下の設定を inti.elに書くことで、custom.elに設定を吐き出すようにする。

(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file)
  (load custom-file))

package-installでインストールできるパッケージを増やすために、リポジトリを追加する。

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(fset 'package-desc-vers 'package--ac-desc-version)
(package-initialize)

Python開発環境

ここからが本番! データサイエンスのために Python開発環境を整える。過去記事を参考に(古くてあまり参考にならないですが)、設定を書いていく。

python-mode - メジャーモード

メジャーモードはデフォルトの pythonパッケージではなく、python-modeをつかう。なんとなく。

(require 'python-mode)
(add-to-list 'auto-mode-alist '("\\\.py\\\'" . python-mode))
(add-to-list 'interpreter-mode-alist '("python" . python-mode))

flycheck, flake8 – 静的解析

Pythonの静的解析ツールとして flake8, それをつかうためのインタフェース flycheckを入れる。

pip install flake8

python-modeのときだけ有効。

(defun tnoda/turn-on-flycheck-mode ()
  (flycheck-mode 1))
(add-hook 'python-mode-hook 'tnoda/turn-on-flycheck-mode)

jedi – 自動補完

jedi は pythonのための 自動補完ツール。

pip install jedi


(add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)

jedi は Emacsの補完ツール , auto-completeを使っているので、その設定もしておく。

(require 'auto-complete-config)
(ac-config-default)
(global-auto-complete-mode t)

yapf – 自動フォーマット

自動でいい感じに整形してくれるツールを入れる。autopep8という古参なツールもあるけれども、新しい方を採用。

pip install yapf


;; py-yapf - auto format                                                                                                                                                                                             
(require 'py-yapf)
(add-hook 'python-mode-hook 'py-yapf-enable-on-save)

ひとまず完成した init.el

12 Feb 2018, 11:36

Google Homeで DI.FMのTech Houseを聴く

はじめに

プログラマーならば、テクノ・ミュージック、ですよね。

とてもとてもニッチな小ネタだけれども、誰かの役に立てれば。

自分は、作業用音楽として、Digitally Importedの Tech Houseを溺愛している。

テクノ・ミュージックを聴くと、テンション上がって作業がとても捗るのだ。Google Homeを購入したので、せっかくいいスピーカーなので、これで聴きたい!

ということで、Digitally ImportedのTech House のチャンネルを聴く方法を試した。もちろん、同様の方法は、JazzRadioでもいける。

ChromeCastできくとwifiが切れる

まず思い付いた方法は、Google Chromeのキャスト機能を利用して、Google Chromeで流れている音楽をGoogle Homeに転送して聴く方法。

これでうまく行った、と思いきや、なぜかwifiが1分もするとブツブツ切れてしまう。失敗。

iPhone経路で聴くことに成功

調査を続けると、Digitally Imported が Chromecastをサポートしているとのこと。

試しに、iPhoneアプリを起動してみて、上記記事のようなアイコンを押すと、なんと流れた!おおーっ。

パソコン経由で聴くことに成功

欲を入れば、OK Google, テクノ・ミュージックかけて、で音楽を流したい。なので、パソコンからやる方法を調べた。pychromecastを使えばいけた。

まずは、digitally importedのstream urlをしらべる。

次に以下のスクリプトを書いた。

#!/usr/bin/env python
import pychromecast

def play_mp4(url):
    cast.wait()
    mc = cast.media_controller
    mc.play_media(url, 'audio/mp4')
    mc.block_until_active()

chromecast_name = "Main"
chromecasts = pychromecast.get_chromecasts()
cast = next(cc for cc in chromecasts if cc.device.friendly_name == chromecast_name)

play_mp4("http://pub2.diforfree.org:8000/di_techhouse_hi")

これを実行すると、Tech Houseが流れた。いえい!あとは、こことかでやった方法を応用して、声のインタフェースを用意すれば完成!

09 Feb 2018, 15:29

pychromecastでお手軽にGoogle Homeから時報を鳴らす

はじめに

Google Homeで 時報を鳴らしたい。こんな記事があり、試してみようと思った。

google-home-notifierというツールを使うのが王道なようだ。

しかし、いかんせん、node.jsがわからない。。できれば、いつも使っているPythonでやりたいなーと思っていろいろ試した結果、pychromecastというものをつかうと、GoogleHomeから音楽を鳴らすことができたので、そのメモ。

pychromecastをつかう

pychromecastを使うと、かなりお手軽にやりたいことが実現できた。

pip install pychromecast

Web上のリソースをGoogleHomeで鳴らすことができるので、以下のダウンロードサイトから、音源を鳴らすことにした。

コードは以下。

これを実行すると、Google Homeから音を鳴らすことができる。

cronで定期実行

cronで1時間ごとに実行するように、設定してみる。 crontab -e で Ok。

0 */1 * * * python google-home-jihou.py

これで、ピッピッピっポーン。

04 Feb 2018, 14:20

Google Homeから Linux上のパソコンをコマンド操作を自由にする

はじめに

GoogleHome/ IFTTT/ Beebotte、そして Pyhtonを使えば声をトリガーに任意の作業ができる。前回、ダーゲットPCに対して、別のサーバを用意していたけれどもど、今回の場合は実行したいPCを用意すれば良い。

まずは結果を。

[https://www.youtube.com/embed/ue_UKf3HSZE]

システム構築

基本的には前回の記事と同じだ。

マシンが違うので、異なるチャンネル beebotteで作成した。

出来るようになったこと

こである声をトリガにして、処理を実施するということができるようになった。

具体的には、

  • モニター OFF
  • モニターON
  • パソコン シャットダウン
  • パソコン Sleep
  • パソコン再起動

しかし、これだけではない。Linux上で実施するあらゆる操作がpythonコードを介して実現可能となった。これは大きな一歩だ。

#!/home/tsu-nera/anaconda3/envs/py3/bin/python
import paho.mqtt.client as mqtt
import json
import os

HOST = 'mqtt.beebotte.com'
PORT = 8883
CA_CERTS = '/home/tsu-nera/repo/python-scripts/mqtt.beebotte.com.pem'
TOKEN = '[チャンネルのトークン]'
TOPIC = 'Galleria/voice'

MONITOR_ON_CMD = "xset dpms force on"
MONITOR_OFF_CMD = "xset dpms force off"
PC_SLEEP_CMD = "systemctl suspend"
PC_OFF_CMD = "shutdown now"
PC_REBOOT_CMD = "shutdown -r now"

def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))

def on_message(client, userdata, msg):
    data = json.loads(msg.payload)["data"][0]
    print(data)
    if data["device"]=="monitor" and data["action"]=="on":
        os.system(MONITOR_ON_CMD)
    elif data["device"]=="monitor" and data["action"]=="off":
        os.system(MONITOR_OFF_CMD)
    elif data["device"]=="pc" and data["action"]=="スリープ":
        os.system(PC_SLEEP_CMD)
    elif data["device"]=="pc" and data["action"]=="シャットダウン":
        os.system(PC_OFF_CMD)
    elif data["device"]=="pc" and data["action"]=="再起動":
        os.system(PC_REBOOT_CMD)
    else:
        print("Ivalid requset")
    
if __name__ == '__main__':
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    client.username_pw_set('token:%s' % TOKEN)
    client.tls_set(CA_CERTS)
    client.connect(HOST, PORT)
    client.subscribe(TOPIC)
    client.loop_forever()

13 Jan 2018, 16:51

PyCharmの scientific modeがスゴい!Jupyter Notebookいらないかもよ

はじめに

Kaggleで、scriptを書く人と、Jupyter Notebookを書く人がいるのだけれども、どっちが生産性がいいのかなというのが、ふと自分のなかに疑問として湧き上がった。自分は、Jupyter Notebook派だ。しかし、別の方法も試してみるのも、気分転換になるかもとおもい、しばらくぶりにPyCharmを使おうとした。

すると、2017/11に出た最新版 2017.3 で Professional Editionに追加された機能、Scientifc modeがなんだかスゴそうだったので、今回紹介する。

Scientific Mode

まずは、公式サイトからの紹介を翻訳。

[https://www.youtube.com/embed/OHwh0c8UsW4?start=66]

特徴

  • iPyrhon Notebook(Jupyter Notebook)がPyChamに結合。
  • IDEの恩恵を十分に受けて開発できる。自動補完、ナビゲーション、エラーチェックなど。
  • 対話的Python コンソールで REPL駆動開発ができる。
  • NumpyやPandasのデータ構造を見るViewerがある。
  • MatplotlibをインタラクティブにみるViewerがある。
  • Anaconda連携

有効方法

ツールバーの 表示 > Scientifc モードを選択。すると、

  • プロジェクトView
  • Python コンソール
  • ドキュメントView
  • SciView(これがデータビューとグラフビューを兼ね備えている)
  • 実行したオブジェクトリストView

が現れ、まるで RStudio みたいなView配置になる。RでデータサイエンスをするならRStudio一択だけれども、PyCharmはPythonにおけるデータサイエンスのためのIDEになりえるのではないか?

ここがスゴい

例えば、Jupyter Notebookユーザならば、セルごとに処理を実行することができることに魅力を感じるかもしれない。それはPyCharmでもできる。カーソルで選択して、選択範囲を実行すると、選択した部分がPythonコンソールに送られて実行できるのだ。

そうして評価した、numpyやpandasオブジェクトはクリックすると、SciVIewに現れるのだ。なので、いちいちJupyter Notebook上で、 head()関数でデータフレームの中身を確認する必要がない。

少しコードを修正したら、再度範囲を選択して、実行すると式が再評価される。

That’s REPL駆動開発!!

何より嬉しいのは、IDEの恩恵を存分に利用してPyhtonのコードがかけることだ。IDEに必要な条件としては、以下のようなものがある。 PyCharmはすべて兼ね備えている。

  • シンタックスハイライト/ インデント
  • 検索・置換
  • タグジャンプ
  • コード補間
  • エラーチェック
  • リファクタリング
  • インタープリタ・デバッカ
  • プロジェクト管理
  • ドキュメント参照

所感

ここがスゴイでも書いたけれども、コードを部分実行して、そのデータフレームがすぐに見れるViewがあるところがとても気に入った。

Jupyter Notebookを今までずっと使っていたけれども、Jupyter Notebookの代わりとなるかもしれない可能性を感じた。とはいえ、EDAをしたり、他人に見やすくコードを公開するには、まだまだJupyter Notebookが必要だろう。それ以外の部分は、PyCharmでいいんじゃないか?

おわりに

一番気になるのは、お値段。Professional Editionは有料で1年間 89ドル = 1万円くらい。

しかし、日本の代理店?から購入するとちょっと安くなる。

まずは、試用を1ヶ月してみてから判断してみるのもよいのでは?

 

追記

Community Editionでも、選択範囲のみを実行したり、numpyやpandasの中身を見ることができた。なんだ、Professional版いらないかも。

23 Dec 2017, 10:12

データサイエンティスト養成講座を受けた感想(後半)

はじめに

データサイエンティスト協会が主催するデータサイエンテスィト養成講座を受けた。

前半の感想は以下です。今回は、後半の感想を書く。

各回の内容

第5回

中間発表会。銀行問題の成果発表。私の成績は、17位でした。各班の発表のあとは、先生のコメント。この銀行問題は、それほどデータ前処理をしなくても、random forestや xgboostのちからを借りると、そこそこのスコアがでてしまうとのこと。

ただし、それはコンペという特殊な世界で通用することであり、ビジネス的観点が抜けていることはよくない。業務でつかう多くのモデルは説明が求められる。

そして、後半のお題、Jリーグの観客動員数を予測せよ! が出される。

こちらは、単純にxgboostやrandom forest を 適用したたけでは、いい成果はでない。しっかり特徴量エンジニアリングをする必要がある。

第6、7回

後半は、目新しい知識の講義はなく、グループワーク中心で進む。チームでアイデアを出しながら特徴量を作成していく。

モデルの改善方法として、残差を見ながら分析する方法が紹介される。どの場合に、モデルの予測が結果を外しているかを並べて、傾向を見て、それをモデルに反映するというサイクルが紹介される。

チームでサッカーに詳しい人が一人いて、(ほかはそれほど詳しくなくて)、アイデアをもらいながら特徴量を作っていった。また、自分では、コーディング力がなくて作れない特徴量も他のメンバの手を借りて、作った。一人で考えているよりも、みんなで考えた方がよいアイデアが浮かぶ。協力が必要。

私ともう一人はpythonでデータ分析をして、他のメンバはRでデータ分析を進めた。あるメンバがRの分析力をメキメキつけて、驚いた。

という本を読んで力をつけたそうだ(これはウェブで無料公開されている)。python と Rで、どちらがよいかという議論をよく見かけるが、dplyr という強力な前処理ツールがあるので、モデルの前処理は R でやるほうがよいと感じた。前処理や視覚化は、pythonよりもRに軍配が上がる。

第8回

最終発表会。

私の成績は、なんと1位だ!

ネタバレになるので、作った特徴量は秘密だが、思いついた特徴量はすべて試した。

そして、最終秘密兵器、catboostを使った。

これは、ロシアのGoogleと言われているYandexが開発したOSS。これをつかったら、スコアがグーンと下がった。私は、データの視覚化をあまりしなかったのだけれども、同じ班のさきほどR力をグーンと伸ばした人がいろいろとデータを視覚化してくれた。

感想

データサイエンティスト養成講座にかけた勉強時間は100時間くらい。

当初の目的だったCSV形式のデータに対する解析技術がついた(Python力も)。

反省点としては、精度を求めるあまり、データの意味を考えることを怠った。データをプロットして、観察して、加工するというプロセスが踏めていなかった。なので、今後はデータを観察し表現する力、人に説明する力を身に着けたい。

これから

これからどうするかということも考えておこう。自分は他のひとと違って、業務ではデータ分析をしていない。なので、ここで学んだことを忘れないようにするためには、継続してデータ分析コンペに参加しようと思う。

DeepAnalyticsや Kaggleのコンペに参加して、腕を磨いていきたい。コンペでいい成績を取ることによって、力をつけていきたい。

今は、データサイエンスに興味があるが、転職をするかどうかは、まだもう少し見極めが必要。もう少し勉強してみて、この分野が本当に面白いと感じたら、転職を考えよう。

19 Nov 2017, 08:04

データサイエンティスト養成講座を受けた感想(前半)

はじめに

データサイエンティスト協会が主催するデータサイエンティスト養成講座を受けている。

受講の動機

受講の動機は、データサイエンスに興味があり、勉強したかったから。

今まで、機械学習の勉強をしようとして、流行りのDeepLearningにばかり取り組んできた。

しかし、DeepLearningを学んでも現実の問題に適用するのは難しい。

急にAIが流行りだしたから、みんなDeepLearningを勉強し始めたが、

なんか違うというか、ズレている気がしている。

今はお祭り騒ぎのような気がしてならない。

なので、きちんとデータに向き合う力、

そしてそれを現実に応用できる力をつけるためにこの講座に申し込んだ。

裏の理由は、kaggleや DeepAnalyticsで、データがcsv形式で与えられた時、

分類問題や予測問題に取り組む力が欲しかったから。

こういう機械学習コンペの攻略法的な書籍やwebページが探しても見つからないのだ。

この講座では、DeepAnalyticsの練習問題に実際に取り組んでいくことで、

機械学習のモデル構築の手法を学ぶという実践的な講座。

受講生の人たちは、会社から派遣されてきたデータサイエンス部所属の人たちがほとんどだ。

自分は、趣味で自費(8万円!)で、しかも会社には受講していることを秘密にして受講している。

おそらくそんな人はほとんどいない。

概要

DeepAnalyticsのコンペにチームで取り組んでいく。

講座では、まずは講義がありそのあとに演習課題がだされてそれに取り組む。

演習課題はチーム内で相談しながら進めていくので、わからなくても教えあえる。

演習課題は、時間内に終わらないので、それが宿題になる。

チーム内や講義内容の情報共有は、グループウェアのサイボウズLiveが使われる。

各チームごとにグループが作成されて、情報共有できる。

各回の内容

第1回

初回の講座では、Rの基礎とモデルの評価方法が紹介される。

私は今までPythonを使ってきたので、Rのことがわからなかったので、

なれるまでは一苦労だった。

データの処理方法として、dplyrというライブラリが紹介される。

ちょうど、Javaでstreamについて勉強していたので、

dplyrはそれと比較すれば理解はしやすかった。でも、使いこなせる気がしない。。。

モデルの評価方法としてRMSEとAUCが紹介される。これらの指標は、

これからDeepAnalyticsで評価で使われるからだ。

RMSEは理解が容易だが、AUCはちょっと難しい。講座でも、AUCは時間をかけて説明された。

そのあとは、実際にDeepAnalyticsの銀行問題のデータをダウンロードして解析するという

課題が出された。そこまで難しくはない。後日、模範解答が配られ、dplyrをバリバリに

使ったかっこいい解法が紹介されていてちょっとびっくりした。

課題は、はじめは個人で考えるのだが、わからないときはチーム内で相談することができる。

なので、仲良くなる意味でも相談し合った。

第2回

機械学習アルゴリズムとして決定木が紹介される。

Rで決定木をつかうには、rpartというライブラリを使う。

決定木は、ライブラリをつかうとぱっと計算できてしまう。楽だ。

また、前回紹介されたAUCもrRocというライブラリを使うとすぐに計算できる。

そして、決定木でDeepAnalyticsの銀行問題をとりあえず解いて、

適当にパラメータチューニングしてコンテストに提出することをやった。

手元で計算したAUCよりも低い値がでる。なぜでしょう?という流れから、

過学習の説明が始まる。

過学習を防ぐために、ホールドアウト法とクロスバリデーション法が紹介される。

そのあと、パラメータチューニングの方法としてグリッドサーチが紹介される。

このあたりになると自力でのコーディングはちょっとむずかしい。

あたえられたサンプルコードを弄り回してグリッドサーチをする。

家に帰って、課題をPythonで解いてみた。scikit-learnの勉強にもなる。

しかし、どうもpythonで書いた決定木とRで書いた決定木の結果が一致しない。

なので、Rで書いていくことにした。

caretというライブラリを使うと、グリッドサーチが簡単にできるので試してみた。

しかし、caretは rpartモデルではcp, rpart2モデルでは maxdepthしかできない。

やりたいことは複数のパラメータを同時に探索することだ。

いろいろ調べたらmlrというパッケージでそれが実現できることがわかった。

mlr で グリッドサーチをして、目標だった AUC 0.9 以上を達成!

第3回

今回は、リニア系の手法ということで、ロジスティック回帰が紹介される。

kaggleのアンケート調査では、データサイエンティストが一番利用しているのは、

このロジスティック回帰だそうだ。二番目は、決定木。

その理由は、どちらも結果がわかりやすく、説明もしやすいからだそうだ。

そのままでもそこそこの精度はでるのだけれども、より精度を出すために、

データの加工方法が紹介される。

たとえば、絶対値をとったり、logをかましてデータを直線に近くなるようにする。

また、外れ値を削除した。決定木は条件を分岐していくので、外れ値はそれほど影響はないが、

このロジスティック回帰には影響がかなりある。

データをプロットして性質をつかみ、データを加工して、精度を見ていく。

だんだんデータサイエンティストっぽくなってきた。

最後におまけとして、Lasso回帰やRigde回帰も紹介される。

宿題は、ロジスティック回帰を利用して再度投稿してみること。

私は毎度のことながら、Pythonに課題を移植して取り組んだ。

データ加工は外れ値の除去をしてみたら精度が上がった。

が、他のアイデアはでなかった。しかし、そこはチームで取り組んでいるので、

他のメンバがアイデアを提案してくれた。

私は、事前に Pythonではじめる機械学習を読んでいたので、

そこにかかれていたLassoやRidge, Polynomial Featureを使って、精度を上げたがそれは注意された。

ツールを使えば簡単にいい精度がでるけれども、

それだとブラックボックスの機械を使っているだけになってしまいます。

この講座では、データの様子を良くみて、どう工夫するのかという基礎を講習しているつもりです。

なので、結果としてのスコアも大切ですが、何をしているのかを理解することはもっと重要です。

先生がたの熱意や優しさを感じたのだった。

第4回

集団学習(アンサンブル学習)について学ぶ。バギング、スタッキングが紹介される。

まずは、出力結果の平均をとる平均法が紹介される。

単純に今までの決定木系とリニア系の手法を足すだけで、精度が上がった。これは不思議。

次にバギングが紹介される。これも数式はないものの、

わかりやすい図とサンプルコードとともに紹介されるので、理解できた。

次にスタッキング。これは、理解が難しかった。

しかし、このスタッキングを紹介している書籍やウェブページはあまりないため、

この講座の資料はとても貴重なものだと言われる。たしかに、調べても検索で引っかからない。

こちらもわかりやすい図とサンプルコードが与えられるのだが、

会場にいる人のほとんどが理解できずポカーンとしてしまった。

私は、それから家に帰って4時間くらいうんうんうなってようやく理解できた。

課題は、アンサンブル学習を利用してさらなる精度向上を目指すこと。

最後にxgboostとランダムフォレストという究極秘密兵器が紹介され、頑張ってと言われる。

家に帰り、バギングとスタッキングをPythonで実装しなおした。

スタッキングがどうもバグって時間がかかったものの、

どちらもスクラッチでコーディングすることができた。

しかし、そうやって頑張って理解したものよりも、

xgboostとランダムフォレストをつかったほうが簡単にいい精度がでてしったのだった。

これはすごい。さすがはコンペで大活躍している手法のことだけある。

xgboostはパラメータチューニングが難しい。解説サイトがあったので、それを元にチューニング。

xgboostは GPUで走らせることができるので、Amazonの AWSの EC2インスタンスを借りて、

走らせた。自分のNotePCで走らせるのと比べて爆速でびっくり仰天。

最終的には、以下の結果となった。

`○投稿結果: 0.94031

○手法の工夫

○アンサンブルの工夫

  • ランダムフォレストとxgboostの結果を59:41の割合で足した。

次回は、中間発表と、後半の課題Jリーグ問題だ。後半へ続く。

01 Oct 2017, 03:56

タイタニックで決定木、交差検証、グリッドサーチ(Python)

はじめに

データサイエンティスト養成講座の第二回を受けてきました。

扱った内容は、

  • 決定木
  • クロスバリデーション
  • グリッドサーチ

講座では、Rを使うのだけれども、Pythonにもなれておきたいので、

講座の内容をPythonで復習しました。

ついでに、kaggleのタイタニック問題を決定木で解きました。

今回のコードは、githubにあげています。以下は、コードの抜粋です。

Pythonで決定木

Pythonで決定木を使うには、scikit-learnライブラリを使う。

from sklearn import tree
clf = tree.DecisionTreeClassifier(random_state=17)
clf.fit(X, y)

簡単!

クロスバリデーション with KFold

決定木は、max_depthパラメータを大きくすればするほど精度が上がっていくが、汎化性能が下がっていく。なので、クロスバリデーションという方法を使って、過学習が起こっていないかチェックすることが重要になる。

from sklearn.model_selection import KFold
from sklearn import metrics
from sklearn.metrics import accuracy_score
K = 5
kf = KFold(n_splits=K, shuffle=True, random_state=17)

score_train_tmp = 0
score_test_tmp = 0

for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

    # 構築データでモデル構築
    clf.fit(X_train, y_train)

    # 構築データの予測値
    pred_train = clf.predict(X_train)

    # 構築データのaccuracy
    auccuracy = accuracy_score(pred_train, y_train)

    #構築データのaccuracyを足していく
    score_train_tmp+=auccuracy

    #検証データの予測値
    pred_test = clf.predict(X_test)

    #検証データのaccuracy
    auccuracy = accuracy_score(pred_test, y_test)

    #検証データのaccuracyを足していく
    score_test_tmp+=auccuracy
score_train_tmp/K
0.82463676190176005

score_test_tmp/K
0.80247944259619608

構築データと検証データのスコアが近ければ、過学習が起こっていないと判断できる。これが乖離していると過学習が起こっているので、パラメータチューニングが必要。

グリッドサーチ

最適なパラメータをしらみつぶしにパラメータを組み合わせて探索していく方法をグリッドサーチという。普通はfor文を回してパラメータを変えてスコアを見ることで調整していく。しかし、scikit-learnには、GridSearchCVというグリッドサーチをするための専用のクラスが用意されている。

これをつかえば、煩わしいfor文のネストを書かずとも、複数パラメータに対して探索をすくことができる。

調べたいパラメータをまずは辞書で定義する。

from sklearn.model_selection import GridSearchCV

# use a full grid over all parameters
param_grid = {"max_depth": [2,4,6,8,10],
              "max_features": ['log2', 'sqrt','auto'],
              "min_samples_split": [2, 3, 5],
              "min_samples_leaf": [1,5,8],
              "criterion": ["gini", "entropy"]}

次に、GridSearchCVを読んで、グリッドサーチを実行する。

tree_grid = GridSearchCV(estimator=clf,
                 param_grid = param_grid,   
                 scoring="accuracy",  #metrics
                 cv = K,              #cross-validation
                 n_jobs =-1)          #number of core

tree_grid.fit(X,y) #fit

tree_grid_best = tree_grid.best_estimator_ #best estimator
print("Best Model Parameter: ",tree_grid.best_params_)
print("Best Model Score    : ",tree_grid.best_score_)
Best Model Parameter:  {'criterion': 'gini', 'max_depth': 6, 'max_features': 'log2', 'min_samples_leaf': 8, 'min_samples_split': 2}
Best Model Score    :  0.812570145903

便利だ。素晴らしい。

しかし、このパラメータチューニングした結果をサイトにて提出しても、大したスコアは出ない。これは、特徴量エンジニアリングがそもそもしょぼいという問題がある。

01 Sep 2017, 09:56

Pythonではじめる機械学習(scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎)を読んだ

O’Reilly Japan – Pythonではじめる機械学習 を読んだ。

副題: scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

動機

ニューラルネットを学ぶ、その前に

今まで、機械学習を通り越してディープラーニングの勉強をしてきた。

つまり基礎をすっ飛ばして、応用にいってしまったのだ。

自分の手法はただひとつ、ニューラルネットワークのみ!!

これでは、機械学習を勉強しているといえるのだろうか?

自分のなかで、疑問が湧き上がった。

本に付いている帯が印象的だった。

ニューラルネットワークを学ぶ、その前に! とのことだ。

これだ!ニューラルネットを学んで、

その後に行ってしまった自分にとってはこの帯はまさに心のうちをいい得ているものだった。

機械学習コンペの壁

ニューラルネットを学んで機械学習コンペに挑もうとしても、

前処理でなにをすればいいのかわからず手が出ない。

前処理は、特徴量エンジニアリングというらしいことを最近知った。

なので、前処理を詳しく解説している書籍はないものかと探していた。

この本の副題は、特徴量エンジニアリングと機械学習の基礎。これだ。

本の特徴

scikit-learnについての実践書

本書は、scikit-learnを使って機械学習をするための実践書だ。

機械学習の難しい理論は、でてこない。

そういう難解なものは、scikit-learnがすべて隠蔽してくれる。

この本では、機械学習アルゴリズムの利点と欠点、

ライブラリのパラメータの調整方法という実践的な知識が載っている。

また、ライブラリの使い方以外のことも書いてある。ズバリ、特徴量エンジニアリング。

どうやって、カテゴリカルデータやフラグデータをどうやってscikit-learnで扱うか、

数学はでてこない

本書は、微分積分、線形代数、確率論を何年も

学ぶことなく機械学習を使いたいという人のための特攻薬だ。

数学は一切出てこない。各機械学習の手法を言葉でわかりやすく説明している。

今、平行して機械学習のための数学の基礎固めを進めているのだけれども、

自分がなにをしたいかを考えた時、理論をガチガチにかためてなにもコーディングできないよりも、

Kaggleでバリバリデータ分析をしたいという思いがあった。

そこで、まずはscikit-learnで機械学習の概要を掴み、

Kaggleに積極的に挑み、理論は後付で学んでいく計画を立てた。

理論よりはコードファーストを目指す人にはオススメの本だ。

scikit-learnをつかった機械学習コンペ対策に

本の前半で教師あり学習と教師なし学習のアルゴリズムが解説されている。

残りの半分はなにが書いてあるかというと、

  • 特徴量エンジニアリング
  • モデルの評価方法
  • 交差検証、他
  • グリッドサーチを使ったパラメータチューニング方法
  • パイプラインを使った効率的なコーディング
  • テキストデータの扱い方

など、機械学習コンペに必要な技が細かく書いてある。

概要を説明したあと、scikit-learnをつかえばこんなふうにかけますよと、

実例を通して学ぶことができる。

学習できるアルゴリズムは豊富

たくさんのアルゴリズムが紹介されている。

それぞれ、どんな利点と欠点があるか、どういう場面で使うべきかが書かれている。

たとえば、教師あり学習のアルゴリズムを本書より抜粋。

  • 最近傍法: 小さいデータに関しては良いベースラインとなる。 説明が容易。
  • 線形モデル: 最初に試してみるべきアルゴリズム。 非常に大きいデータセットに適する。 非常に高次元のデータに適する。
  • ナイーブベイズ: クラス分類にしか使えない。 線形モデルよりもさらに高速。 非常に大きいデータセット、 高次元データに適する。 線形モデルより精度が劣ることが多い。
  • 決定木: 非常に高速。 データのスケールを考慮する必要がない。 可視化が可能で説明しやすい。
  • ランダムフォレスト: ほとんどの場合単一の決定木よりも高速で、 頑健で、 強力。 データのスケールを考慮する必要がない。 高次元の疎なデータには適さない。
  • 勾配ブースティング決定木: 多くの場合ランダムフォレストよりも少し精度が高い。 ランダムフォレストよりも訓練に時間がかかるが、 予測はこちらのほうが速く、 メモリ使用量も小さい。 ランダムフォレストよりもパラメータに敏感。
  • サポートベクタマシン: 同じような意味を持つ特徴量からなる中規模なデータセットに対しては強力。 データのスケールを調整する必要がある。 パラメータに敏感。
  • ニューラルネットワーク: 非常に複雑なモデルを構築できる。 特に大きなデータセットに有効。 データのスケールを調整する必要がある。 パラメータに敏感。 大きいモデルは訓練に時間がかかる。

また、教師なしアルゴリズムでは、以下のようなアルゴリズムが紹介される。

  • データセットの変換 ・・・PCA, NMF, t-SME
  • クラスタリング ・・・ k-means, 凝集型、DBSCAN

終わりに

機械学習の理論は難しいので、とりあえずscikit-learnを使って実際に動かすことで、

感覚をつかむというのはいい方法だと思う。

xgboostとかをはじめに知ってしまうと、理論は知らなくても万能感が得られたりする。

ただ、深く応用するためには理論も抑えていくことが大事なので、

自分はこれからはじめてのパターン認識を次に読んでいこうと思った。