St_Hakky’s blog

心理学/人事/就活/留学/データサイエンス/バイオインフォマティクス/日頃思ったことについて書きます。

Boosting(ブースティング)について調べたのでまとめる:AdaBoost / Gradient Boosting / XGBoostなど

こんにちは。

最近、アンサンブル学習について勉強しているんですが、この記事ではBoostingについて調べたことを書きます。以下がその他のアンサンブル学習とか全般的な話とかについて書いた記事なので、バギングとか知りたい人は以下の記事をどうぞ。

st-hakky.hatenablog.com

◯Boostingとは

Boostingとは、弱学習器をboostして、そのアルゴリズムよりも強い学習アルゴリズムをつくることです.ブースティングの一般的な考え方は、学習器を連続的に学習させて、より精度が向上するように修正していくことです。

学習した予測器をより良いものにするためには、単純に間違えたものにより注意を払って次の学習を行えばいいと考えられます(以下の図参照)。

f:id:St_Hakky:20170728171209j:plain
引用:Géron, Aurélien. "Hands on Machine Learning with scikit-learn and Tensorflow." (2017).

これが概観ですが、それぞれの手法について見ていくのが良いと思うので、早速見ていこうと思います。ぶっちゃけ、ここでグダグダ外観を説明するよりも、以下の記事を読むほうが良いと思いますので、メモがてら紹介いたします。

○PAC learning(確率的近似学習)

[工事中]

○AdaBoost

長くなったので、次の記事に分けました。

st-hakky.hatenablog.com

○Gradient Boosting / Gradient Tree Boosting

長くなったので、次の記事に分けました。

st-hakky.hatenablog.com

◯LightGBM

[工事中]

■参考文献

[工事中]

DART

[工事中]

■参考文献

[工事中]

◯catboost

[工事中]

Bagging(バギング)について調べたのでまとめた:Out-of-Bag(OOB) / Random Forest / Decision Jungles / Deep Forest(gcForest)

こんにちは。

Kaggleをやるにあたって(というかふつうに勉強したかったのもある)、アンサンブル学習の方法は勉強しておく必要があるようなーと思って、勉強してみました。

他のブースティングやスタッキング、アンサンブル学習全般については以下の記事をどうぞ。

st-hakky.hatenablog.com


それでは、調べた内容についてまとめていきたいと思います。

◯Bagging(バギング)とは

Bagging(バギング)は、bootstrap aggregatingの略です。名前から分かる通り、各学習器に使う学習用データをブースストラップサンプリングによって得て、その学習した学習器を予測に用いて最後アンサンブルするという方法になります。

あんまり区別がされている資料を見かけないんですが、これとよく似た方法にPastingというものもあります。Pastingは、重複有りのランダムなbootstrapとは違い、重複なしでデータをサンプリングして、そのサンプリングしたデータを用いて学習します。

Pastingに比べて、独立な学習をより行えるBaggingのほうがより良い精度を出すことが一般的に言われていますが、実際は交差検証などを行って確認するべきです。

○Hard VotingとSoft Voting

分類タスクの時に、各学習器が予測した結果からどのように最終的な結果を得るか、といった時大きく分けて2つの考え方があります。

一つが、Hard Voting。多数決によって最終的な出力を決める方法です。

もう一つが、Soft Votingで、これは各学習機の中で最も確率を高く予測した結果を用いるという方法です。この方法の性質上、Soft Votingを使う際は、すべての弱学習機がラベルだけではなく確率も出力できる必要があります。

scikit-learnでは、各弱学習器が確率を出力できる分類器であった場合はデフォルトでsoft votingになるようです。便利ですね。

○Out-of-Bag(OOB)

こちらの本を読んでいたら、ブートストラップによって選ばれなかったサンプルは36%くらい存在するようになり、そのデータを使ってテストをすることが可能で、これにより訓練用とテスト用であらかじめデータ・セットを分ける必要がないと書かれていました。

この本は割りと数式が出てこないので、ぱっと読んだ時に「どこからでてきたねんこの36%」と思いました笑。

なので、ちょっと試してみることにしました。

重複有りで、1~100の数字の中からランダムに数字を100個選び、その中で選ばれなかった数字の個数をカウントすることを1000回繰り返して、平均を取ってみます。言語はpythonです。

import numpy as np
result = 0
for _ in range(0, 1000):
  result += len(set(np.arange(1, 101)) - set(np.random.randint(1, 101, 100)))
print(result / 1000)

乱数を生成してやっているので、毎回結果がかわりますが、大体36.7くらいでした。

なんでやねんやろーって思って、記事を探していたら、こちらの記事をみつけました。僕がここで何かを言うまでも無いくらいいい記事だったので、こちらを御覧ください。笑

qiita.com

ネイピア数のところの議論まで読むと、確かになるほど~となりました。

○Random Patches and Random Subspaces

これまではデータセットのサンプルをランダムに抽出することばかりはなしていましたが、特徴量(変数)の方もランダムにサンプリングしようというお話です。

Random Patchesというのが、特徴量もデータセットもそれぞれランダムにサンプリングすることをさし、Random Subspacesというのが、特徴量のみをランダムにサンプリングし、データセットはそのまま使用することを指します。

このようにランダムに特徴量を抽出することで、更に多様な学習器の種類が実現でき、アンサンブル学習がより効果的になることが期待できます。

○ランダムフォレスト(Random Forest)

弱学習器として決定木を用い、バギングしたものが、ランダムフォレストになります。

学習の流れとしては、以下の通り。すごくシンプル。

1. T個の決定木それぞれについて、以下を行う
  i. 学習データ集合からサンプリング(ブートストラップによるサンプリング)
  ii. サンプリングしたデータを用いて決定木の学習
2. すべての決定木の学習が終わったらランダムフォレストの完成

決定木の学習さえわかっていれば(わからない場合はこちらが参考になる)、上のやつはそれをサンプリングしたデータセットを複数個用意して、それぞれ学習させるだけでいいので、理解は難しくない。また、ランダムフォレストは並列処理が可能な構造になっているので、処理も高速になり、また決定木の数が大きくなってもスケールする。

■Feature Importance

一つ一つの決定木を見た時に、根ノードに近い変数ほど重要な変数であり、葉ノードに近いものが重要でない変数である可能性が高い。この性質を利用して、ランダムフォレスト全体で見た時に、各変数が各決定木においてどの程度の深さにあるかの平均値を見ることで、その変数の重要度を見ることができます。

scikit-learnではこれを自動で計算してくれているので、簡単に重要度を取得できる。ランダムフォレストを用いるとこういう情報を取得することができます。

○Deep Forest(gcForest)

ここでうだうだ解説するのもおこがましいくらい良い記事があるので、そっちをみてもらうのが良いかと。

とはいえ、簡単に説明。

最近Deep Learningは流行っていますが、gcForestはそのDeep learningと五角以上の性能を持つ決定木アンサンブル手法です。

Deep learningを自前で組むと嫌というほどわかりますが、どこをどうやってハイパーパラメータ-チューニングすれば良いのかみたいなのが本当にやっかいです。

そんな中で、このgcForestは異なるドメインのデータで適用された場合でも、ほとんど同じハイパーパラメータの設定で優れた性能を出す(らしい)。

また、当然アンサンブルな手法なのでアンサンブル手法特有のメリットである、分散学習が可能な点もあります。そして、決定木の性質もあるので、Deep Learningと違って解釈が容易な点や少ないデータセットでも学習が可能な点もあります。

構造とか色々説明し始めるとそれだけで一つの記事になりそうなので、割愛します笑(個人的には実験結果が若干フェアじゃないんじゃないかな疑惑が、、、笑)。

実装に関しては、Rで実装した人とか、Pythonで実装した人とかがいるらしく、これも参考になるかと思います。

いちいち覚えていられないしもうよく使うMySQLのコマンドとかやることとかをまとめておく

こんにちは。

最近SQLのコマンドとかよくつかうんですけど、たまーーーーーーにつかうものとか、びみょーーーーーに覚えにくいやつとか、いちいち調べていてまじで時間もったいないのでまとめておきます。

まぁ覚えろよってことなんですけど、なんかこの手のコマンド系って覚える気になれないというか、コピペで済むレベルって逆に覚えないっていうか笑(変に複雑なアルゴリズムとかのほうが覚えられるという笑)

ということで以下メモ。

Setup

長くなってきたので以下の記事に移行。

st-hakky.hatenablog.com

Command

○Database

■データベースを一覧で表示したい
show databases;

○Table

■Table一覧を表示したい
show tables;
■Tableの情報を表示したい
describe <table_name>;
■Table内の各カラムの情報を全て表示したい
show FULL COLUMNS from <table_name>;
■Tableを削除したい
DROP TABLE <table_name>, <table_name>,,,;

上のコマンドはが一つでもいい。

■Tableにあるデータをすべて削除したい
TRUNCATE TABLE <table_name>;
■Tableを作成したい
create table <table_name> {
  <column> datatype,
  <column> datatype,
  <column> datatype,
  <column> datatype
};
■Tableの件数を取得したい
select count(<column_name>) from <table_name>;
■重複無しでデータを取得したい
select distinct <column_name> from <table_name>;

○Column

■Column名を変更したい

名前だけ変更する場合でも、きちんと型をしていしないといけません。

ALTER TABLE <table_name> CHANGE <old_col_name> <column_definition>;

これは具体例を示した方がいいと思うので、具体的には、以下の用に書きます。

alter table personal change id userid int;
■Columnを新規で追加したい

カラムを追加する方法は以下の通り。

ALTER TABLE <table_name> ADD <column_name> <column_definition>;

上のコマンドを入力すると、テーブルの一番最後に追加されてしまうので、テーブルの一番最初にcolumnを追加したい場合は以下の通り。

ALTER TABLE <table_name> ADD <column_name> <column_definition> FIRST;

columnを任意のcolumnの後に追加したい場合は以下のコマンド。

ALTER TABLE <table_name> ADD <column_name> <column_definition> AFTER <column_name>;

○主キー

■追加
ALTER TABLE <table_name> ADD PRIMARY KEY <column_name>;
■削除
ALTER TABLE <table_name> DROP PRIMARY KEY;
■追加と削除を一行でやる
ALTER TABLE <table_name> DROP PRIMARY KEY, ADD PRIMARY KEY <column_name>;

○外部キー

[工事中]

文字コード

長くなってきたので以下の記事に移行。

st-hakky.hatenablog.com

その他

st-hakky.hatenablog.com

○その他参考資料

「会う人すべてがあなたのファンになる 一流の魅せ方」という本を読んだ

こんにちは。

最近はぼちぼちいろんな本を読んでいるわけなんですが、一つ一つ印象に残ったところをメモしておかないと全部忘れちゃいますね。ってことで書きます。

◯読んだ本

以下の本を読みました。

◯本の概要と感想

この本は、筆者が議員秘書の経験や選挙活動の支援などを通して得た、「一流の人はどんな風に自分を魅せているか」ということを紹介した本です。

基本的に、本の内容は筆者が女性ということもあり女性に寄って書かれた本でしたが、内容自体は男性が読んでも十分おもしろい内容だと思います。魅せたい自分を固定して、その自分に合うように自分を変えていく。自分がどう見られているかを常に考えて行動する。それらがいくつかの実体験に基づきながらわかりやすく書かれていました。

国会議員はよく言葉尻を捉えられて叩かれていますが、そういえば服装とか髪型とか体型とか、気にしている人は気にしているなぁってわかります。最近はアイドルでもないけど、自分で自分をブランディングして色んな分野で活躍されている人とかもいますし。

ああいうのもSNSとか出ているメディア、使われている写真、全て考えられていて、ふつうの大企業が行っているブランディング戦略と考えられている度合い的には変わらないんじゃないかなと思うくらいです(だから売れているんでしょうけど)。

この本はインターン先の方に紹介されて読んでみるかと思って手に取った本です。まぁ僕は会う人全部に好かれる必要はないわけなので、本全部に共感することはなかったのですが(汗)、この本は中身というよりも考え方とかの方に共感する部分がありました。広報とかは、ターゲットにどう思われるようにするかとか考えるときはまさにこの本の考え方と同じですし。

人事とかでもやっていると、やっぱり印象は大事だなぁと思います。

メールをどんな言葉使いで返すのか、連絡の帰ってくる速度、面接の時のどうやって入ってくるか、服装、言葉遣い。やっぱりかなりその人らしさが現れるもんだなぁと思います。

僕は自分もそんなに立派な格好とか言葉遣いとかできるわけではないので、あんまり気にしませんが、気にする人もいるのも事実なので、対外のやり取りをする職種の人はやっぱり見ます。それも職種によっては能力になるので。

本の内容的には自分で気にすることができる部分もあるように感じましたが、それでもお金に余裕があるなら専属で自分のブランディングを手伝ってくれる人を雇ったり、大きな会社とかは下手に営業のノウハウを伝授するよりも、そういう人をコーチとして雇ってしまったりするほうが良いかなと思いました。

何のために本を読んだんだってなりますが(笑)、まぁそういう感想を抱いてしまうほど、一朝一夕で身につかないなって思いましたし、どこをどう気をつければいいのかとかを考えているうちに相当な長い時間かかってしまうしって感じに思っちゃいました(笑)

2時間位でさーっと読めるので、おすすめです。

それでは。

Julia入門

こんばんは。

最近、そろそろ違うプログラミング言語を勉強したいなぁと思っていて、この夏はC++とJuliaを触りたいなーと。

Web開発はするので、Javascriptとかもガンガン触ることになりそう。2ヶ月でどこまで触れるかって感じですね。

さて、データサイエンス界隈で目にするJuliaですが、正直何かよくわかっていなかったので、上記の背景?もあり、夏休みを機に触ってみることにしました。

◯なぜJuliaなのか

なぜJuliaを使う必要があるのがふつうに気になったので、調べてみました(計算速度が早いとかは知ってたんですがその程度だったので)。Juliaの公式のHPで出ている「Why We Created Julia」という記事がふつうに初期の思想がまとまっていて良かったです。

簡単に何をやりたいか(Juliaの特徴)を説明すると、

  • クソ優秀な言語をオープンソースで作りたかった(RubyのようなダイナミクスとともにCのような速さを持ち、Matlabのような数学的な力も持ちつつ、PythonやRの、、、といったいいとこ取りをした優秀な言語が欲しかった)
  • 処理の大きさに対してスケールし、分散処理も可能な言語を作りたかった
  • 動的型言語でありながらGenericなプログラミングをしても、たとえ色々できても、シンプルでクリーンな言語を作りたかった

つまり、データサイエンスとか計算処理が大きいものに対してもスケールしつつ、人間にも優しくて色々実現できるんだけど、処理が速いみたいな言語を作りたくて、それがJuliaだという話らしいっす(笑)。これから勉強していくのでわかりませんが、とりあえず最強の言語を作りたかったんだなぁとなります。

ちなみにこれまであげた特徴とかはJuliaのHPの冒頭に書かれています

なぜかよくわかりませんが、あんまり僕の周りでJulia使っている人がいない、、、僕の周りだけかしら、、、なんでだろう、、、汗

HPには速度比較の図とかものっていますが、たしかにJuliaはPythonとかと比較しても速いっすね。これから勉強していくので、マジ楽しみになってきました。

◯Juliaの勉強とかするための資料


ドキュメントの多さとかで行くと圧倒的にHomeページから漁ったほうが良さそうです。

日本語でドキュメントを探していくと、JuliaTokyoなるものがあるらしく、そこで「今Juliaを入門するのに良いチュートリアルは?」みたいなissueが立ってました(2年前くらいなので、古いですが)。

そこであったんですが、Juliaのチュートリアルとしては以下が良さそう。

GitHub - bicycle1885/Julia-Tutorial: 高速でJuliaを学ぶチュートリアル

その他にも参考になりそうな資料が沢山。

本家のサイトにを見るのが一番良いのかなぁと思います。

特に「Learning Julia」のところは充実しているので、日本語のドキュメントをさらっと読んでからそっちを一個ずつ読みながら勉強していこうかなと。

◯Juliaのインストー

Juliaのインストールはダウンロードページから出来ます。インストーラーが用意されているので、それを環境に合わせてダウンロードしてインストールで終了。

◯Juliaの初めの一歩

以下のコマンドをいれるだけで、REPLを使うことができます。

julia

REPLはかなり便利ですね。例えば以下のようなこともできます。

  • 「?」と入力すると、関数のドキュメントを参照できます
  • 「;」と入力すると、シェル・コマンドを実行することができます
  • タブ補完もあり、Bashみたいな履歴機能もあります

便利ですね。ipythonとかまでは行かないかもですが、Juliaも十分色々できそうな雰囲気がしてきました。

◯Juno

JuliaのIDEとしてJunoというものがあります。これを使えば結構楽に開発ができそう。

これはAtomから使うみたいですねAtomでJuliaをつかう時に便利そうなパッケージが以下です。

上のuber-junoがメインのパッケージです。linter-juliaは別に入れても入れなくてもどっちでもいいかと(僕は入れていません笑)。

ってことで、ふつうにatomのパッケージにインストールする方法みたく、uber-junoを入れてみました。

f:id:St_Hakky:20170730192335j:plain

僕はAtomユーザーなので、このレイアウトに結構違和感もありましたが、それ以上になんかイカしているなと思ったので特に気になりませんでした(笑)

◯その他参考記事とか

IJuliaとかJulia言語の書き方的なところはまた次回。機械学習の予測とかしていきたい。
それでは。