Julia DataFrames.jl で数字で始まるカラム名を取得する場合の工夫

以前の記事 で紹介した

DataFrame(load("./input/train.csv"))

だと、どうやら数字が先頭のカラム名をそのまま扱ってしまう。

Julia DataFrame columns starting with number? - Stack Overflow

によると、 :2aa という表記は Julia 上シンボルではなく 1:2aa というレンジの扱いになってしまうため、"1st"というカラムが存在しているからといって、df[:1st] と書いても想定しているカラムを取得できない。

DataFrame.readtable だと、いい感じにカラム名の先頭を "1st" => "x1st" のように x を入れてくれていた(これも、実際データ触る時邪魔な気もするけど)

解決方法

ちゃんとシンボルだと指定してあげればいいので、

df[Symbol("1st")]

としてあげれば取得できる。少し不格好だが嫌いじゃない。

Julia の DataFrames.readtable が deprecated になって CSV.read 推奨になったけど使いづらいので別の方法を探してみた

DataFramesでreadtableを実行しようとすると、deprecated warningが出る。

DataFrames.readtable

DataFrames.readtable("./input/train.csv")
=>
WARNING: readtable is deprecated, use CSV.read from the CSV package instead

CSV.read

これに対応しようとして CSV の read メソッドを呼ぼうとするが、現状このメソッドでやろうとするとNull値を許可したり、Unionで型を指定してあげないといけなかったりする。

CSV.read("./input/train.csv")
=>
CSV.ParsingException("error parsing a `Int64` value on column 27, row 235; encountered 'N'")

CSVFiles.jl

他に良さそうなライブラリがないか探してみたら、CSVFiles.jl: FileIO.jl integration for CSV filesが使いやすそうだった。そういえば、提出用ファイルで出力する時にheaderのカラムにダブルクォーテーションを使いたくないときにもこのライブラリで対応できた。スター数は全然付いていないがメンテもされているし使い勝手が良い。作者のdavidanthoffさんがjuliaの質問サイトとかで自分のライブラリを紹介して広めているのも健気で好感が持てる。Read file with CSV.read - Usage / First steps - Julia discourse

使い方としては

DataFrame(load("./input/train.csv"))

DataFrames.readtable と同じように扱うことができる。

Numerai で初めて報酬圏内に入ったので機械学習処理を簡単にまとめる

データサイエンティストが集まってモデルを作って市場予想をしヘッジファンドを動かす取り組みのNumerai

データサイエンティストとしては、そのNumerai上で毎週行われているコンペに参加し一定の条件をクリアすると報酬がもらえる。

何回か挑戦していたが、条件であるLogless 0.7 以下と提出データのオリジナリティが達成できていなかった。Logless 0.7 以下はそこまで難しく無いが、オリジナリティが達成しにくい。単純に一回予測しただけだと、他の人が同じ手順でやっているためオリジナリティは無くなってしまう。

前回の田中TOMの放送でLightGBMを触ったので、XGBoostと合わせてスタッキングで挑戦してみることに。

今回のデータ処理概要

概要は次の通り。

実行環境

  • Julia: 0.6.2
  • 使ったJuliaライブラリ
    • FileIO: 提出ファイル出力用
    • CSV: CSVデータの読み込み、以前はDataFrameがメソッドを用意してくれていたが、こちらでCSV.readするように推奨している。
    • XGBoost: XGBoost バージョンは更新されていないが最近masterブランチが0.6系に対応してくれた
    • DataFrames: DataFrameを扱えるように
    • MultivariateStats: 主成分分析用
    • LightGBM: LightGBM コアライブラリは別途用意する必要があるし、まだjuliaの公式パッケージになっておらずgithubから持ってくる必要がある
    • LossFunctions: 損失関数を確認するため
    • CSVFiles: 提出ファイルの出力用

無事にLogless 0.7以下とオリジナリティも承認されて、報酬圏内に入ることができた。

田中TOMのめざせKaggleMaster #13 LightGBMを触ってみる

動画

相関ヒートマップの見方

ほとんど同じ内容の特徴量をあぶり出す

  • house pricesの特徴量にはほぼ同じ情報を持つものが多く含まれる
  • 重複した特徴量は不要なので使用しない
  • ヒートマップの色が濃くなっているところが重複した特徴量

GBDT(Gradient Boosting Decision Tree)

アンサンブル学習のブースティングとバギングの違いについて \| データ分析とインテリジェンス

  • アンサンブル学習は、大きく2通りに別れる
    • バギング(bagging)
    • 復元抽出によってたくさんモデルを作成し、それらを平均化する手法
    • 例)ランダムフォレスト
    • ブースティング(boosting)
    • モデルを逐次更新していく手法
    • 例)GBDT

Julia Now

今週のニュース

田中TOMのめざせKaggleMaster #12 回帰木と分類木

動画

回帰木と分類木

今更だけど、分類木と回帰木の説明
決定木、分類木、回帰木の意味と具体例

今回は回帰の問題なので回帰木を用いる。

最適深度と木の数を決定する

GridSearch()関数が最適な深度、木の数等を決定してくれる

なぜ正規分布?

RF系における特徴量重要度測定

OOBを使うらしい
【機械学習】OOB (Out-Of-Bag) とその比率

今週のニュース

田中TOMのめざせKaggleMaster #11 主成分分析を使う

YouTube

House Prices

Kaggleの練習問題(Regression)を解いてKagglerになる - Qiita

Metabase

  • Heroku x BigQueryで動かしてみた

主成分分析

機械学習と主成分分析
– 機械学習では特徴ベクトルの次元(特徴変数の数)が増えるとパターンも増えてしまい、必要なデータも膨大になる
– 特徴ベクトルの次元数は少ない方が良い。
– 主成分分析PCAは次元の数を削減して「次元圧縮」や重回帰分析の前処理として特徴量同士を無相関にすることができる
– 元のデータの特徴の情報量をどれだけ持っているかを寄与率で表現して、累積率を見て上位を選択することで、次元を減らす

主成分分析の作業手順

  1. 外れ値を除去する
  2. 元データから教師ラベルを取り除く
  3. 主成分分析を行う
  4. 累積寄与率を吟味して、第何主成分まで利用するかを決める
  5. 教師ラベルを戻し教師データを作成する
  6. 学習
  7. 学習に用いなかった教師データを用いて学習成果を評価
  8. 新たに得られた未知データを識別・予測する

Julia でやってみた

PCA RandomForest 2018/01/13 2625/2949位

今週のニュース

田中TOMのめざせKaggleMaster #10 回帰問題へ挑戦

動画URL

田中TOMのめざせKaggleMaster #10 回帰問題へ挑戦 - YouTube

Next Competition

House Prices: Advanced Regression Techniques | Kaggle

  • 米国アイオワ州のエイムズという都市の物件価格を予測する問題
  • データは、”築年数”、”設備”、”広さ”、”エリア”、”ガレージに入る車の数”など79個の変数および物件価格による1460戸の学習データが与えられる
  • データをもとにモデルを作成し、1459戸の家の価格を予測する

参考記事

今週のニュース

田中TOMのめざせKaggleMaster #9 2017年に扱った機械学習の技術を振り返ろう #LetsRewind

動画 URL

田中TOMのめざせKaggleMaster #9 2017年に扱った機械学習の技術を振り返ろう #LetsRewind - YouTube

  • 今年の頭から機械学習スタート
    • ゼロから作るディープラーニング
      • 全10回
    • Keras
      • 全4回
      • keras使いやすい
    • RandomForest
      • 全4回
      • 分類問題で頼りになる
    • Kaggleマスター
      • 継続中
      • マスターになれるのか!!?

Julia now

Kaggle の Kernel が動いている Julia Docker を最新版にしていく - Qiita

今週のニュース

田中TOMのめざせKaggleMaster #8 初コンペの結果発表

田中TOMのめざせKaggleMaster #8 初コンペの結果発表 - YouTube

Kaggle kkbox 挑戦

kaggle アドベントカレンダー 2017 データサイエンティストを目指すための Kaggle チュートリアル

  • まずは愚直に数字を出してみる
  • そこから数値が良くなるにはを考える

データ処理でやったこと

  • Date系はとりあえず年だけにしてみた
  • 日付情報が入ると数値に直した時に飛び飛びの値になってしまう気がする
  • trainデータのmsno(id)にTransactions Logs Members が全て対応しているわけではない
  • test データに対応する場合は 「transactions logs members」と「transactions members」 と 「transactions」の3種類で学習を行いそれぞれ、予測をしていった
  • データ処理を行ったものはcsvで再び保存しておいて次回から使えるようにしておく

今後の課題

  • ローカルで重めのファイルを動かしながらだとPCが作業できなくなるのでAWS上でメインにしていきたい
  • AWS上で作業するならデータをs3に入れてデータマウントするみたいな仕組みが必要そう。
  • XGBoost と MXNet 使いこなせるようになりたい
  • グラフ化するのが上手くできないところもあり、どこで区切ったりすれば良い結果になるのか判別できない
  • 自分でカラムを作っていく必要がありそう
  • 提出回数制限に無駄に引っかからないために、trainデータを更にtrainとtestに分割してやって手元でテストするのが良さそう

xgboost

1ヶ月ぐらい前から、julia 0.6 に対応し出した。
最近 Xgboost や MXNet をメンテナンスしている dmlc というグループが julia のメンテも積極的にしてくれてるようになってる。特に MXNet は活発に開発が進んでくる Gluon が julia で使えるようになる日も近いかもしれない。

xgboost の クロスバリデーション

News

Amazon Comprehend – 継続的に学習される自然言語処理

AWS EC2 に Julia 開発環境を構築し MXNet.jl でGPU処理したい

Julia Advent Calendar 2017の4日目の記事です。

最近は田中TOMという名前で、データサイエンスコンペティションサイトのKaggleの問題に挑戦するYouTube動画を投稿してます。

田中TOM - YouTube

普段 Julia 言語を使って解析をしていて、AWSでAmazonが公式にサポートしているMXNetをGPU使って処理してみたかったのでチャレンジ。

実は、既に MXNet.jl をAWSで動かして記事にしてました。

AWS の Deep Learning AMI を使って EC2 インスタンス上で 最新のJuliaを動かせるように

けど、この記事を書いた後に使っていた Deep Learning AMI が大幅に変更された。

AWS Deep Learning Conda と Base AMI の利用開始について | Amazon Web Services ブログ

そして、Julia 0.6.1だとインストールが失敗するためPkg.build('MXNet') してビルドして使っていた MXNet.jl も v0.3.0 がリリースされてインストールできるようになったぽい。

なので環境構築を最初からやり直して、AWS上で動かせるようにして、サンプルコードを使ってCPU処理とGPU処理でどれだけ速さが違うのかも確かめてみる。

利用する EC2 環境

  • インスタンスタイプ:  p2.xlarge(GPUを利用するため)
  • AMI: Deep Learning AMI with Conda (Ubuntu) – ami-f0725c95

サーバーへsshログイン

最後の -L オプションを使うことで、サーバーの8888ポートをローカルとしてつかえるので jupyter notebook を使う場合に便利。

$ ssh -i your-key.pem [email protected] -L 8888:localhost:8888

Juliaのインストール

Ubuntuだと最新のJulia 0.6.1 がインストールできないのでビルドする。最初から必要なライブラリ系はだいたい揃ってるみたい。並列処理で make するけど、それでも結構時間かかる。

$ sudo su -
# apt-get update
# apt-get install libpango1.0-0 -y
# add-apt-repository ppa:staticfloat/julia-deps -y
# apt-get update
# cd /usr/local/src
# git clone https://github.com/JuliaLang/julia.git
# cd julia
# git checkout v0.6.1
# echo "JULIA_CPU_TARGET=core2" > Make.user
# make -j 4 julia-deps
# make -j 4
# make install
# ln -s /usr/local/src/julia/julia /usr/local/bin/julia

MXNet.jlのインストール

juliaコマンドで起動してパッケージをインストール。以前はMXNetがインストール失敗してたけど、バージョンアップでインストールできるようになった。

$ julia
> Pkg.add("IJulia")
> Pkg.add("MXNet")

Jupyter notebook でCPUとGPUを比較

jupyter notebook を実行して、MXNet.jl のサンプルコードでMNISTのデータを処理する。先にCPUでやってみて、後半GPU。変更部分は context=mx.gpu(0) の部分。

CPUとGPUの比較結果

CPUだと1epochの処理に100秒かかっているのが、GPUだとなんと1秒に。パネェ。

今回作ったAMI

オハイオで公開しています。

AMI名: deep learning julia mxnet 2017-12-02
AMI ID: ami-0a270e6f