xgboostが使いたくて
修行編を終えても一向にkaggleのスコアが上がらない。 ランダムフォレストやらSVMやらロジスティック回帰やら いろんなものを使ってみたけど上がらない
こまった。
フォーラムに何か有力情報はないだろうか。 そう思ってフォーラムを見たところ 少なくとも今取り組んでいるコンペではxgboostがいいらしい。
つかってみたい。 藁をも掴む思いで調べた。
これが長い戦いのはじまりだった。
初日
そもそもxgboostってなんだ、なにをやっているんだろう。
簡単に調べたところ弱分類器を複数組み合わせて 強力な分類器を作るということをやっているみたいだ。 ランダムフォレストに似ている気がするなぁというのが第一印象。 ランダムフォレストは弱分類器を決定木にして、それを複数組み合わせて 強力な分類器を作るという理屈じゃなかったろうか。
並列処理をさせるとか、弱分類器同士の優先順位とかその辺りが 違いそうな気はするけど、しらべていたらいつまでも調べて要られそうなきがした。
強いこころで、「まず使ってみる」を優先することにした。 なんてことだ、sklearnにないじゃないか。 インストールは翌日することにした。
二日目
環境構築を第一目標に作業開始。 kaggleのフォーラムをみたら
- ターミナルひらけよ
- gitのリポジトリcloneしろよ
- ビルドしろよ おわり
と書いていた。やってみた。 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環境に入れないと、本来のよさは得られない雰囲気。 また調べものが増えた...
三日目
OpenMPはc/c++環境で動くものらしい。ここで問題が。cなのでコンパイラが必要なんだが どのコンパイラを使うかっていうところがきいてくるようだ。 gccを使えばよいんだろうが、Mavericksからgccがプリインストールされなくなったらしい。 brewで入れてもいいんだけど、プリインストールされていないものを使うのもなぁと思いclangで使うことにする。
なんかよいやつがあるらしいのでこれを使わせてもらう。
cloneして、なかに入ってるスクリプトをうごかす。がめっちゃ警告だされる。
どうやら、clangはちょっとしたことでも警告を出す使用というのをどこかでみた。
このあと、いろいろと頑張ってみたがうまく動かず、(config.mkのここを消せとか、ここも消さないととか)ちょっと面倒になった。
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 !!!
うおおおおおとおもったけど、ソースコード全然読まずになんとなくで消した結果である。
この後何が起こるかさっぱりわかない。まだまだ戦いは続く。
久しぶりに投稿再開
お久しぶりです。といっても、購読者はほとんどいない弊ブログです。
年末年始で本職が何となく忙しくなったり 一年の疲れを休めたりしながらなんとなく 修行編を進めてきました。
やったことは
- パンダ力向上
- グラフ力向上
- SVMとランダムフォレストについての概要把握
- 忘年会、初詣、正月ボケ
です。 なお、自分の環境は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と叩くだけで読み込んだデータを表示してくれます
head とか tailとかも使えます
df.head(100)
これで、先頭から100個のデータ表示です。 特定の列だけ表示させたい場合は
df[['Sepal Length']]
などとかきます。
複数書くこともできます。
df[['Sepal Length','Sepal Width']]
こうやって書くと、2つの列だけ表示で来ます。 なお、[ これが1つ足りない状態だと、表示形式がかわって
df['Sepal Length']
こんな感じになります。 なお、指定するデータ名に半角スペースが入っていなければ (例えばSpecies)下記のように指定することも可能です
df.['Species'] # これは下記と(多分)同値です。 df.Species
あとは、これらの足し算とか掛け算もできます
2. グラフ力向上
matplotlibとかpandas とかのplotを勉強しました (割愛)
3. SVMとランダムフォレストについての概要把握
実際これらが何をやっているのかの概要を把握しました。 SVMはきちんと数学を理解しないといけないので、細かいところは理解してないです。 数式上に現れるガンマと、コストが何を示していて、カーネルってなんなの? っていうところくらいは理解しました。 ランダムフォレストは、決定木をいっぱい作って多数決でどの木がいいかを決定しているとかいう 荒い理解しかしていません。
4. 忘年会、初詣、正月ボケ
いいたいことはたくさんあるんだよ ひとことで言うと、おみくじは大吉でした
こんな感じでした。 いまはkaggleのコンペをのんびり進めています。 全然スコアがあがらず、ベンチマークすら越えられていませんが頑張っていこうと思います
自分でタイタニックのチュートリアルを解く(8)
結局、今の実力ではなかなか実データの解析ができない自分に気づく ネット上にある情報をなぞってみることをやる必要がありそう。
となると、ブログに書く必要あります?的なこともあるわけで。 少々勉強が必要だなと思いましたとさ。
ちょっと今から修行編入ってきます。
自分でタイタニックのチュートリアルを解く(7)
ホームディレクトリとか消すのめんどくさい!そのまま表示しちゃおう。
いらなそうなところを消してみたり
男女比で画像を表示させてみたりした。
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に答えが。
つまり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()
その他よく使いそうな棒グラフ
df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) df2.plot(kind='bar')
df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) df2.plot(kind='bar',stacked=True);
はじめの一歩がわかれば後は公式ドキュメントでどうとでもなりそうなので
ひとまずこういうところ書いていきたい。
自分でタイタニックのチュートリアルを解く(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()
確かに表示される。
中身はなんだろう。
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)."
らしいので、一次元のデータを時系列データに直してくれるモジュールのもよう