2020年4月29日水曜日

CatBoost Encoder

CatBoost
https://papers.nips.cc/paper/7898-catboost-unbiased-boosting-with-categorical-features.pdf

最初は何を言っているのかわかりませんでした。勘違いしていたのですが、これ、GBDT の一つなのですね。知りませんでした。
https://catboost.ai/docs/concepts/algorithm-main-stages_cat-to-numberic.html

でも、Encoder として見ると単純。文献やサイトの数式は難しそうに見えますが、少量ならEXCELでも再現できるレベルです。


Category Encoders では、Pが平均値として実装されています。オリジナルとは若干異なっています。

リークへの配慮が良く分かる実装です。


2020年4月20日月曜日

Target Encoder

Target Encoder が効くという話を以前から聞いておりました。

単純な手法では平均を取るだけなので簡単なように見えるのですが、リークしないように少数カテゴリに配慮したり、k-fold したりしようとすると、ゴリっと書く気は失せます。
training データで fit, test データで transform が必要になるでしょうから、ライブラリがあるでしょうと。

探してみると、ありますね。
H2O は理想的。スムージングも備えています。と思いきや、サポートは Python 3.6まで。今更、仮想環境を構築し直して動かないライブラリが出てきたら困ります。
Driverless AI はこのような機能を備えているのでしょうね。いいなあ。

Category Encoders も多くの Target Encoder を備えています。
https://contrib.scikit-learn.org/categorical-encoding/
リークの面では CatBoost Encoder が良いと聞きますが、少量のサンプルを含むカテゴリには向かないでしょう。
平均をとる Target Encoder では ’minimum samples to take category average into account.’ やスムージングにを備えていますね。
どの手法も fit, transform で実装も楽でした。これにしましょう。

地質特性を変換してみましたが、これ、楽ですね。
どのようなカテゴリでも自由に変換できますので、事前に集約する必要がありません。
経験すると、プチパラダイムシフト。解釈性を保つために追うのが大変になりましたが。

one-hot と異なり、カラム数を増やさない taget encoding。これで性能が上がるなら、使わない手はないでしょう。

********************************
20200421追記

Category Encoders の CatBoost Encoder では seed 値を指定するところが見当たりません。encode の度に結果が変わるので却下。
Target Encoder では、想像よりもかなり過学習が進みます。XGBoost に4000以上の特徴量を投げつけたのですが、きっちりリークを見つけてきます。CV の Varidation でAUC=0.99、TESTでAUC=0.87。
Kaggle 本に書かれているように、CV 時に encode を入れるべきなのでしょう。
https://phreeqc.blogspot.com/2020/01/blog-post.html

20200422追記
random_state で固定できました。

特徴量生成

先日、H2O.ai の Webinar に参加しました。

Driverless AI を使った異常のある製品を予測するデモでした。かなりの imbalance データにもかかわらず、そこそこの成績を収めていました。

特に印象に残ったのが特徴量生成。自動で特徴量を作成し、フルイにかけてから学習を行う。しかもモデルのデプロイまで可能。新しいデータが来てもそのまま入れられるなんて素晴らしい。こういうのを見ると使いたくなりますね。

デプロイはともかく、特徴量生成は Kaggle でも一般化しているようです。以下の解説でも触れられています。
https://www.youtube.com/watch?v=RKXUEJVJJ-o

Python でお手軽に実装しようとすると、Featuretools でしょうか。
https://www.featuretools.com/

この休みの間に、手元にあった200近い特徴量を有するデータに対し、Featuretools で四則演算をかけてみました。が、メモリーオーバー。
ゴミを除いて45にしてから四則演算をかけると5000弱。40万行程度でしたが、i5-8600 で7分程度でした。学習時間を考えると、再度絞らないといけないかな?

特徴量生成は結果として解釈性を下げることにつながりやすいので、説明責任のある方々にとって受け入れ難いという点は理解しています。が、劇的に精度が上がればブラックボックスモデルでも受け入れられるでしょう。

高価なツールを併用する、プロのアドバイスを受けるなど、先端技術の利用は精度向上に必須です。少なくとも、現在の状況を知っておく必要があるでしょうね。
遅れないようにしないと。


2020年4月19日日曜日

テレワーク

全国的に緊急事態宣言が出されました。

私の勤めている会社も全社的にテレワークになるのかと思いきや、そうはなりませんでした。モノもヒトもイロイロと対応できないようです。

個人レベルでは深夜、土日も気にせず、必要な時に自主テレワークをしているので、普段と変わった点はないですね。ハード、ソフトも足りていますし、最近の仕事内容もテレワーク向きです。このような事態の中で予想される障害にも対応済みですので、今のところ問題は生じていません。

生活面でも、まだ想定内。
マスクの件もリカバリーできたのですが、今後のシナリオをいくつか考えると、まだ色々と準備が必要です。今年もどこかで災害が重なるのは目に見えていますので、今のうちに備えを見直しておきましょう。
そういえばTV番組で見かけましたが、避難施設を運営される方々は、今年は特に準備が必要になるでしょうね。

「将来のリスクに備え、準備・対応しておく。」これ、数年前の総監のテーマでしたね。まだリスク管理や危機管理に失敗していない分野では、将来「あのときはコロナによって大変だった」ではなく、「事前準備により大きな問題は回避できた」と言い切りたいところです。

***********************
20200421追記

以下の記事を見ました。厳しい意見ですが、イロイロ腑に落ちるところもありました。

PRESIDENT Online 20200420
「とりあえず通勤してくれ」コロナ時代には通用しないダメ上司3タイプ
口癖は「規則だから仕方ない」 https://president.jp/articles/-/34646
ところが、コロナ災禍への対応はこの種の調整能力をほとんど必要としない。方針を決めることが最重要で、調整は二の次である。求められるのは、ガイドラインなしにリスクをとりながら急激に変化する場面に際して意思決定し対応していく能力である。調整ではない。調整を主とするととてつもなく時間がかかる。全体にとって極めて不利益な事態が発生する。
本来は「リスクをとりながら」といった危機に陥らないための監理能力が必要です。が、監理技術を学んでいない集団では容易に上記のような危機に容易に陥るのでしょう。


2020年4月11日土曜日

仮説検定 用語と手順

上田拓治「44の例題で学ぶ 統計的 検定と推定の解き方」より(一部、変更しています)。

両側検定
・AとBに違いがあるか?など。
片側検定
・AはBより大きいか?多いか?など。


H0:帰無仮説
・差はない
・検定統計量の実現値pが棄却域内(有意水準(例えば5%)未満)でH0棄却、棄却域外でH0採択。
※H0棄却時の誤り(第1種の誤り)を犯す確率は5%未満(有意水準)。
・H0を棄却するとき(H1を採択するとき)は「差がある」。
・H0を採択するときは「差があるとは言えない」という表現にとどめる。どちらが正しいかは不明。
H1:対立仮設
・差がある


パラメトリック検定
・母集団の分布型を決める母数(平均、分散、標準偏差など)について仮定を設ける検定法
・平均値の差、分散・分散比の検定など。
ノンパラメトリック検定
・仮定を置かない検定法
・比率(binary)の差、適合度、独立性、順位の検定など。


仮説検定の手順
1.帰無仮説H0の設定(差はない、棄却が前提)
2.対立仮設H1の設定(差がある、採択が前提)
3.条件(基本統計量、サンプルサイズ、検定目的)の確認
4.条件にあった検定手法の選定
5.検定統計量T、検定統計量の実現値pと有意水準α、棄却域Rの比較
6.結論

母集団の分布

上田拓治「44の例題で学ぶ 統計的 検定と推定の解き方」より

まずは分布の関係から。
それぞれ何かの頭文字を取っていると思うのですが、まったくわかりません。Fだけ大文字の理由も。

z分布(標準正規分布)
・平均0
・分散1
・標準化に使用。
・σが既知、もしくは未知でも大標本(100以上)の時の母平均の検定や推定に用いられる。
※ラプラスの中心極限定理:正規分布にかかわらず、nが大きな場合はほぼ正規分布とみなしてよいという定理。
※大数の法則:多くの事象が集まるとそこに法則性が見えてくることを意味する。
→標本平均と母平均の差がεを超える確率はnを十分に大きくとると0に近づく。

t分布
・平均0
・分散は自由度fが小さい場合にz分布に比べ広がる。サンプル数100以上でz分布とほぼ一致(無限大で一致)
・σが未知かつ小標本(100未満)の検定や推定に用いられる。

χ2分布
・z分布に従う確率変数の2乗
・母分散の検定や推定、適合性や独立性の検定に用いられる。

F分布
・2種類の分散比から成り立つ分布
・母分散の比の検定や推定に応用される。
・F値は1以上なので、分散の大きい方を分子として検定統計量を計算する。
・2群の差異を検定したい場合、結果が等分散の場合はt検定、非等分散の場合はウェルチt検定に続く。

2020年4月5日日曜日

マスク

使い捨てマスクが底をつきました。

今後、御客様との打合せはTV会議主体になるのですが、複数人集まる側ではマスク着用が必須です。
と言いながら、どのドラッグストアでも在庫はありません。
他業種さんの話だと、特に接客業ではマスク着用が義務付けられているものの、会社からは配られない、あるい配布回数が減少ということで、使い捨てマスクを洗ったり、煮沸消毒したりして使いまわしなどを試みられているようです。皆さん苦労されています。

会社の在庫にも限りがあります。それなら材料があるうちに作っておこうと思い立ちました。
で、土曜になってミシンを出してみると案の定、動きが悪い。長く使っていなかったので油が固まっているのか切れているのか。分解できなかったのでメンテナンスに出しました。

翌日の朝には調整が終わり、材料を購入。型紙をネットから落とし、昼から作成開始。
試作品含め4枚作りましたが、最後にようやくミスなくできました。
表を藤色にしたのがいい感じ。立体マスクにしたこともあり、給食マスクみたいにはならず違和感ありません。
試しにノーズフィットワイヤーあり、なしの両方を作ってみました。耐久性を見たいと思います。

マスクの効果については議論があるようですが、個人的には着用すべきと考えています。無症状だと自分がウイルスを保有しているのかどうかわかりませんからね。
ただ、このまま夏に向かっても皆が着用か?となるとそうはならないでしょう。減るでしょうね。あと1、2か月でしない方が増えるでしょう。これは仕方ないと思うところもあります。
効果の有無は別として、車のように除菌剤を混入させるような空調が流行るのでしょうか?裏がパイル地のマスクでも作りましょうか?

まだまだ初期の段階。これからです。
皆で気を付け続けたいですね。

**********************************
20200419追記
デニム調の薄いブルー、麻入りのホワイトを加え、3色になりました。
いくつか異なるサイズも作ってみました。


鱗文様の生地を購入。マスクには文様が大きく、切るのももったいなく、そのまま寝かせています。


近所の手芸店ではWガーゼやゴムが品切れ状態。他店や通販では残っていますので、もう少し買っておきましょうか。それとも、配られるマスクのサイズが合わなければ解体しましょうか。

**********************************
20200517追記
西村大臣風マスクが人気のようで、作り方が複数 UP されていました。
これだと文様が綺麗に入りそうです。


作ってみると予想通り。顎、(写っていない)鼻の部分も文様が途切れず、理想的。
型紙いらず、縫うのも簡単。こちらの方が楽でした。

2020年4月1日水曜日

モンテカルロ積分

Monte Carlo 積分は乱数を利用して積分を近似する手法です。

「Rによるモンテカルロ法入門」によれば、古典的な「大数の法則」の応用と、重点サンプリングが紹介されています。
前者のもっとも単純な考え方は、「経験平均」を取ること。例えば、確率密度関数から乱数を用いて確率密度を求め、その平均値(高さ)×積分区間(1次元なら長さ、2次元なら面積)で確率(面積や体積)を求める手法です。
数式を変形すれば区間a~bをn区分した際に個々の値を積分するのと同じ形です。

わかりやすいサイト↓
https://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/monte-carlo-methods-in-practice/monte-carlo-integration


で、実施。

ある規則に従った乱数を用意し、

2D KDE をかけて確率密度関数に変換。
さらに81*81のグリッド化してコンター表示。

これを scipy.integrate.nquad で積分すると、
答え:0.9999259355414779
中身は Fortran library の QUADPACK。 21点 Gauss-Kronrod 求積法らしいのですが(by Wikipedia)、遅い。15分かかりました。


これを 81*81=6561データで MC 積分。
答え:0.9754075714917496
甘い。


乱数で x,y を1万データ用意。同様に MC 積分。
答え:0.996469877448263
何度か試しても同程度でした。OKです。
時間は30秒。


6561データを分割。
MC 積分結果は 0.47001458203258695 + 0.505311481041339 = 0.9753 でした。6561データ全体の積分結果とあっています。データを増やすことで精度よく計算可能でしょう。



MC 積分は単純かつコーディングが用意。使えます。