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) とその比率

今週のニュース