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とかをはじめに知ってしまうと、理論は知らなくても万能感が得られたりする。

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

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

29 Aug 2017, 14:28

ITエンジニアは勉強するべきか?の感想

おくればせながら、数カ月前にネットでバズッてた記事を見つけて興味深かったので、

思ったことを書いておく。

私は、エンジニアが業務時間外にでも勉強するべきにはやや賛成である。

ややの理由

勉強しない人には、理由がある。

  • 育児が大変
  • 家事が大変
  • 趣味を優先したい

それを否定するわけではない。育児や家事をしながら仕事をするだけでも大変で、

それをしている人には頭が下がる。

独身でも、趣味に没頭してリフレッシュしているリア充の人は羨ましいが、

それはそれでいいと思う。

それでも、エンジニアという職業を選んだ時点で勉強し続けることは義務だと思う。

勉強しないならば、その人はエンジニアに向いていない。

自分が勉強が好きで実際人よりも勉強していると思うので、

自分を優位に立たせて正当化したいという裏の目標もあるのかもしれない。

どうして義務なのかをロジックで説明できないので、やや賛成。

社会人が勉強するべき理由

ITエンジニアに限らず社会人が勉強する理由について考えてみる。

勉強カフェの存在

私は勉強カフェの会員で、勉強はもっぱら勉強カフェで行う。

勉強カフェとは、社会人のための有料自習室だ。

勉強カフェにはいろんな目標を持った人が集まって勉強している。

  • 資格の習得のための勉強
  • 自己啓発の勉強
  • 転職のための準備
  • 大学受験や院試受験

勉強カフェはとても混んでいて、土日はいつも満席。大繁盛している。

勉強カフェにいると、みんな社会人になっても頑張って勉強しているので、

自分も勉強を頑張ろうという気持ちになる。

なぜ社会人になっても勉強するのだろうか?

なぜ、社会人になっても勉強するのだろうか?

私の個人的な意見では、自分がもっともっと成長したいからであり、

成長することはかっこいいからだ。

仕事で成長の機会を与えられる人はラッキーだ。どんどん成長していけばよい。

しかし、自分の場合は、仕事で成長の機会を与えられたと感じたことはあまりない。

仕事をしていても、自分の成長につながらないので、

プライベートで勉強をして、成長の喜びを味わっているというわけ。

一般的なこととしては、世の中の流行や技術は絶えず進歩していて、

それに遅れをとらないためにも、勉強をしないといけない。

これは、ITエンジニアに限ったことではなく、どの業種についても言えることだ。

ITエンジニアが勉強するべき理由

技術の進歩についていく

しかし、ITエンジニアは、他の業種に比べてことさら技術の移り変わりが激しい。

なので、技術の進歩についていくためにも、勉強しないといけない。

技術は陳腐化する。流行のプログラミング言語も、10年経てばガラリと変わる。

だから、新しい言語を学んだり、新しいフレームワークを試したりする。

35歳定年説というのは、新人研修の時にならった知識で食いつないできて、

それ以上の勉強をしてこなかった人が、行き詰まることを指しているのではないか?

Hackingにワクワクする

新しい技術というのは、既存の技術の改良である。

なので、既存の技術がHackされて、効率や性能が改善されているのだ。

そこに、ワクワクする魅力を感じる。

できないことができるようになる、これには魅力を感じるだろう。

これに賛同できない人は、エンジニアに向いていない。

なんの勉強をするべきなのか

業務に応用できるかもしれない勉強をする

今の業務に役立つかもしれない勉強をする。

できれば、業務に応用することを考える。

これが自分にとっては、最もモチベーションが上がる勉強の内容。

その裏には周囲に努力が認められたいという欲求があるし、

努力が報われたいという欲求もある。

勉強したけれども、業務に応用するには転職するしかないものは、

勉強しているときは楽しいけれども、それが終わると一体なにをやっていたのかと、

後悔することが多い。

私は、MOOCを 30以上受けてコンピュータ・サイエンスの基礎から応用までをざっと

勉強したけれども、役に立ったのはほんの少し。虚しくなってしまう。

転職に役立つ勉強をする

スキルチェンジとして、転職に役立つ勉強をしてみるのもあり。

私は、機械学習の勉強を今している。ゆくゆくは、データサイエンスに絡んだ仕事を

したいと考えている。今からでは遅いのではないか?そういう不安もあるが、

決めたことなので、挫折するまで突き進む。

資格の勉強はグレーゾーン

資格は役に立つと判断したら、取得すればいい。

会社から強制されて取る資格が最もよくない。

それらは嫌なものであり、身につかないからだ。

資格は、持っていると、技術の証明になる。

日本でもっとMOOCが流行ればいいのだけれども、

5年以上立ってもMOOCは転職では生きない。結局IPAの資格が強い。

自分の職場について

勉強しないと新しい技術を取り入れることができない

昔話であるが、自分の職場は、組込み系ソフトの職場なので、C言語が重要視されていた。

そんな職場でC++の導入をしたら、オブジェクト指向を理解していないのにC++を使うものだから、

結局、C++で書かれた手続き型のコードが量産されたという話を聞いた。

今は、随分改善された。新人教育でUMLの書き方を教わりUMTPの資格取得が推奨されたりして、

現場もオブジェクト指向が浸透している。

ただし、これからは、関数型言語の時代である。オブジェクト指向になれた人たちが、

関数型のパラダイムに接した時、結局関数型言語であるにもかかわらず手続き型の書き方

をしてしまうのではないかと思う。

また、自分が配属されたとき、部署の多くの人はmuleをつかって開発をしていた。

muleってなに?という人が多いと思う。Emacsよりも低機能なエディタだ。

今はIDEがとても進化しているにもかかわらず、muleを愛用している人がたくさんいた。

テストを書くという習慣もなかった。現場はprintデバッグでテストを行っていて、

gdbを使う人すら少数だった。

アンテナを張って時代の流行についていかないと、こういう現場になる。

なぜうちの職場の人は勉強しないのだろうか

ここからは、批判になるかもしれないので、読み飛ばしてください。

うちの職場の人は勉強しない。新しい技術に目を輝かせない。

これを書くととても部署を批判していることになって、

職場の人に見られると恥ずかしいのだけれども、本質だと思うのであえて書くと、

学歴の偏差値が低い集団だからだと思う。

よくわからない理系の大卒が新入社員として入ってくる。高専生も多い。

早慶上理、MARCH以下の大学から入ってくる。

偏差値が低い大学卒ということは、勉強をあまり昔から熱心にするという習慣がないのだと思う。

能力も低く、向上心も低く、平和で平凡な生活を大切にする人たちが集まっている。

英語ができなかったら、TOEICの勉強をするはずなのだけれども、TOEICの平均点も低い。

もちろん社会人になって、勉強の必要性を感じて伸びていく人もいる。

それは少数だ。総体として、意識低い系集団の集まりなのだ。

さらに、うちの部署は、親会社の下請け企業で、

親会社に頭を下げてマンパワーでなんとか開発して納品する文化がある。

残業も多いので、余計に勉強をしようという気持ちは起こらない。

そして、稼いだお金は趣味に費やすのだ、みんな趣味やプライベートは充実している。

技術力がないのに、マネージャーになっている人もたくさんいる。

私は、そういうマネージャーをあまり尊敬していない。

もちろん技術力と管理能力はわけて考えるものだけれども、

技術力がベースにないマネージャーはなんかヤダ。

どうやって部内の文化を変えようとしたか

自分は、この文化が嫌いなので、なんとかしようとした。

研修があり、(この研修をまじめに遂行する人はいないのだけれども)、

その課題として、部内の文化を変えようとした。

まず実施したことは、アンケート調査。職

場の部員全員に直接ヒヤリングを実施して全員分の意見を集めた。

将来自分の仕事がなくなることに危機感を持ってはいるものの、

なにを勉強すればいいかわからないという人が多くを占めた。

仕事に対する危機感はみんな持っていて、部内に蔓延していた。

10年20年同じ方法で開発してきたけれども、この先やっていけるのかという危機感はある。

しかし、なにを勉強すればいいのかがわからない。

仕方がないので、会社が推奨しているLPICの勉強を頑張る人が多い。

LPICの勉強をしたところで、将来の仕事が安定するのか?

そこで次に実施したことは、

新しい技術を知ってもらうためのメルマガを週一で発行することにした。

世の中で起こっている技術革新や、開発環境、プログラミング言語について、

毎週記事を書いて、部内に配信していった。

重いテーマについては、勉強会を開いたりもした。部内集会で発表した。

また、マネージャーや部内の技術顧問にインタビューをして、

彼らが部内に対して思っていることをヒヤリングして、部内に発信した。

気になる結果は・・・

そういう活動を通じて、部内はどう変わっていったか・・・!?

ここからが面白いところなのだけれども、自分自身がここでうつ病にかかって休職した。

2年間休職したけれども、もうあと2週間で復職予定だ。

果たして部内の文化はどうなっているのだろうか?

第二幕へ続く!!

23 Aug 2017, 09:32

プログラミングのための線形代数と確率統計がわかりやすい

とてもよい数学の本を読んでいるので、いまさらながら紹介。

  • プログラミングのための線形代数
  • プログラミングのための確率統計

モチベーション

機械学習のための数学の復習をしている。

この本を読む前に、マセマシリーズの線形代数・微分積分・統計学を読んだ。

マセマシリーズは、大学の試験対策本のようで、

テストを突破するのに効果を発揮しそうな書き方だった。

随所に注釈があり、ページを遡って読み返す必要がない。とても良い本。

でも、マセマはガチ。定理とその証明に対して手を抜かない。

そのため、定理、証明、定理、証明という、数学書にありがちなサイクルを繰り返す。

そのため、その数式や定理がどういう場面で役に立つのか、

その意味がよくわからないまま読み終わり、理解した気になってしまった。

そこで、数式の意味をイメージで捉えることに注力している本シリーズ、

「プログラミングのための〜」シリーズに手を出した。

バックグラウンド

一応情報系の学部を大学で専攻してた。

線形代数の本、実は自分が学生のころに購入して読破した。

けど、今となってはすっかり忘れてしまったので、再読。

大学の専攻が情報理論だったこともあり、確率はちょっと自信があるが、統計は全くダメ。

特徴

明確なスローガンがある

この本たちには、スローガンがある。

  • 線形代数: 行列は写像だ
  • 確率統計: 確率は面積だ

この考えを全面に押し出して、議論が進んでいく。

視点が与えられて、それにそって議論が進んでいくので、全体の見通しがとても良くなる。

また、著者らは、厳密な理屈よりも、意味を伝えることを重視している。

豊富な図が多用され、イメージによって数学を理解することができる。

コラムが読者視点

コラムが読者の視点でかかれている。たとえば、

  • 「これってホントに成り立つの?」
  • 「ちゃんと証明、説明してよ」
  • 「これは難しいよ」

という感じで、口語調で書かれている。

そういう質問をしたかったというかゆいところに手が届くのだ。

そして、コラムがものすごく丁寧に、ふんだんに書かれているのも特徴。

意味やイメージ、応用を重視

定理と証明を繰り返す、従来の数学書とは一線を画する。

まず大事にしているのが、その定理や数式がなにを意味しているかということだ。

それが、豊富なイメージと丁寧な説明で詳細に書いてある。

また、こういう場面に役に立つという応用も書かれていたりする。

プログラミングのための・・・あまり関係ない

プログラミングのためのと名を売っているものの、

プログラミングのコードがバリバリでてくるわけではない。

線形代数だったら、写像のアニメーションを表示したり、

確率だったら、シミュレーションをしたりした結果がちょこっと載っているのみ。

※プログラミングを求めるのなら行列プログラマーとか。

そうではなく、意味を理解して、コンピュータで行列や確率を扱うときの、

理解を深めようというのが趣旨。

速習コースが用意されている

線形代数

本論の説明と、コンピュータで数値計算をする章や、

手で計算する章は、印がついて分かれている。

コンピュータによる数値計算は学生のころはそういう授業があったので、よく参照したけれども、

意味を知り理解を深めることが目的な今となっては不要。

手計算も、試験を受けるわけではないので、不要。

なので、数値計算と手計算を省略して、本筋のみをなぞる、速習コースで勉強した。

確率統計

第一部と第二部に分かれている。

第一部で、確率論の基礎をみっちりやって、第二部で応用的な話題を扱う。

自分は第一部を読んで、機械学習に関連しそうな推定論と情報理論をつまみ読みしている。

おわりに

この本は数学書の中でも異色の部類にはいるが、とてもわかり易い。

マセマで王道をなぞったあと、モヤモヤしていた部分の霧が晴れるようで、

これは、という感動が随所にあった。

また、線形代数は学生時代に読んだものの、まさか10年の時を経て、

再び読むことになるとは思っても見なかった。

そして、10年経った今でも内容が色あせず、

むしろ機械学習ブームで社会人のやり直し数学の本として、

注目を集めいてることは素晴らしいと思う。

惜しむらくは、プログラミングのための微分積分シリーズがないことかな。

22 Aug 2017, 11:38

LPICの勉強のやる気がおきない

はじめに

LPIC L2 の勉強をしているのだけれども、どうもやる気が起きない。

なぜやる気が起きないのか分解してみた。

モチベーションが上がらない理由

会社からの強制で資格を取らされる

自分は取りたいと思っていないのに、会社から強制的に資格取得を目標にされて、

受験させられる。これがまずモチベーションが上がらない最もな理由だ。

自発的にではなく、強制的に受験の勉強をしなければいけない。

5年で資格が失効する

LIPCの資格は5年経ったら失効してしまう。

LPICの資格を保持し続けるには、5年ごとに高い受験料を払って受験しないといけない。

そういうビジネスモデルが腹立たしい。

ググればわかる

自分はLinuxが好きで、もちろん普段からUbuntuを使っている。

過去には、CentOS, Linux Mint, Arch Linuxを使って、今はUbuntuに落ち着いている。

ArchLinuxを使っていた時は、ArchWikiという素晴らしい情報源があった。

わからないことは、ほとんどそこを見れば解決方法が見つかった。

またそうでなくても、必要になったらググッてコマンドを見つけてインストールして使った。

障害でハマった時は、昼夜潰して情報をあさって解決した。

クリーンインストールもなんどもした。

そうやって、苦労してググった知識のみが結局身につくのではないかと思う。

紙面上で暗記した知識はすぐ忘れる。

LPICで問われる嫌な問題の一つは、オプションの種類についてだ。

わからなければ、zshやfishならばタブを押すだけで説明がでるし、

そうでなくてもhelpでしらべればわかることだ。

それを暗記しなければいけない。これが嫌だ。

すぐ忘れる

L2ともなると、サーバ管理系のコマンドがたくさんでてくるけれども、

サーバ管理者でもないので、使わないコマンドがほとんど。

いつになったら役に立つのかわからない。

サーバ開発やサーバ管理をしているわけでもないので、覚えた知識は使わない。

使わないと、忘れてしまう。歴史や地理の暗記と同じ。

テスト前に丸暗記した知識は忘れてしまう。

おわりに

批判ばかりなので、最後は肯定的に締めよう。

自分は井の中の蛙で、LPICの意義が見えていないだけかもしれない。

実は、将来長い目でみれば役に立つのかもしれない。

将来の自分がこの文章を読んで、過去の自分をビンタするかもしれない。

しっかりするんだ!!

資格を持っているから、Linux開発の仕事にアサインされたり、

部内のサーバ管理者に任命されたり、

自宅サーバを立てるときにやくにたてばいいなと思う。

16 Aug 2017, 15:23

Kaggleをはじめたので対策や攻略法についてのブックマーク

Kaggle

Kaggle モチベーション

はじめの一歩

チュートリアル

攻略法ブックマーク

MOOC

Book

手法

Tools

その他

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のほうが向いている。

12 Aug 2017, 09:51

fast.aiの Cutting Edge Deep Learning For Coders, Part 2を受けた

fast.aiが提供する ディープラーニングのオンライン無料講座、Cutting Edge Deep Learning for Coders を受けたのだが、難しくて後半から挫折。。

とてもいい講座なので、布教のためにも講座の紹介と、各レクチャーの内容を書いておくことにする。

これは、fast.aiが提供するDeep Learning コースの Part2に当たる。Part1の感想は以下。

講座の紹介

紹介記事: Cutting Edge Deep Learning for Coders—Launching Deep Learning Part 2 · fast.ai

Cutting Edge(最先端)の意味〜論文を読め!

Part1のPracticalのテーマは、Kagglerになれ、ということだった。

Part2では、Cutting Edge = 最先端の手法が紹介される。Cutting Edgeとはなにか?それは、

論文を読め!! ということだ。

そのため、最先端を追いかけるために、arXivの論文を読むことが課題として課せられる。論文を読み、その内容を実装できるスキルをみにつけることが求められる。

論文というものに今まで触れたことがないので、かなりびっくりだ。

Kerasのバックエンドが theanoからTensorFlowに変更、PyTouchも使おう

Part1と同様に、Part2も丁寧に書かれたJupyter Notebookが提供されて、それにそってレクチャーが進む。

このJupyter Notebook, Keras と PyTouch の両方で実装されている。

なので、PyTouchを使いたいひとは、そっちを使うことができる。

Part1より難しい・・・

Part1には、充実したwikiがあったのだが、Part2にはWikiがない。

さらには、英語字幕もない。自分は、英語があまり聞き取れないので、Part1での勉強スタイルは、動画で雰囲気を掴んだあと、wikiを熟読してなんとか理解するものだった。今回、それができない。

また、内容的にも難しさが上がっている。Part1でやったことはすべてわかっている前提ではじまるので、Part1を飛ばしてPart2からやるのは厳しいと思う。

目安は100時間以上

正直、Lesson12くらいからよくわからなくなったのと、急いで終わらせる必要が出てきたので、、後半はあまり時間をかけなかった。

それでも、100時間はかかった。真面目にやったら150時間?はかかると思う。

ちなみに、Part1は真面目にやって100時間かかった。

レクチャーメモ

Lesson 8: Artistic Style

まずは、Part1でやったことの紹介と、これからやるPart2の紹介から始まる。

Part2では、最先端を追いかけるために論文を読め!と言われる。Mendeleyという論文管理ソフトが紹介される。

そしてStyle Transferの論文が紹介されてこれを理解するように、という課題が出される。

はじめから意味不明なコードとハイレベルな難易度で戸惑う。

やってけるかな??もうダメだ!と思ったら、丁寧な日本語解説記事を見つけて救われる\(^o^)/

これらも参考になる。

なんとか実装した。

Lesson9: GENERATIVE MODELS

Perceptual Losses for Real-Time Style Transferという論文の内容が説明される。この技術は、Super-Resolutionという画質を良くする技術と、Real-Time Style Transfer という Neural Style Transferを高速化した技術の、両方に応用できる。

講義では、Super-Resolutionが取り上げられる。課題は、論文を読んで理解し、Fast Style Transferを実装せよとのこと。またもやもうダメだと思ったら、解説記事を発見。

なんとか実装した。

ノートPCの webcamから動画を取り込んで、fast style transfer で変換して、再度出力するということをやったが、ノートPCの非力なCPUでは、リアルタイムでは行かなかった。

Lesson10: MULTI-MODAL & GANS

DeViSEという論文の紹介と実装。

画像から関連する単語を抽出する試み。ResNetとword2vecを組み合わせる。

あまり理解していない。

Pythonで大規模データ(996433個の画像!)を扱うTipsとかも紹介される。ImageNetの大量画像データをスレッドやbcolzを使ってリサイズしたりする。あまりやりたくなかったので、これはJupyter Notebookを読むだけにした。

後半は、GANの説明。オリジナルのGAN, DCGANが説明される。あまりよい結果が出ない。そこで、WGANが紹介される。WGANはPyTorchで実装も公開されているとのことで、ここでPyTorch登場。

課題は、与えられたPyTouchのWGANを修正して、改善を加えること。

PyTorchとWGANという大きな課題を前に、途方にくれる。

まずは、GAN, DCGAN として、WGANというステップを踏んで学習することにした。

WGANに進んで論文読み始めたけど、この論文難しい。。数式とその証明が難しい。レクチャーでも、この論文は難しいと言っていた。先を急ぐので、WGANは後回しにすることにした。

Lecture11: MEMORY NETWORKS

前半は、最新の研究成果を追うためには論文を読むことを改めて強調される。そして、最近の研究成果を元にCNNを改良するためのたくさんのTipsとpaperが紹介される。

そのあと、k-means、Mean shiftというクラスタリング手法について説明がある。なんでここでクラスタリングなのかなと思ったら、PyTorchを使ってGPUの恩恵を受け、計算を高速化する方法が紹介される。

PyTorchはNumpyのようにデータを扱えるがブロードキャスト機能がないとのこと。そうなんだと思っていたら、v0.2.0で昨日追加された模様!link

最後に、Memory Network。これは、Facebook発のシンプルな自動応答のアルゴリズム。詳しい日本語の解説記事があった。

Lecture11から先は、明確なassignmentsがなくなり、課題としてなにをすればいいか悩む。正直、後半は完璧な理解は求めず、流しつつ進めた。とりあえず、与えられたJupyter Notebookと論文を読んで理解することにした。

Lecture12: ATTENTIONAL MODELS

k-meansの説明から始まる。Tensorflowでk-meansを実装する説明。k-meansについてよく理解していないので、ここの動画は飛ばしてしまった。(40分)

Attentional Modelsの説明とkeras実装が紹介される。はじめにencoder-decoderモデルを紹介して、これでは長文になるにつれて精度がでないねといって、Attentionモデルが出てくる。RNNや Embeddingsを忘れてしまったので、よくわからなかった。そういう人は、Lesson4,5,6を復習してねとのこと。まいったな。いよいよ 詳解 ディープラーニングを読んでみようかな。評判いいし。

(話は脇道にそれて、このDLコースのPart3はないよ、強化学習はやらない。代わりに、Part0を作って Practical machine learningをやるかも、とのこと。期待)

次は、いよいよCutting-Edgeな技術、ニューラル翻訳。予告編として、以下の論文が紹介される。

Lecture13: NEURAL TRANSLATION

ニューラル翻訳、英語からフランス語への翻訳、実はUdacityのDLNDで同じ課題をやったことがあるのだった。このときは、TensorFlowをつかった。TensorFlowは Seq2Seqのライブラリが充実していて、なんかよくわからないまま、講義のコピペで実装できてしまった。

fast.aiでは、KerasとPyTorch両方の実装が提供されている。よし学び直そうと思ったけど、やっぱり理解できなかったorz。とばし。

後半は、 Densenetの紹介。

Lecture14: TIME SERIES & SEGMENTATION

Final Lecture!

Kaggleのコンペを使って時系列データの扱いを学ぶ。Part1は主に画像データの扱いがメインだった。カグルマスターのKaggle攻略法講座が久しぶりに帰ってきた!!・・・が、真似できる気がしなかった。こうやって、カグルマスターは前処理をするのかと思った。

カテゴリカルデータをembeddingを使ってニューラルネットにぶち込む手法が参考になった。これを参考にして、自分は入門コンペのTitanicとか、House Prediction とかからはじめよう。Taxiコンペは Bengioさんが論文かいて手法を解説しているとか。

次に、segmentation(画像データをセグメントでわける処理)を学ぶ。これは、DenseNetを改良した、Transfer Learningに似たネットワークが使われる。

最後に、さらなる高みを目指して

  • コードを書こう!
  • Paperを読もう!
  • ブログを書こう!

と言われる。

ここまで、長い長い旅だった。英語力がもう少しあればと思うときが何度もあった。このPart2で得られた最も多きな、恩恵は、PyTorchと論文に触れたことだった。未消化な部分や飛ばした部分がPart2は多いので、復習しよう。

Part2で読んだPapers

論文はMendeleyで管理するのがすごく便利。

他にも、たくさん論文が紹介されたのだけれども、後半紹介された論文は、あまり読んでない。。。

10 Aug 2017, 16:18

会社に復職します

会社を休職していたのだけれども、今日ようやく復職の許可が降りた。

1年と8ヶ月間休職した。長かった。5回も復職判定面接をして、ようやく許可が降りた。こんなに長くなってしまったのは、いろいろな要因があるのだけれども、今までの経緯を振り返ってみたい。

以下、長文。TL;DR; 産業医との相性が悪かった。

休職に至るまでの経緯

前提として、もともと学生のころから鬱の症状があって、気分の浮き沈みを繰り返していた。精神科には、学生の頃からお世話になっていた。学生の頃は2年間通った。社会人になってからも3,4年前から精神科に通院していた。

気分は浮き沈みがあり、特に5月と11月(季節の変わり目)には周期的に鬱になっていた。具体的には、鬱になると布団からでられなくなる。布団から出ても出発の身支度に1,2時間かかり、学校や会社の遅刻を繰り返す。休日は一日中寝ていたりする。

ちょうど、11月の気分が落ち込みかけている時に、レガシーコードの調査を任された。どのくらいレガシーかというと、

  • 一つのメソッドが1000行以上
  • コピペコピペの嵐、同じようなクラスがいくつもある。作成者は継承という概念を知らない
  • 作成者不明なのでコードに疑問をもっても誰に相談すればいいのかわからない
  • 意味不明な変数名
  • 当然テストコードはない

気分は一気に落ちていって、朝起きれなくなった。遅刻を二週間連続で繰り返して休職。情けない、豆腐メンタル。今思うと、なぜそこで踏ん張れなかったのかと思う。頑張れよ自分。

休職してから3ヶ月で完治

仕事から離れると、すぐに回復した。仕事の質が鬱になった原因だったので、仕事から離れたらすぐに元気になった。

元気になって、やることもないので、TOEICの勉強をはじめた。一日10時間、2ヶ月で600時間勉強した。鬱の人がこんなに勉強できるだろうか?鬱は治ったと実感した。

主治医に、もう元気モリモリです、と相談したら、仕事にすぐに戻ると再発の可能性があるので、リワークをしてみてはどうかと言われ、3ヶ月間リワークに通うことになった。

第1回復職判定面接

リワークの終わり頃にいわゆる出合い系サイトにハマってしまい、生活リズムが乱れてしまった。お金がないので、実際に出会うまではいかないのだけれども、スマホの電池が切れるまでずっとサイトのタイムラインを眺め続けるというようなことを繰り返した。サイトをチェックすることに中毒になってしまい、夜遅くまで起きていた。

そういう状態で、会社の復職判定面接に望んだので、睡眠リズムが一定ではないということで復職不可となった。復職の条件は、

  • 生活リズムを一定にすること

これは、最もなことで、仕方がないと思った。

第2回復職判定面接

復職判定面接で復職不可となったので、落ちこんでまたひどく鬱になった。布団から出ることができず、一ヶ月ほとんど寝ていた。

このままではダメだと思い、青春18切符を購入して旅に出た。一週間かけて、神戸、大阪、京都を観光して帰ってきた。そしたら、なんだか元気になってきた。旅行によって、鬱屈した気分も晴れ、生活リズムも安定してきた。旅行によって、元気になったのだ。

また、落語にハマった。スカイプでたまたま知りあった人と新宿末広亭に行ったら、落語をやりたくなってきた。もともと大学生の時は、落語研究会に入っていた。なので、社会人の落語研究会に入会した。

生活はメキメキと安定してきた。昼間はTOEICの勉強をして、夜は落語の稽古をした。そういう生活を1,2ヶ月続け、元気になった。2度目の復職判定会議に望む。

2度目の判定会議で、産業医が1回目から変更になった。

この産業医との相性が悪く、ここから一年の間、復帰できなかったと言っても良い。

第2回目の復職判定会議は、結論としては、復職できなかった。その理由は、生活リズムではなくて、お金の使い方が粗いからだった。

どういうことかというと、月に100万つかったと言ったら、この人は精神異常者だとみなされて、復職不可となった。

どうして、100万をつかってしまったか、その内訳を説明したい。内訳は、以下の通り。

  • 学生特例で免除されていた年金の追納金 65万
  • 結婚相談所入会金 10万
  • 社会保険費 6万
  • 生活費 19万

落語研究会にはいり、お年寄りとふれあう機会が増えた。老人ホームやデイサービスの施設で落語をすることもあった。そんな折に、年金の追納金のお知らせが来たので、お年寄りのためにも、払えるものは払ってしまおうと、65万を払った。また、結婚相談所に30歳までに入会すると、入会金が6万円安くなるという割引を見つけたので、10万払った。出会い系サイトにハマるよりも、結婚相談所に登録したほうがよっぽど健全だ。次で復職できると思い込んでいたので、復職が決まったらすぐに婚活をはじめようと思っていた。

というわけで、復職の条件は

  • お金の収支を記録して、3ヶ月間分の記録を提出すること。

第3回復職判定面接

また、産業医さんには、自分を復職させようとしない、もう一つの理由があった。曰く、自分は、産業医さんからみて、発達障害者だと思われた。そのため、大学病院に行って心理検査と知能テストを受けることになった。

心理検査の結果、まったく異常なし。発達障害ではなかった。

IQテストは、89だった。IQは平均が100なので、自分はどちらかというと頭が悪いということがわかった。これには少し落ち込んだけれども、そのころGRITという言葉をしった。IQがたとえ低くても粘り強く努力すれば、実力を発揮できるというもの。これを励みに、TOEICの勉強を頑張った。

お金の収支について、無駄使いはしないものの、自分の自己啓発のための投資にお金を少し使いすぎた。具体的には、TOEICの本をたくさん買ったり、TOEICセミナーに参加したりした。このころになると、休職してからのTOEIC学習時間が1500時間に達した。そして、目標の860スコアを上回り、895スコアを獲得した。GRITが証明された瞬間である。IQが低くてバカでも、粘り強く努力すればTOEIC900も夢じゃないのだ。

そして迎えた第3回復職判定面接。結果は復職不可。理由は、お金の支出が収入よりも、多いからと、TOEICの勉強をして、仕事に向けての勉強をしていないから。

そして、復職の条件は、

  • お金の支出を収入よりも抑えること
  • Javaの資格を取ること

となった。

第4回復職判定面接

趣味はすべて禁止、飲み会参加も禁止、衣類の購入も禁止、とにかく無駄遣いは禁止になった。落語研究会もお金がそこそこかかるのと、時間が思っていた以上にかかるので、やめてしまった。趣味なし、楽しいことなし、人生はなんて虚しいものか。なんのために生きているのかわからなくなってきた。気分の落ち込みは、明らかに産業医さんの価値観に対する理不尽さからくるものだった。

TOEICで895スコアを取得したので、もう英語の勉強はやめようと思った。代わりに、流行りの機械学習の勉強をはじめた。これが面白く、また世間でも盛り上がっていて話題に尽きないので、のめり込んでしまった。

Javaの資格、Java SE Silverの勉強を始めたのだが、一日30分時間を取ることにした。これにはわけがあって、受験費が高額なので休職期間中は受験しないと決めていたのと、復職が決まったら、通勤訓練というものをやらされて、会社の図書館に閉じ込められるので、その時間に集中して勉強しようと思っていた。しかし、これが産業医さんの思いとすれ違っていて、また怒りを買うことになった。

4回目の判定会議、1日12時間勉強しているけれども、Javaの資格試験の勉強は30分しかしていないと報告したら、激怒された。

産業医さんは、自分のJavaのスキルが足りないから難しくて鬱になったと思い込んでいた。なので、自分は、そうではない、自分のJavaのスキルが足りないのではなくて、与えられたコードが汚かったので、鬱になったと弁解した。そもそも、うちの会社は組込みソフトの会社なので、Javaは正直あまりつかわれていないので、この資格は重要ではないといった。そしたら、また激怒された。汚いという表現を面談の場で使うべきではない、そういう表現を使うあなたは幼稚だ、さらに鬱になった原因について会社を責めていると言われた。鬱になった原因は全部自分にあると、自虐的におもわなければいけないのか?

ということで、今回も復職は不可。今回は、細かく復職の条件を指定された。

  • Java SE Silver の試験に合格すること
  • 反省レポートを書いて提出すること
  • お金の収支について、3万円の黒字を出すこと
  • 生活記録表を記録して、何時に何をしていたのか詳しく報告すること
  • 食べたものを記録して提出すること。レコーディング・ダイエットすること。

第5回復職判定面接

Java SE Silverの試験は楽勝だった。3日で取得した。しかし、その受験料が3万近くかかり、それに加えて3万の黒字をださなければいけないので、お金を本当に切り詰めて生活することになった。そもそも、なぜ3万の黒字をださなければいけないのかも理解していない。

ここで、運悪く睡眠リズムが崩れてしまう。これは、主治医に夜中に中途覚醒してしまうと訴えたところ、クエチアピンという睡眠薬を2錠処方された。これを飲んだら、毎日12時間眠るようになった。はじめは薬のせいではないだろうと思って、自分の意思が弱いのだろうと思い込んでいたが、医者に相談したら、薬のせいだとわかった。睡眠リズムが乱れたので、次回の復職判定会議も延期された。

休職満了期間が残り3ヶ月になってきて、このままだとクビになってしまう。

自分も焦っていたが、両親もとても焦っていた。一人暮らしをしていたのだが、母親が自分のマンションから3分のところにあるマンスリーマンションに引っ越してきた。これは、とてもありがたい。朝は起こしてくれるし、お弁当も作ってくれるし、なにより夕食に手料理が食べられる。お金も節約できる。母親の愛情を感じ、何としてでも復帰しなければいけないと思った。

そして、迎えた第5回目の復職判定会議。万が一のこともあるので、両親の同席が求められた。社会人の面談に両親が出て行くなんて恥ずかしいと思ったが、父親が一緒に参加することになった。

復職の条件は完璧にクリアしていた。文句のつけようがない。父親がいるせいか、普段とは空気が違い、受け入れようという感じを強く受けた。事前に提出した反省レポートについていくつか質問を受けたあと、復職許可が決定した。

おわりに

社会人になってから、メンタルを病んで休職することは、学生時代から想定していた。なので、就職活動では福利厚生が充実しているところを選んで受けた。幸か不幸か、その恩恵をはや数年目にしてうけることになった。傷病手当金(休職中の収入源)は国が定める決まりで、お金をもらえる権利はあるのだが、もうしわけない、早く会社に復帰したいといつも思っていた。カウンセリングも無料で2週間に一回受けることができた。これはとても支えになった。これらの福利厚生制度には、本当に感謝している。

ただ、復職するにあたって、こんなに大変だとは想定していなかった。自分は2ヶ月で復職できるものだと思っていたら、2年近く復職させてもらえなかった。

自分は運が悪かったのだろうか、それともこれが普通の対応なのだろうか?考えるとまた鬱になるので、深くは考えないことにして、とりあえず将来のことを考えたい。

07 Aug 2017, 11:58

PyTorchでDCGAN

PyTorchとMNISTをつかって、DCGANで手書き数字を生成してみた。

前回のつづき。

GANでは、あまりよい結果が得られなかったので、DCGANの論文を読んで、実装してみた。

Deep Convolutional Networkを GANに使うにあたって、以下の改良点が提案されていた。

  • すべてのプーリングレイヤを strided convolutions(discriminator)と fractional-stirided convolutions(generator)に変更する。
  • generator と discriminator に batchnormを使う。
  • 全結合隠れ層を取り除く。
  • ReLU 活性関数を generatorで使う。ただし、output層は tanhを使う。
  • LeakyReLU活性関数をdiscriminatorのすべての層で使う。

もとい!

PyTorchのチュートリアルに DCGANの実装コードが公開されているので、それを参考に実装する。

結果

GANよりも、数字がくっきり浮き出た!

結果その2

ぺけぺけ女優10000人の顔写真をDMMからスクレイピングして収集し、それを題材にDCGANで顔写真の生成をしてみた。

スクレイピングは、この記事を参考にしました。

やっぱりぺけぺけ女優なので、モザイクがかかっています。