2017年11月20日月曜日

autoencoder

H2O Flow で行き詰っていた autoencoder。

データ個々の MSE を見てみたいと思い、Python で実装しました。
関連ライブラリを入れて、マニュや GitHub のサンプルコードをコピペし、修正するだけ。こちらも便利な世の中になりました。

で、計算!

が、いつも通り、うまくいきません。
OK のみのデータでモデルを作り、NGを含んだデータで検証してみたのですが、reconstructin.mse の値のばらつきは OK も NG も同じ傾向。

そもそも、属性が異常であれば(雨の量が多ければ)、それなりに異常な結果を返す(崩壊する)というのは正常なモデルなのかもしれません。属性が同じなのに(雨が少ないのに)結果が異なる(崩壊する)というのが異常であり、そのような場合に autoencoder の威力が発揮されるのではないかな?と考えるようになりました。

このあたり、もう少し理解が必要です。

2017年11月15日水曜日

無駄のあるマニュアル

先日、土質試験のプロと話をする機会がありました。

仕事の内容からだんだんそれて、ある分野の土質試験の仕様についての話題になりました。大学の先生方が作成されたマニュアルに従って仕様が記されており、マニアックな内容になっています。
で、その仕様内の「無駄な試験」についてプロが語ってくれました。

話を聞くと「なるほど」と思うことばかり。
私はその分野の仕事を数年実施していなかったため、最近の仕様を知らなかったのですが、もし仕事としてその仕様を示されると、そのまま実施していたと思います。仕様の理屈は理解できましたので。おそらく、マニュアルの改善点まで提案できなかったでしょうね。

プロによれば、そのマニュアルの無駄に気付かれた方はほとんどいらっしゃらないそうです(過去に1名だけいらっしゃったそうです)。私はその他大勢。
まだまだ努力が必要です。


2017年11月13日月曜日

SNAPHU 動きました

エラーで止まっていたSNAPHU。
https://phreeqc.blogspot.jp/2017/10/snaphu.html

#0  0x00007f5778318694 in _IO_vfprintf_internal (s=<optimized out>,
    format=<optimized out>, ap=ap@entry=0x7ffe286718b8) at vfprintf.c:1635
1635    process_string_arg (((struct printf_spec *) NULL));

あらためて動かしてみます。

snaphu v1.4.2
27 parameters input from file snaphu.conf (84 lines total)
Logging run-time parameters to file snaphu.log
Segmentation fault

ここで「Segmentation fault SNAPHU」で googling。で、即判明。
https://yunjunz.com/2015/02/10/doris-9-segmentation-fault-error-in-snaphu/

src/snaphu_io.c の include <sys/time.h> を <time.h>に変えるだけでした。

今回は make install も止まらず。
実行してもエラーは出ません。23時間で完走です。SNAPHU 動きました。
古いPCなので時間がかかりましたが、ま、良いでしょう。

が、結果はイマイチでした。orz

2017年11月12日日曜日

AI と土木

先日、災害科学研究所「AIの土木分野への応用」講習会に行ってきました。

残念ながら、「応用」ではなく、過去からの移行段階や「応用」するための研究段階の話でした。しかも AI といった広範囲の話ではなく、機械学習とか統計の範疇。大勢の方が「AI」の実務への「応用」を期待され聞きに来られたと思いますが、まだまだこれからのようです。ソフトウェアベンダーも来られていましたので、CIM 収束の次は AI での売り上げを狙われているのかもしれません。

それでも、いくつか興味を惹かれる話題がありました。
・Deep Learning で過学習を軽減するための2つの手法「Dropout」「ReLU」
・不飽和浸透流のパラメータを粒子フィルタで決定
・NN → SVM → Random Forest → Deeep Learning の順で精度向上してきた
・評価にF尺度を用いた


最近は実務でも ETC 2.0 プローブデータを用いた分析が進められています。これ、センサーの発達と普及、データの収集方法(ネット環境)の整備、PCの64bit 化や GPGPU 環境の整備、ソフト等の開発などが背景にあったのでしょう。ようやくビッグデータを扱える環境が整ったということです。
それに応ずべく、人間側でも「データサイエンティスト」なるプロが大学で育成されるようになりました(メンタリストみたいなおおざっぱな響きですが)。
ビッグデータ解析や機械学習のパッケージ化に伴い、今後、その職業や言葉が存続するかどうかはわかりません。が、基礎力を持ったプロの需要は今後も存続するでしょう。

統計なのか機械学習なのか、AIなのかはわかりませんが、手法の原理を理解し、いくつかの適切な手法を組み合わせてビッグデータから瞬時に有用な要因を見出す能力を備えることは必須です。「応用」には注意を払っておきましょう。

データマイニング

以下の図書を読んでみました。
「誰でもわかる 医療データマイニング -ビッグデータの活用-」SPP出版2014

こちらは決定木を利用したルール抽出のお話がメイン。医療分野での応用例が多く掲載されています。2014年ですから深層学習が流行る前ですね。このころは「データマイニング」という言葉が流行っていたのでしょうか?
決定木を採用された最大の理由は、DNN でブラックボックスをなる判別の根拠を明確にすることでしょう。根拠が明確になるので Evidence-Based Medicine に有用です。

決定木も機械学習に入るのかわかりませんが、random forest は H2O に入っています(木がいっぱいなので森)。決定木は R でも Python でも可。
個人的に R でできることは統計的手法だと思っていたのですが、そうでもないようですね。どこまでが統計で、どこから機械学習なのか、あるいはどこまで行くと AI と呼ぶべきなのかわからなくなりました。

とりあえず H2O で random forest  を試しましたが、結果はそれほど向上せず。当然、If-then ルールも出ません。
If-then ルールを明確にするには、R か Python で決定木を使えば良いでしょう。

で、今回は簡単そうな R を選択。
が、最初からエラー。手元の図書が古く、現在、mvpart は CRAN から外れてしまったようです。
Warning message:
package ‘mvpart’ is not available (for R version 3.3.2) 
素直にrpart を使用。題材はシンプルな泥質岩のみの土砂・軟岩・硬岩区分データに変更。読み込みは MSVS の R Tools を使用。読み込んだデータが RockClass。Class以外の属性データを全て分析に使用する場合は、2行目のシンプルな書式でOK。
library(rpart)
model = rpart(Class ~ ., data = RockClass) # 計算
plot(model) # 決定木の線を図化
text(model) #決定木の文字追加
あっけないほど簡単。4行で図化までできます。一瞬です。が、rpart の図だと見にくい。
で、rpart.plot を使用。オプションが豊富です。個人的には If-then ルールを作りやすそうな type0 のみでOK。
http://www.milbo.org/rpart-plot/prp.pdf
library(rpart.plot)
rpart.plot(model, type = 0)
今回の場合、以下の4点で判別が可能でした。
1.クッラクとして判別できるか否かで岩と土砂を区分
2.岩のうち、風化の進んだものを軟岩Iに区分
3.残りの中でコア長カテゴリーが3以下であれば中硬岩
4.残ったものを軟岩II

個人的には複雑な判別だと思っていた土軟硬区分ですが、案外、シンプルな判断をしているようです(単一地質故?)。第三者に対して説明する必要が出てきた場合や新人にポイントを教える場合に使えそうですね。ナレッジマネジメントにも利用できそうです。

気をよくして崩壊・非崩壊に題材を変更。
が、結果はダメ。
それでも、判別に重要な属性抽出といった意味ではラフセットに通ずるものがあり、理解の一助になりそうです。



Imbalanced Data その2

Auto-Encoder については結局改善せず(わからず)。まだまだ基礎力が足りません。

imbalanced data については過去に研究がなされてきたようで、web上でも多くの情報が引っ掛かりました。例えば↓
https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/

H2O FLOW でも、以下のオプションがありました(見落としていました)。

balance_classes : on
class_sampling_factors : 1,3
shuffle_training_data : on

Activation function : Maxout with Dropout
input_dropout_ratio : 0.2

これを使うと、元データを操作しなくてよくなります。

が、 これを使っても training に比べ validation の結果が見劣ります。やはり、過学習でしょう。 class_sampling_factors を 1,2 や 0.3,1 などと試してみましたが、どれも同じ傾向です。活性化関数に Dropout をつけてもダメ。改善しません。

弱りました。imbalanced data への対策を行いつつ、deep learning から離れた方が良いのでしょうか?





2017年11月8日水曜日

Imbalanced Data

偏りの極端なデータセットを扱わざるを得ないという状況は頻繁にあるようで、対応策も研究されているようです。

H2Oの場合、FAQ に掲載されていました。
http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/deep-learning.html
・How does class balancing work?
The max_after_balance_size parameter defines the maximum size of the over-sampled dataset. For example, if max_after_balance_size = 3, the over-sampled dataset will not be greater than three times the size of the original dataset.
For example, if you have five classes with priors of 90%, 2.5%, 2.5%, and 2.5% (out of a total of one million rows) and you oversample to obtain a class balance using balance_classes = T, the result is all four minor classes are oversampled by forty times and the total dataset will be 4.5 times as large as the original dataset (900,000 rows of each class). If max_after_balance_size = 3, all five balance classes are reduced by 3/5 resulting in 600,000 rows each (three million total).
To specify the per-class over- or under-sampling factors, use class_sampling_factors. In the previous example, the default behavior with balance_classes is equivalent to c(1,40,40,40,40), while when max_after_balance\size = 3, the results would be c(3/5,40*3/5,40*3/5,40*3/5).

H2O の FLOW では、そのオプションを見つけらませんでした。R か Python に移行しないといけない?と思いつつ、CSV の段階でマイナーデータの数を増やしてみました。単純に、コピペで崩壊したデータを非崩壊と同じ数まで増やすだけ。学習・検証させた結果は以下の通り。


うーん、ダメですね。過学習というべきなのでしょうか?
一見、高精度の判別器に見えますが、繰り返し入力された異常パターンを覚えすぎ、汎用性を喪失している可能性大。こうなると、既知の異常パターンにしか対応できなくなります。異常検出型でなく、正常から外れた場合に異常と判断する判別器に育てる方針の方が有利でしょう。

まさに、そのような方法も検討されているようです。
https://www.gputechconf.jp/assets/files/1029.pdf
AutoEncoder:固定長、または正規化可能な可変長データで、正常が圧倒的に多く、異常が少ない場合。正常なパター ンのみを学習し、正常なパターンを再現可能な特徴量を抽出する。異常なパターンが入力された場合、異常パターンの特徴量 は学習していないため、異常パターンを再現することができない。再現されたデータの類似度で異常判定を行う。
deep なのか shallow なのか分かりません。が、H2O でも deep learning のオプションに「Auto-Encoder」がありました。R や Python のコードも googling に出てきます。
が、使い方がわかりません。いえ、使っても、良い答えになりません。使い方を見極めていないため、宝の持ち腐れ、猫に小判状態です。うーん、どこにヒントがあるのでしょう?