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

06 Jan 2018, 12:21

Ubuntu16.04にCUDAとcuDNN入れるまでの設定メモ ~ GPU版xgboost導入まで

はじめに

NVIDIAのGPUつきのパソコンを購入したので、セットアップメモです。

xgboostをGPUで動かすところを最終目標とします。

環境

  • Ubuntu 16.04 LTS
  • CUDA 9.1
  • cuDNN 7.0.5
  • Python 3.6
  • Anaconda 3.5
  • xgboost

NVIDIA GPU環境に必要なツール

なにしろGPUを購入してみたものの、無知なもので、まずはどういう仕組みで動かせるのか調べることにした。NVIDIA GPUを動かすためには以下の2つが必要らしい。

  • NVIDIA CUDA Toolkit ・・・ NVIDIA ドライバーと開発環境
  • cuDNN・・・ディープ・ニューラル・ネットワーク(DNN)ライブラリ

いきなりDockerという手もあるが

いろいろ調べると、サクッとまるっとこれらをインストールする簡単な方法があった。それが、Dockerだ。

nvidia-dockerという Dockerのラッパーツールがある。これを利用すると、以下の引用図のようなアーキテクチャでコンテナを動作させることができる。

dockerをつかうことのいいところは、ディープラーニング用ライブラリごとに環境を用意できるところ。たとえば、Tensorflow, keras, pytorchの3つを使いたい場合、各ツールでサポートしているcuda/cudnnが違うと使えない。dockerを使えば、それぞれのライブラリごとに環境を用意できるのだ。

ただ、途中までインストールをしかけたのだが、dockerに関する知識が乏しく、時間もなかったので、今回は見送った。いつかnvidia-dockerを使いこなす。

NVIDIA CUDA Toolkitのインストール

とりあえず最新が最適化されていて高速だろうという理由から、最新版の9.1をインスールする。Tensorflow1.4は8でないと動かないらしい。以下のリンクにインストール手順がある。

.bashrcを編集してパスを通す。

export PATH=/usr/local/cuda-9.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda

PCを再起動する。再起動後、インストールできたかバージョンを確認する。

$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  384.90  Tue Sep 19 19:17:35 PDT 2017
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5)

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85

NVIDIA cuDNN のインストール

次に cuDNNをインストールする。

cuDNNはNVIDIA で アカウントを作成しないとDownloadできない。wgetもできない。不便。

アンケートに回答後、以下の3つをダウンロードして、サーバにscpで転送。

  • cuDNN v7.0.5 Runtime Library for Ubuntu16.04 (Deb)
  • cuDNN v7.0.5 Developer Library for Ubuntu16.04 (Deb)
  • cuDNN v7.0.5 Code Samples and User Guide for Ubuntu16.04 (Deb)

sudo dpkg -iでインストール。インストールできたかテストしてみる。

$ cp -r /usr/src/cudnn_samples_v7/ ~/tmp/cudnn_samples_v7/
$ cd ~/repo/cudnn_samples_v7/mnistCUDNN
$ make clean && make
$ ./mnistCUDNN
Test passed!

Anaconda環境の導入

データサイエンスのためのよくばりセット、Anacondaを入れる。これを入れればデータ解析のための大抵のツールが手に入る。最新版を落としてきてインストール。

kaggle用の環境をつくる。

$ conda create -n kaggle
$ source activate kaggle

GPU対応 xgboost

GPU対応のxgboostを動かすには、ソースからビルドする。

Pythonモジュールをインストール

$ cd python-package; sudo python setup.py install

GPU版 xgboost めちゃくちゃハヤイ!!

02 Jan 2018, 05:31

KaggleのためのMOOCがcourseraに!How to win a Data Science Competitionを受けた

kaggleの攻略法について、以前調査した。あまり、学習教材がなかった。

Kaggleを初心者が進めるには、とにかくコンペに参加してKernelを読むしかないのかなと思っていた。そんな自分に朗報!この courseraが提供するものこそ、自分が求めていたものだ。

その名も・・・

How to Win a Data Science Competition: Learn from Top Kaggler

特徴

ロシアのカグルマスターが講師

この講座では、Yandexというロシアのgoogleが講座をサポートしている。そのため、ロシア切ってのデータサイエンティストから学ぶことができるのだ。

また、catboostなどの、ロシア魂がこもったライブラリを紹介される。これはかのxgboostよりも強力だった。

難易度高い…

正直、難しいです。quiz, assignment, 解けなかった。

この講座は機械学習の手法を教える講座ではない。それらはすでに身についているものとして、コンペで使える技や知識を教えてくれる。

kaggle コンペで腕試し

習ったことは即試してみようということで、練習用のkaggleコンペが用意されている。

ロシアのIT企業の売上予測を行う。時系列データコンペ。

各週の内容

week1:

recap&introduction ということで、データ分析コンペについて紹介される。

基本的な手法はもう知っているよねということで、MLの手法はサラッと紹介されて終わる。

そのあと、前処理についての紹介。これはよくまとまっている。数値変数、カテゴリ変数、時間の扱いと位置の扱い、欠損値の扱い。これは大事なので、なんども復習したいところだ。

assignmentはpandasについての演習。groupbyを多用する必要があり、初心者サヨウナラ感がとてもする。

week2:

EDAについての解説。これも一通りの手法は紹介される。とはいえ、すべてを網羅できるわけではなく、自分で習ったことを実践してみないとこれは身につかない気がした。

次に Validationということで、データ分割の戦略について紹介される。データ分割がなぜ必要か(過学習を避けるため)、その手法と注意点について。

最後に、Data Leakageが扱われる。具体的な事例を元に、DataLeakageにどうやって気づくかなどが紹介される、が、

ここはよくわからなかったな。。。Assignmentも Data Leakageについてなのだが。

week3:

Metrix(評価指標)について学ぶ。回帰、分類それぞれでよく使われる指標を学ぶ。MetrixとLoss functionの違いについて説明。ココらへん、理解していなかったので参考になる。

続いて、mean encodingという手法について紹介される。カテゴリカル変数を変換するための方法で、label/one-hot-encodingよりも、強力だとか。そして、その実装がassignmentとして課される。

week4:

ハイパーパラメータのチューニングについて、まず紹介される。ランダムフォレストやxgboost, ニューラルネットワークのパラメータチューニングについての実践的なアドバイス。また、自動チューニングツールの紹介(hyperoptなど)

次に、特徴量エンジニアリングの小ネタ第二弾。

  • Matrix Factorization
  • Feature Interaction
  • t-SME

最後に、一番むずかしい話題、アンサンブル学習が紹介される。weight average, bagging, stacking, boosting, stacknet…ムズい。assignmentはstackingの実装。

week5:

過去のコンペティションで講師の人が上位入賞をどうやってしたか、カグルマスターがその手法の種明かしをしてくれる。

ただ、これらの動画はおまけのようなもので、最後の週の本題は、用意されたKaggleコンペで上位スコアを取ること。

Assignmentがスコアのcsvデータの提出。一定以上のスコアを超えていないと、クリアとみなされない。そしてこの水準がとても高い。MSE1.0より低くないと、どうやら合格できないよう。LBを見ると、そんな人は30人くらいしかいない。

それに加えて、ペアレビューがある。以下のフォーマットに従って、自分がどうやってコンペに望んだかを説明するレポートを作成して、コードと一緒に提出する。

提出がすむと、他の人のコードをレビューできるようになる。

おわりに

この記事を執筆している時点では、私はコースを完了していない。

QuizもAssignmentも終わらなかった。

ただ、とてもこのコースはとても充実していた。かけた時間は現在95時間。kaggleのための実践的なテクニックが豊富に紹介されていて、吸収することがたくさんある。mean encodingや stackingなど、ネットにはほんとど情報がないが重要な手法も紹介されている

(assignmentにもなっている)

さらに、その知識を実践するする機会もコンペという形で与えられている。MOOCをいろいろと受けてきたけれども、そのなかでもかなり楽しい講座だった。それは、自分が今興味があることがデータサイエンスであり、ちょうど知りたい内容だったからだ。

この講座の内容をよくよく復習し、今後もKaggleに取り組んでいこう。Kaggle用のマシンも購入したことだし、まずはそれでグリッドサーチやアンサンブルを試してスコアを上げる。

28 Dec 2017, 02:07

JDLAのG検定、初試験で一発合格

JDLA(日本ディープラーニング協会)のG検定というのが12/16(土)に実施された。

遅ればせながらツイッターに流れてきて試験日を知り、12/4に申し込んだ。

結構難しくて、落ちたかなと思った。

なんとか?合格していました。今回は、受験者1448人、合格者823人。合格率にして57%。

対策日数は10日間だけれども、やったことを書く。

受験の動機

受験の動機は、ディープラーニングの知識を持っていることを資格を保持することで示したかったから。社内にAIを扱っているプロジェクトがあり、そこに移りたいと何度も上司に言っているのだが、受け入れてくれない。なので、資格を持つことで、ディープラーニングの知識を有していることを示したいと思った。

G検定とは

以下の通り

  • 目的:ディープラーニングに関する知識を有し、事業活用する人材(ジェネラリスト)の育成
  • 概要:ディープラーニングを事業に活かすための知識を有しているかを検定する
  • 試験概要:120分、100問(表示される問題数は232問)、多肢選択式、オンライン受験(自宅受験)
  • 受験料:12,960円(税込)
  • 試験日:2017/12/16(土) 13:00-15:00

受験料が高い。あとは、オンライン試験ということで、自宅で受けることが可能なところがポイント。100問とかかれているが、実際は232問出されて、とても分量が多い。私は20分くらい余ってようやく問題を解ききったが、さくさく解いていかないと、時間がなくなる。

シラバス(201712)

まずは、シラバスをチェック。

協会活動 | 一般社団法人 日本ディープラーニング協会 Japan Deep Learning Association

  • 人工知能(AI)とは(人工知能の定義)
  • 人工知能をめぐる動向
    • 探索・推論、知識表現、機械学習、深層学習
  • 人工知能分野の問題
    • トイプロブレム、フレーム問題、弱いAI、強いAI、身体性、シンボルグラウンディング問題、特徴量設計、チューリングテスト、シンギュラリティ
  • 機械学習の具体的手法
    • 代表的な手法、データの扱い、応用
  • ディープラーニングの概要
    • ニューラルネットワークとディープラーニング、既存のニューラルネットワークにおける問題、ディープラーニングのアプローチ、CPU と GPU
    • ディープラーニングにおけるデータ量
  • ディープラーニングの手法
    • 活性化関数、学習率の最適化、更なるテクニック、CNN、RNN
    • 深層強化学習、深層生成モデル
  • ディープラーニングの研究分野
    • 画像認識、自然言語処理、音声処理、ロボティクス (強化学習)、マルチモーダル
  • ディープラーニングの応用に向けて
    • 産業への応用、法律、倫理、現行の議論

実際、どこがでるかというと、まんべんなく出る。このシラバス通りに出る。不明なキーワードはすべて調べ、関連する話題も読んでおかないと、解けない。

自分の対策

推薦書籍は3つある。

  • AI白書 2017 (編)独立行政法人情報処理推進機構 AI白書編集委員会 角川アスキー総合研究所
  • 人工知能は人間を超えるか ディープラーニングの先にあるもの 角川EPUB選書 (著)松尾 豊 KADOKAWA
  • 深層学習 機械学習プロフェッショナルシリーズ (著)岡谷 貴之 講談社

申し込みから試験まで、10日しかなかったので、とりあえず推薦本の一つである、人工知能は人間を超えるかを丁寧に読んだ。

ディープラーニングは今年から勉強を開始したので、ディープラーニングや機械学習の問題が出てくれれば解けるだろうと思っていた。その憶測は正しかった。ディープラーニングや機械学習の問題は簡単だった。

IA白書を買ったのだが、これは分厚く、とても読めなかった。ここから出題された問題もいくつかあったが、正直これは捨て問だと思う。この厚い本を読んで、その一部の情報が記憶に残るとは思わない。

よって、機械学習やディープラーニングで点を稼ぎ、 AIの歴史は松尾本でここも落とさずに点数をとり、それ以外のほとんどの人がわからない問題は捨てる、という戦略が必要。

感想

難しい・・・というか、正確にいうと知らない問題は全く知らない。わかる問題は解ける。とにかく、問題数が多いのだ。オンライン試験なので、調べようと思えば調べられるが、その余裕を与えないための配慮だと思う。調べていたら、時間切れになるようにできている。

とにかく、出題範囲が広いのと問題数が多いのが特徴。という意味で、難しい。

半分くらいはディープラーニングではなくて、その関連知識の問題だった。歴史についてだったりAIについての考え方だったり。このあたりは、知らない問題はまったく手が出せずに捨てた。AI白書を読めば載っていることだろうが、あの本は分厚いので読む気にはならない。機械学習とディープラーニングの問題は優しく、ここで点数を稼いだ。

E検定に向けて

G検定が受かったので、次はE検定を目指す。こちらは、推薦書籍の3つ目が中心に出題されることが予想される。

しかし、この本難しいので、自分は最近発売された以下の本を中心にまずは進めようと考えている。

それとともに、E検定では実技試験が課せられる。これはコーディングをするということなのだろうか?現時点での情報では、そこまでは読み取れないが。とはいえ、なんらかのフレームワークを使って実装するスキルを磨いておきたいところだ。

最近注目してる、PyTorchを学習することにする。チュートリアルやUdemyの動画で学習を進めていく。

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リーグ問題だ。後半へ続く。

08 Oct 2017, 03:25

mlrを使って決定木(rpart)の複数パラメータのグリッドサーチをする

はじめに

Rでグリッドサーチをするためのパッケージとしては、caretが有名なのだが、

決定木でグリッドサーチをしようとすると、一つのパラメータについてしかできなかった。

  • rpartモデルではcpのみ
  • rpart2モデルではmaxdepthのみ

やりたいことは、cp, maxdepth, minbucketパラメータを同時にグリッドサーチをしたい。

自力でやろうとすると、for文が3つの入れ子構造になって大変だ。

いろいろ調査したら、mlr(Machine Larning for R)というパッケージで

複数パラメータに対して、グリッドサーチがかけられるとわかったので、そのメモを残す。

今回のJupyter Notebookは gistにあげています。以下抜粋。

mlrでグリッドサーチ

今回の題材は、毎度おなじみの kaggleタイタニック問題を利用する。

前処理を自分でやるのがだるかったので、以下の記事の内容を利用することにした。

以下の記事を参考にして、タイタニック問題のためのコードを書いた。

以下の範囲を指定してグリッドサーチ。

gs <- makeParamSet(
    makeDiscreteParam("cp", values = c(1e-4, 1e-5)),
    makeDiscreteParam("maxdepth", values = seq(5,10,1)),
    makeDiscreteParam("minbucket", values = seq(10,100,10))
)

すると、指定した範囲の組み合わせを総当りに計算していく。

最終的に、best scoreとなった値が出力されて終了。

それを提出したら、titanicのランキングでスコアが上がった。やった。

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:  {&#39;criterion&#39;: &#39;gini&#39;, &#39;max_depth&#39;: 6, &#39;max_features&#39;: &#39;log2&#39;, &#39;min_samples_leaf&#39;: 8, &#39;min_samples_split&#39;: 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とかをはじめに知ってしまうと、理論は知らなくても万能感が得られたりする。

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

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

16 Aug 2017, 12:56

決定木とそのアンサンブル法についてメモ(ランダムフォレスト、xgboost)

Pythonではじめる機械学習を読んでいるので、その学習メモ。

今日は、決定木について。前回の線形回帰のように、kaggleの問題を解いてみた。

家に帰るまでが、遠足です!

kaggleするまでが、勉強です!

決定木

Yes/Noで答えられる質問で構成された階層的な木構造を学習する。

  • 過剰適合を防ぐには、構築過程で木の生成を早めに止める事前枝刈りと、

    一度木を構築してから、情報の少ないノードを削除する事後枝刈りがある。

  • scikit-learnには、DecisionTreeRegressorクラスと、DecisionTreeClassifierクラスに実装されている。scikit-learnには事前枝刈りしか実装されていない。

  • 決定木の深さに制約を与えないと、決定木はいくらでも深く、複雑になる。したがって、枝刈りされていない木は過剰適合になりやすく、新しいデータに対する汎化性能が低い傾向にある。

  • 決定木から、特徴量の重要度(feature importance)が導出できる。個々の特徴量かどの程度重要かを示す割合である。

  • 利点は、結果のモデルが容易に可視化可能で、専門家でなくても理解可能であること。

  • 別の利点は、データのスケールに対して完全に不変であること、つまり特徴量の正規化や標準化は必要ない。

  • 最大の問題点は、事前枝狩りを行っても、過剰適合しやすく、汎化性能が低い傾向がある。そのため、単体でつかうのではなくアンサンブル法が用いられる。

アンサンブル法は、複数の機械学習モデルを組み合わせることで、より強力なモデルを構築する手法だ。ランダムフォレストと勾配ブースティング決定木がある。

ランダムフォレスト(RandomForest)

ランダムフォレストとは、少しずつ異なる決定木をたくさん集めたもの。それぞれ異なった方向に過剰適合した決定木をたくさん作れば、その結果の平均を取ることで過剰適合の度合いを減らすことができる。

個々の決定木が互いに異なるように、決定木の構築過程で乱数を導入している。導入方法は、データポイントを選択する方法と、分枝テストに用いる特徴を選択する2つの方法がある。

  • 構築する決定木の数をまず決める。
  • データからブートストラップサンプリングを行う。これは、重複可でデータポイントをランダムにn_samples回選びだす手法(復元抽出)このデータセットを用いて決定木を作る。
  • ただし、個々のノードで最適なテスト(基準値)を選ぶのではなく、特徴量のサブセット(max_features)をランダムに選び、その特徴量を使うものの中から最適なテストを選ぶ。
  • max_featuresが重要なパラメータ。max_featuresを大きくすると、決定木が似たようなものになり、最も識別性の高い特徴量をつかうので、訓練データに容易に適合できる。
  • max_featuresを小さくすると、ランダムフォレスト内の決定木は相互に大幅に異なるものとなるが、それぞれの決定木をかなり深く作らないと、データに適合できない。
  • しかし多くの場合、ランダムフォレストはデフォルトのパラメータで、十分よく機能する。
  • 回帰でもクラス分類でも、非常に強力。多くの場合、それほどパラメータチューニングせずに使える。スケール変換する必要もない。
  • テキストデータなどの、非常に高次元で疎なデータに対しては、うまく機能しない傾向にある。このようなデータに対しては線形モデルのほうが適している。
  • 線形モデルよりも、多くのメモリを消費するし、訓練も予測も遅い。実行時間やメモリが重要なアプリケーションでは、線形モデルをつかったほうがよい。

Kaggle digit-recognizer

これでScore 0.93729。

CNNにはかなわない。問題が悪かったかな??

勾配ブースティング回帰木(gradient boosting regression tree, GBRT)

勾配ブースティングでは、1つ前の決定木の誤りを次の決定木が修正するようにして、決定木を順番に作っていく。

  • モデルの占めるメモリが小さくなり、予測も早くなる。
  • 浅い決定木のような、簡単なモデル(弱学習機)を多数組み合わせるところがポイント。
  • パラメータ設定の影響を受けやすいが、こっちのほうが性能が良い。
  • learning_rate という重要なパラメータがある。
  • 過剰適合を低減するためには、深さの最大値を制限してより強力な事前枝刈りを行うか、学習率をさげればよい。
  • ランダムフォレストを先に試したほうかいい。こっちのほうが頑強だから。予測時間が非常に重要な場合や、kaggleのコンペで最後の1%を絞り出したいときは、勾配ブースティングを試すと良い。
  • xgboostはscikit-learnよりも、高速で、チューニングも容易。
  • 長所は、教師あり学習の中で最も強力なところ。
  • 短所は、パラメータチューニングに細心の注意が必要なところと、訓練にかかる時間が長いこと。

scikit-learnよりも、xgboostをつかったほうがいいよということで、使ってみた。

XGBoost の使い方。

kaggle digit-recognizer

Scoreは、0.93157。RandomForestよりも精度が低かった。

15 Aug 2017, 11:56

線形回帰の正則化についてメモ(リッジ回帰、Lasso)

[mathjax]

はじめに

Pythonではじめる機械学習を読み始めた。

今日は、線形回帰について。今まで、線形回帰は以下の式で表されるものだと思っていた。

$$

\hat{y} = w[0]✕x[0]+w1✕x1 ・・・w[p]✕x[p] + b

$$

しかし、実は正則化項が加えられることで、呼び名があることをしった。

  • L1正則化 ・・・Lasso回帰
  • L2正則化 ・・・Ridge回帰

この辺の知識を本から抜き出してメモ。ついでに、Kaggleも解いた。

線形モデル

線形モデルは入力特徴量の線形関数を用いて予測を行う。

  • 単一の特徴量に対しては、予測が直線になる回帰モデルとして特徴づけられる。特徴量が2つならば予測は平面に、高次元においては予測は超平面になる。
  • 多数の特徴量を持つデータに対しては、線形モデルは非常に強力。

線形回帰

線形回帰、もしくは 通常最小二乗法(OLS) は、最も単純で、最も古典的な線形回帰手法。線形回帰では、訓練データにおいて、予測と真の回帰ターゲットyとの平均二乗誤差が最小になるようにパラメータwとbを求める。

from sklearn.linear_model import LinearRegression
lr = LinearRegression().fit(X_train, y_train)
  • 1次元データセットでは、過剰適合の危険は少ない。
  • 高次元データセットに対しては、線形モデルは、より強力になるので、過剰適合の可能性が高くなる。

リッジ回帰

リッジ回帰 は線形回帰モデルによる回帰の1つである。予測に用いられる式は、通常最小二乗法のものと同じである。しかし、リッジ回帰では、係数(w) を、訓練データに対する予測だけではなく、他の制約に対しても最適化する。

  • 予測をうまく行いつつ、個々の特徴量が出力に与える影響をなるべく小さくしたい。これは、正則化(L2正則化)の一例である。
  • 十分な訓練データがある場合には、正則化はあまり重要ではなくなる。つまり、リッジ回帰と線形回帰は同じ性能を出す。
  • リッジ回帰は、linear_model.Ridgeに実装されている。
from sklearn.linear_model import Ridge
clf = Ridge()
clf.fit(X_train, y_train)

KaggleのHouse Prices: Advanced Regression Techniquesコンペを解いてみた。

Lasso回帰

Lasso回帰 は、L1正則化をかける。L1正則化の結果、いくつかの係数が完全に0になる。これは、モデルにおいていくつかの特徴量が完全に無視されるということになる。

  • 係数を0に向かわせる強さを制御する正則化パラメータalphaがある。
  • 適合不足の度合いを減らすためには、alphaを減らせば良い。
  • Lassoは、linear_model.Lassoに実装されている。
from sklearn.linear_model import Lasso
clf = Lasso()
clf.fit(X_train, y_train)

KaggleのHouse Prices: Advanced Regression Techniquesコンペを解いてみた。これで、上位50%まで行った。優秀だ。

まとめ

実際につかう場合は、リッジ回帰をまず試すのがよい。特徴量がたくさんあって、そのうち重要なのはわずかしかないことが予想されるのであれば、Lassoのほうが向いている。