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追記

Python3 画像操作

import os
#Pillow
from PIL import Image, ImageOps

#変換後の画像データ保存先作成
os.makedirs('./images_converted/', exist_ok=True)
for path in os.listdir('./images'):
    img = Image.open('./images/'+ path)
    img = img.convert('RGB') #RGBに変換
    img = img.convert('L') #グレースケールに変換
    img = ImageOps.invert(img) #ネガポジ変換
    img_resize = img.resize((25,25)) #サイズ変更
    img_resize.save('./images_converted/'+ path)

Python3 データ型

#dataframe 内のデータ型確認
df.dtypes

#型変換
df=df.astype({'111': np.int32,
              '222':np.float32,
              '333':np.int8,})