2019年3月11日月曜日

Imbalanced 'test' data

Imbalanced dataset の学習時には、前処理として under/over sampling を使用します。

では、test データはどうするのか?今まで考えてきませんでした。
現実問題への適用を考えると、未調整の test データを使って評価するのが当然なのでしょう。が、メジャークラスを足すほど評価指標は良好な値を示すでしょう。ま、値が上りにくい macro 平均等を使うべきなのでしょうね。

と思いつつ調べてみましたが、なかなか書き物が見当たりませんでした。当たり前すぎるのでしょうか?
調べていると、以下のサイトを見かけました。同じことを疑問に思われる方がいらっしゃったようです。
https://datascience.stackexchange.com/questions/17873/imbalanced-dataset-how-to-deal-with-test-data

どうやら、未調整の test データを使用するのが無難なですね。Average accuracy を勧められていますので、Macro 平均で良いでしょう。
試してみましょう。

****************************************
20190325追記
足せば足すほど、評価指標は落ちました。
マイナークラスを検出しやすいように調整したモデルでは、メジャークラスの誤判定が増えました。


2019年3月3日日曜日

自然言語処理

twitter のつぶやきや位置情報を収集・利用しようとされている方々を見かけます。

災害前後の雑多なつぶやきから、有益な情報を抽出するといった目的でしょう。
そういえば国土交通省さんも利用しようとされていましたね。当時は意外だったのですが、どうなったのでしょうか?http://www.nilim.go.jp/lab/scg/sns/news20140714.pdf

twitter からのスクレイピングには制限があったこと、特に有益な利用法を思いつかなかったことなどから、手を出していませんでした。自然言語処理自体にもあまり興味を持っていませんでした。が、動向も気になるので、少し調べてみました。

案外、簡単でしたね。
日本語なら分かち書き、ベクトル化(Word2Vec:keras.layers.embeddings など)、2D 図化(WordCloud)、3D図化(TensorBoard Embedding Projector)。数値にしてしまえば、あとは通常処理と変わりません。回数をカウントしたり、距離の近接で表現したり。裏で数値化していますので、「King - Man + Woman = Queen」腑に落ちます。案外、面白いかも。

皆さん自然言語処理への関心が高いようで、図化はオンラインでもできるようになっています。進んでいますね。
いくつかサイトを試してみました。環境白書2018の英語版です。


Embedding Projector もオンラインであります。https://projector.tensorflow.org/
3Dプロットが簡単にできます。最近、数値データの主成分分析結果を3次元プロットする機会があったのですが、基本はこれと同じですね。
以前、NHKスペシャルで「健康」等とつながるキーワードの位置関係を3次元表示していましたが、まさにこれでした。当時、どうやって関係性を図化したのか疑問でしたが、やっと理解できました。

自然言語処理、面白そうですね。


2019年2月26日火曜日

XGBoost メモ

XGBoostのメモです。

xgboost.cv
戻り値は evaluation history(リスト)

xgboost.train
戻り値は booster(モデル)

XGBClassifer
Scikit-Learn ラッパー


categorical_crossentropy VS. sparse_categorical_crossentropy
https://jovianlin.io/cat-crossentropy-vs-sparse-cat-crossentropy/
categorical_crossentropy: one-hot encodings
[1,0,0]
[0,1,0]
[0,0,1]
sparse_categorical_crossentropy: integer encodings
1
2
3

2019年2月25日月曜日

機械学習モデルの性能評価指標

機械学習モデルの一般的な評価指標について整理しました。

まずは confusion matrix (混同行列)を作成。
https://phreeqc.blogspot.com/2017/11/deep-learning.html

Error(ERR、誤分類率)
Accuracy(ACC、正解率)=1-ERR
全数を使った指標は imbalance データで注意。

Precision(PRE、適合率、精度)
予測 positive で当たった割合

Recall(REC、再現率)
=True Positive Rate(TPR、真陽性率)
実際 positive で当たった割合

全部 Positive と予測すれば REC 100%、Precision低。
スクリーニングで Rec、詳細調査で Precision の高い手法を組み合わせるとよさそう。


F-measure(F値、F1値(F1-score))
h(PRE, REC)
PRE と REC の調和平均(harmonic mean)
相加平均、相乗平均でなく、なぜ調和平均なのでしょうか?


multi-class の場合も基本は binary と同じです。
macro・・・各クラスの結果を平均
micro・・・各クラスのTP等を集計して算出
各クラスの結果を等価に評価してくれるのがマクロ。良し悪しですが、レアクラスの結果を重視したい場合には良いでしょう。


計量分野を除き、言葉としての「精度」は人によって指す意味の異なる場合があります。英語で言う方が正しく伝わるでしょうね。

2019年2月24日日曜日

だいち防災WEBポータル

Tellus OS Ver.1.0 が公開されました。

Google Earth Engine と同様のコンセプトで作られているようです。
まだデータセットは十分といえませんが。

残念ながら、将来的に公開される ALOS-2 データは画像だけのようです。
DInSAR 等に使えるデータを、というのは難しいようです。すでに商売になっていますから、それを無料で、というのは難しいのでしょう。商売に支障のない範囲での公開。ま、当然でしょう。

では、災害時の緊急観測後の機械学習はだれが担当するのか?

宇宙村の方々のようですね。
だいち防災webで完結しているようです。
村外に住む技術者は、指をくわえて予測結果が出てくるのを待つしかありません。

だいち防災WEBポータル
https://jaxa-dis.maps.arcgis.com/home/index.html
http://www.sapc.jaxa.jp/work/antidisaster/


整備された Tellus 。それでも、何かしら必要になる時が来るかもしれません。
考えてみましょう。

2019年2月17日日曜日

Python3 Jupyter notebook:実行時間、日本語表示

#セル実行時間
%%time

#日本語フォント(matplotlib で inline表示)
#Windows10
fp = FontProperties(fname='C:\WINDOWS\Fonts\HGRGE.TTC', size=11)
#Linux
#https://launchpad.net/takao-fonts
fp = FontProperties(fname='./fonts/TakaoPGothic.ttf', size=11)

Python3 ファイル操作

#tree表示
#Linuxでは sudo apt-get install tree
#dataフォルダ以下をツリー表示
!tree data

#ファイルリスト取得1
import glob

path = './data/**/*.csv'
files = glob.glob(path)
csv_list = pd.Series(files)

#取得したリストをもとに、csv結合
df = pd.DataFrame()
csv_data = []

for csv in csv_list:
    df_temp=pd.read_csv(csv,
                        usecols=[0,5,10],
                        index_col=None,
                        header=0) 
    csv_data.append(df_temp)
df= pd.concat(csv_data)
df=df.reset_index(drop=True)
df

#ファイルリスト取得2
import os

dir = os.path.join('111','222','333')
files = os.listdir(dir)

#データフレームに格納されているパスを使って、
#1行毎にデータコピー
import os
import shutil

for column_name, itm in files.iterrows():
    #文字列型でjoin
    dst = os.path.join(itm[1],itm[0],str(itm[2]))
    src = itm[3]
    if not os.path.exists(dst):
        os.makedirs(dst) #sub_foldersまで作る
    shutil.copy(src,dst)

20210218追記