GW1日目 ウェブデータの機械学習を読んだ

以下感想

  • ウェブデータと言いつつ、内容のほとんどは言語処理。タイトルと内容が若干アンマッチ。
  • 言語処理をこれから勉強したい人におすすめ。個人的には言語処理を勉強したいと思っていたのでちょうどよかった。
  • 扱っているトピックは、異常検知・評判分析・単語の意味表現・グラフマイニング・情報検索
  • 各トピック、この本の知識だけだと物足りないのでこの本を起点に興味のある/活用するトピックの専門書や論文を読むのが良い。
  • 全トピックの中でも評判分析・単語の意味表現辺りは気合が入っていて、特に単語の意味表現についてはCBOWとSkip-Gramが詳細に解説されていてかなりわかりやすかった。

GWの予定

が特にないので、ひたすら本を読もうと思っています。 読もうと思っているのは下記。

  • ウェブデータの機械学習
  • Apache Solr入門第3版
  • コードコンプリート
  • パタヘネ
  • 情報検索の基礎
  • 世界で戦うプログラミング力を鍛える本

どこまで読めるかわからないけど、力尽きるまで頑張ります。

elixir/iex/mixでコマンド補完

最近趣味でElixir/Phoenixを勉強してます。

Phoenixをいじってく過程で mix phoenix.server やら mix ecto.migrate やらを入力する機会が多々あるのですが、 デフォルトではこれらのコマンドはタブ補完ができなくて地味にしんどいです。 タブ補完してくれる何かがないかと思ってぐぐったら案の定見つかりました。

GitHub - bjhaid/elixir_auto_complete: Bash Autocompletion for elixir, iex and mix

DLしてsourceするだけで使えます。 快適なElixir/Phoenixライフに一歩近づきました。

めでたしめでたし。

Leaf Classification

勉強の為久々にKaggleをやってます。

参加してるのはこちら。

https://www.kaggle.com/c/leaf-classification

 

試行錯誤の記録をこちらに書いていきます。

実際にはもう幾つかサブミットしてますが、主要なアップデートについてのみ書いていきます。

 

1回目

とりあえずRandomForestにぶっこんで学習させてみる。スコア0.9くらい。

 

2回目

RandomForestでパラメータをグリッドサーチさせてやってみる。スコアはむしろ下がった。

 

3回目

xgboostにぶっこんで見る。スコア0.7くらい。

 

4回目

xgboostを軽くパラメータチューニング。スコア0.54くらい。

 

5回目

caribrationしてみる。元々の予測値と、caribrate後の予測値の比率を幾つかのパターンで試してみた。結果、caribrate後の値をそのままsubmitするのが最もスコアが良かった。スコア0.48くらい。

特徴量の作り方

先日書いた↓の記事のちょっとした続編。

【Kaggle】Bike Sharing Demandを予測してみた - naohachi89’s diary

 

上記のコンペティションについて、参考になる記事があったのでゆるふわな感じで日本語でまとめてみる。記事はこちら。


A simple model for Kaggle Bike Sharing. – brandonharris.io

 

元データからシンプルな特徴量を作ってconditional inference treesで予測したら結構良い精度が出たよというお話。使う言語はR。以下、記事の大まかな流れ。

 

始めに、元データから天気や季節等の、自転車の貸し出しに大きく影響を与えそうな要素をそのまま特徴量とする。windspeedとかは自転車の貸し出し台数にそんな影響ないだろうということで無視する感じ。

次に、日付と時刻に関する情報を特徴量とすることを考える。日付と時刻は元データだと"2011-01-01 00:00:00"という形式なので、そのままだと使えない。そこで日付と時刻を分離させて、その上でそれぞれに関する特徴量を作っていく。

 

日付については、始めに各日付に対して関数を使ってその日付の曜日を割り出し、曜日ごとの貸し出し台数の平均を算出する。すると、どうやら日曜日の貸し出し台数が他の曜日と比べて少ないので、「日曜日か否か」を0/1で示す特徴量を追加する。

時刻については、元データで時刻が1時間刻みで記録されているので、これを0時~23時までの24種類の値を持つカテゴリカルな特徴量とする。次に、貸し出し台数は1日における時間帯(朝、昼、夜等)によって変わってくると考えられるので、1日を6時間ごとに4つのパートに区切って、これもカテゴリカルな特徴量とする。特徴量を作る話はこれでおしまい。

特徴量が出来たら、後はconditional inference treesを使って予測する。予測してみると、0.49523という結構良さげな結果が得られましたとさ。めでたしめでたし

 

feature engineeringはこれまできちんと勉強したことがなかったので、為になる記事だった。ちなみに、貸し出し台数に一番寄与する特徴量は時刻らしい。深夜3時に自転車を借りる人とかほとんどいないだろうし、そりゃそうだ。

【Kaggle】Bike Sharing Demandを予測してみた

修論が終わったので、今まで余り手が出せていなかった分野にぼちぼちチャレンジしようと思う。

ということで、とりあえずKaggleに投稿してみた。投稿したコンペティションはこちら。


Description - Bike Sharing Demand | Kaggle

 

自転車のシェアリングシステムで、一時間に何台の自転車が貸し出されるかを予測する問題。

与えられるデータには日時、季節、天候等が記載されていて、これらの特徴量から自転車の貸し出し台数を予測する。予測結果と真の値の誤差はRMSLEで算出され、評価される。

 

一先ず、処理がめんどくさい日時以外の特徴量とscikit-learnのSVRを使って予測してみる。結果は、スコアが1.45くらいで順位が大体1900位/2000人。道のりは険しい。ちなみに、予測台数を全て0にしたサンプルのサブミッションファイルだとスコアが4.5くらいだった。

次に、時間帯を特徴量として扱うように変更を加えた。時間帯を1時間ごとに区切ってカテゴリカルな特徴量として扱うようにした。この特徴量を加えて、同様にSVRで予測するとスコアが1.2くらいに改善された。これでもまだ1800位くらい。

SVRだと性能が余り良くなさそうだったので、scikit-learnに入っている他の手法を試してみた。すると、RandomForestRegressorでスコアが0.55程度まで改善された。大分良くなったのだけど、何でRandomForestだとここまで精度が改善されるのかは理解していないので勉強しないと...。

 

ちょっとした追記 

特徴量の作り方 - naohachi89’s diary

 

Mac Book Pro Retinaの開発環境構築

現在、先日買ったMac Bookの開発環境を構築しているのですが、備忘録として環境構築の参考にした記事をまとめておく。

 

・エディタ

Sublime Text2を使っているので以下の記事を参考にして設定した。

【追記】【寄せあつめ】今さらだけどSublime Text 2の基本とカスタマイズ【&Vim化】【4日目】 | Developers.IO

 

・ パッケージ管理

パッケージ管理ソフトとしてhomebrewを使っているので以下の記事を参考にしてGit、PythonPHPRubyを入れた。

MacOSX - Mac OSX で開発環境を構築するための環境構築 (Homebrew, Git, SVN, Ruby, Perl, Python) - Qiita

 

PHPApacheMySQL

以下の記事を参考にして、所謂LAMP環境を構築した。


Homebrew で Apache, PHP, MySQL, Composer をインストールして Yii Framework を動かすところまで - Qiita

Python

機械学習関連のライブラリを入れるために以下の記事を参考にしてanacondaを入れた。

pyenvは前のマシンでは全く使っていなかったのだけど、pythonの2系と3系を簡単に切り替えられて非常に便利。


MacでPython3系ベースの機械学習環境設定(Python2系との共存) - Qiita

 

Mecab

形態素解析ライブラリであるMecabを入れるために以下の記事を参考にした。


mecab-pythonをMacにインストールする - Qiita

途中でエラーが出てちょっと詰まってしまったのだけど、どうやらsetup.pyの中にpython3系だと動かないコードが含まれていないことが原因だったらしい。以下の記事を参考にsetup.pyを修正したら正常にインストールすることができた。やっぱりMeCabのインストールはめんどい。


Python3でMeCab

 

現状はこんな感じ。また新たに環境を構築したら追記するかも。