kabaohのブログ

仕事ができなすぎて辛いので、趣味に逃げるカバ野郎

xgboostが使いたくて

修行編を終えても一向にkaggleのスコアが上がらない。 ランダムフォレストやらSVMやらロジスティック回帰やら いろんなものを使ってみたけど上がらない

こまった。

フォーラムに何か有力情報はないだろうか。 そう思ってフォーラムを見たところ 少なくとも今取り組んでいるコンペではxgboostがいいらしい。

つかってみたい。 藁をも掴む思いで調べた。

これが長い戦いのはじまりだった。

初日

そもそもxgboostってなんだ、なにをやっているんだろう。

簡単に調べたところ弱分類器を複数組み合わせて 強力な分類器を作るということをやっているみたいだ。 ランダムフォレストに似ている気がするなぁというのが第一印象。 ランダムフォレストは弱分類器を決定木にして、それを複数組み合わせて 強力な分類器を作るという理屈じゃなかったろうか。

並列処理をさせるとか、弱分類器同士の優先順位とかその辺りが 違いそうな気はするけど、しらべていたらいつまでも調べて要られそうなきがした。

強いこころで、「まず使ってみる」を優先することにした。 なんてことだ、sklearnにないじゃないか。 インストールは翌日することにした。

二日目

環境構築を第一目標に作業開始。 kaggleのフォーラムをみたら

  1. ターミナルひらけよ
  2. gitのリポジトリcloneしろよ
  3. ビルドしろよ おわり

と書いていた。やってみた。 gitのリポジトリを cloneするところまでは良さそうだ。 ( フォーラムに書かれていた奴には--recusiveついてなかったが。)

git clone https://github.com/dmlc/xgboost.git --recursive

xgboostというディレクトリができているのでcdで移動 sudo make してビルド。

めっちゃWarningされてる dmlc-core/include/dmlc/omp.h:13:9: warning: Warning: OpenMP is not available, なんちゃらかんちゃら

OpenMPってなんだよ...

OpenMPは、並列コンピューティング環境を利用するために用いられる標準化された基盤。OpenMPは主に共有メモリ型並列計算機で用いられる。





(゜Д゜) ハア??





まぁよくわからんけど、並列処理をさせるのに必要らしい。 OpenMPを俺のMac環境に入れないと、本来のよさは得られない雰囲気。 また調べものが増えた...

三日目

OpenMPc/c++環境で動くものらしい。ここで問題が。cなのでコンパイラが必要なんだが どのコンパイラを使うかっていうところがきいてくるようだ。 gccを使えばよいんだろうが、Mavericksからgccがプリインストールされなくなったらしい。 brewで入れてもいいんだけど、プリインストールされていないものを使うのもなぁと思いclangで使うことにする。

なんかよいやつがあるらしいのでこれを使わせてもらう。 cloneして、なかに入ってるスクリプトをうごかす。がめっちゃ警告だされる。 どうやら、clangはちょっとしたことでも警告を出す使用というのをどこかでみた。
このあと、いろいろと頑張ってみたがうまく動かず、(config.mkのここを消せとか、ここも消さないととか)ちょっと面倒になった。 gccコンパイルすればもしかしてさくっと解決?と思った。

四日目

gccを使おうと思って gcc とターミナルでうったところ

clang: error: no input files

とか言ってきやがった。 clangじゃねぇよ!gcc使いたいんだよ!! 調べて見るとgccがclangのエイリアスに設定されているらしい。

許せん。
bashrcにalias gcc=gcc-5.2.0 を追加
これでどうじゃと、再びgcc -bash: gcc-5.2.0: command not found (ウィンドウを再度開くかbashrcを再度読み込むかするのを忘れちゃあかんで) 期待を込めて、make 同じエラーが出る...。
じゃあやっぱりclangでもええんか..いや、しかし。




ふぅ


clangの情報が溜まってきたのでやっぱりこっちで

再び、奴らの行ってきているmakefile.mkの450行目と451行目を削除する また-static-intelと-no-intel-extensionsがねぇよってうるさいので 1119行目あたりにあるその文言を消す。




make!!!


success !!!


うおおおおおとおもったけど、ソースコード全然読まずになんとなくで消した結果である。 この後何が起こるかさっぱりわかない。まだまだ戦いは続く。

久しぶりに投稿再開

お久しぶりです。といっても、購読者はほとんどいない弊ブログです。

年末年始で本職が何となく忙しくなったり 一年の疲れを休めたりしながらなんとなく 修行編を進めてきました。

やったことは

  1. パンダ力向上
  2. グラフ力向上
  3. SVMとランダムフォレストについての概要把握
  4. 忘年会、初詣、正月ボケ

です。 なお、自分の環境はjupyter notebookです。 DataFrameの表示とかその辺り、Terminalとは 違うところがあるとおもいますがご容赦下さい。

1. パンダ力向上

データ解析するのに、Pythonのpandasがとっても役に立ちます

まず、pandasをimportします 毎回pandasと打つのはだるいので pdという名前で呼び出すことにします

import pandas as pd

これはとても便利。CSVなどの読込をすると かってにDataFrameという形式(?)で読み込んでくれます。 DataFrameという形で読むと、そのあとの操作が簡単になります。

df = pd.read_csv('./iris.csv')

一度読み込むと、dfと叩くだけで読み込んだデータを表示してくれます f:id:kabaoh:20160118103955p:plain


head とか tailとかも使えます

df.head(100)

これで、先頭から100個のデータ表示です。 特定の列だけ表示させたい場合は

df[['Sepal Length']]

などとかきます。


複数書くこともできます。

df[['Sepal Length','Sepal Width']]

こうやって書くと、2つの列だけ表示で来ます。 なお、[ これが1つ足りない状態だと、表示形式がかわって

df['Sepal Length']

f:id:kabaoh:20160118104844p:plain

こんな感じになります。 なお、指定するデータ名に半角スペースが入っていなければ (例えばSpecies)下記のように指定することも可能です

df.['Species']
# これは下記と(多分)同値です。
df.Species

あとは、これらの足し算とか掛け算もできます

2. グラフ力向上

matplotlibとかpandas とかのplotを勉強しました (割愛)

3. SVMとランダムフォレストについての概要把握

実際これらが何をやっているのかの概要を把握しました。 SVMはきちんと数学を理解しないといけないので、細かいところは理解してないです。 数式上に現れるガンマと、コストが何を示していて、カーネルってなんなの? っていうところくらいは理解しました。 ランダムフォレストは、決定木をいっぱい作って多数決でどの木がいいかを決定しているとかいう 荒い理解しかしていません。

4. 忘年会、初詣、正月ボケ

いいたいことはたくさんあるんだよ ひとことで言うと、おみくじは大吉でした

こんな感じでした。 いまはkaggleのコンペをのんびり進めています。 全然スコアがあがらず、ベンチマークすら越えられていませんが頑張っていこうと思います

自分でタイタニックのチュートリアルを解く(8)

結局、今の実力ではなかなか実データの解析ができない自分に気づく ネット上にある情報をなぞってみることをやる必要がありそう。

となると、ブログに書く必要あります?的なこともあるわけで。 少々勉強が必要だなと思いましたとさ。

ちょっと今から修行編入ってきます。

自分でタイタニックのチュートリアルを解く(7)

ホームディレクトリとか消すのめんどくさい!そのまま表示しちゃおう。

f:id:kabaoh:20151205100149p:plain

f:id:kabaoh:20151205095741p:plain

いらなそうなところを消してみたり
男女比で画像を表示させてみたりした。
PyData.Tokyoの公開されてるのと結果同じになってしまった。

ってかグラフのところ、おれのpython力が足りなくて
よくわからなかったのでそのまま引用させていただきました。

というわけで、男女と年齢あたりを特徴量として考えることにしたので
次はこのあたりきちんと分類等々していこうと思う。

自分でタイタニックのチュートリアルを解く(6)

閑話休題
ようやく、実データの解析やっていこうかなって思っている。
まず、データの読み込み。今回は元データはcsvなのでcsvのimportを行う

df=pd.read_csv("データの場所")

で読めるので読み込んでおく。そのあと
dfとかdf.head()とかでちゃんと読み込めてるか確認可能。
Jupyter notebookを使ってると綺麗に表示してくれて嬉しい。

データ見るまでは、解析にCabin番号とかで傾向みれるかなって思ってたけど
NaNのデータが多い。isnull()って関数の説明見ると

"To get the boolean mask where values are nan"

だそうなので、これでNaNの数を数えられて

pd.isnull(df["Cabin"]).sum()

で数を確認したところ687とのこと。
ちょっと多すぎるので却下。年齢は177個の欠損データ。
行けそうな気がするけど、本当にそれでいいのかっていう判断は
ちゃんと統計学とか勉強しないとわからん。とりあえず今回はいいとする。

Cabin邪魔なので、除外!!!

df = df.drop(["Cabin"])

どーん!








だーん!

ValueError                                Traceback (most recent call last)
<ipython-input-66-f7b8e0897ea1> in <module>()
----> 1 df = df.drop(["Cabin"])

/Users/******/anaconda/lib/python3.5/site-packages/pandas/core/generic.py in drop(self, labels, axis, level, inplace, errors)
   1615                 new_axis = axis.drop(labels, level=level, errors=errors)
   1616             else:
-> 1617                 new_axis = axis.drop(labels, errors=errors)
   1618             dropped = self.reindex(**{axis_name: new_axis})
   1619             try:

/Users/******/anaconda/lib/python3.5/site-packages/pandas/core/index.py in drop(self, labels, errors)
   2801         if mask.any():
   2802             if errors != 'ignore':
-> 2803                 raise ValueError('labels %s not contained in axis' % labels[mask])
   2804             indexer = indexer[~mask]
   2805         return self.delete(indexer)

ValueError: labels ['Cabin'] not contained in axis


...あれ?





axisとか言うの指定する必要ある?
っていうことで再度挑戦

df = df.drop(["Cabin"],axis=1)

どーん











大丈夫そう。これaxis=2とかならどうなるのかしらとおもい

df = df.drop(["Cabin"],axis=2)

どーん







だーん
ValueError: No axis named 2 for object type





ぐぬぬ
axisって何を与えられるのかしら?っておもったら
Stack-Overflowに答えが。

stackoverflow.com

つまりrow=0,column=1とのこと。ふむふむ。

まだ解析進められていないが、とりあえずこんな感じでちまちま進めていきます。

自分でタイタニックのチュートリアルを解く(5-2)

まだ描画のつづき

cumsumがなかった場合

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts.plot()

f:id:kabaoh:20151205042356p:plain

その他よく使いそうな棒グラフ

df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2.plot(kind='bar')

f:id:kabaoh:20151205042459p:plain

df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2.plot(kind='bar',stacked=True);

f:id:kabaoh:20151205042605p:plain

はじめの一歩がわかれば後は公式ドキュメントでどうとでもなりそうなので
ひとまずこういうところ書いていきたい。

自分でタイタニックのチュートリアルを解く(5)

前回と今回はtoolの使い方の勉強。
世の中にあふれる技術ブログたちは、参考になるんだけど
エントリの内容がスマート過ぎて参考にならないことも多々。
このブログは備忘録代わりだし泥臭いところから。

まずチュートリアルを解くあたって、どこかデータに着目しないといけないと考えた。
そしてそれを決定するにはやはり見やすいグラフが一番助けになると。

ではグラフを表示させるにはどんなやり方があるのだろうか。
パーセプトロンのところでも使ったけれど、やっぱりmatplotlibを使うのが一番良さそうだ。
どこかで書くつもりのpandasの公式ドキュメントのVisualizationが良さそうだったのでそこを参考に

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
ts.plot()

f:id:kabaoh:20151204231153p:plain

確かに表示される。
中身はなんだろう。

np.random.randn(1000)はどうやら1000個のランダムデータをarray形式で作成する関数。
np.random.randn(10)を実行した結果

array([-1.56413419, -1.05268384, -0.72886754,  0.48600949,  1.0781502 ,
        0.24644173, -0.00739214, -1.43059049, -0.77819694,  1.57174671])

となった。なるほど。
indexはx軸に表示されている日付のあたりを設定しているんだろう。
df.cumsum()は累積和。
ではSeriesってなんだろ...

"class pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
One-dimensional ndarray with axis labels (including time series)."

らしいので、一次元のデータを時系列データに直してくれるモジュールのもよう