fast.ai version 1.x

fast.aiはバージョン0.7の講義ビデオで勉強している人が多い.(日本語に翻訳されているのは,ほとんどがDLのLesson1で挫折している :-).

fastai 0.7はドキュメントも悪く,講義もだらだらなので敬遠していたが,version 1.x になったらだいぶすっきりした.

SCMで使うのは,定型の表形式データが多いので,それ関係を簡単に紹介する.元はこちら.

表形式データの基本クラスは TabularDataBunch であり,これはfrom_dfメソッドを用いてpandasのデータフレームから作ることができる.

from_df(path, df:DataFrame, dep_var:str, valid_idx:Collection[int], 
procs:Optional[Collection[TabularProc]]=None, cat_names:OptStrList=None,
 cont_names:OptStrList=None, classes:Collection[T_co]=None,
 test_df=None, kwargs) 

主な引数の意味は以下の通り.
path:ファイルの置き場所
df: データフレーム
dep_var: 従属変数の列名
valid_idx: 検証用データのインデックス
proc: 前処理の方法を入れたリスト
cat_names: カテゴリーデータの列名のリスト
cont_names: 連続量データの列名のリスト

前処理には以下のものがある.

Categorify(cat_names:StrList, cont_names:StrList) 

cat_namesに含まれる列をカテゴリー変数とする.

FillMissing(cat_names:StrList, cont_names:StrList, 
fill_strategy:FillStrategy=<FillStrategy.MEDIAN: 1>, 
add_col:bool=True, fill_val:float=0.0


cont_namesに含まれる連続変数に対して欠損値処理を行う.
`FillStrategy`には[MEDIAN, COMMON, CONSTANT]があり,順にメディアン,最頻値,定数(fill_valで指定)である.また,add_colがTrueのときには,欠損値であることを表す列を追加する.

Normalize(cat_names:StrList, cont_names:StrList) 


連続変数の正規化を行う.(平均を引いて標準偏差+微少量で割る.)

他に以下の時刻型の列を自動的に幾つかのカテゴリー変数に変換する関数が準備されている.

add_datepart(df, fldname, drop=True, time=False)


fldnameは時刻型が含まれている列名であり,dropがTrueのとき元の列を削除する.またtimeがTrueのときには,日付だけでなく時,分,秒の列も追加する.

さて,TabularDataBunch クラスのfrom_dfメソッドでDataBunchオブジェクトを作成したら,以下の関数で表形式データの深層学習器を作ることができる.

tabular_learner(data:DataBunch, layers:Collection[int], 
emb_szs:Dict[str, int]=None, metrics=None, ps:Collection[float]=None,
 emb_drop:float=0.0, y_range:OptRange=None, use_bn:bool=True, kwargs)

主な引数の意味は以下の通り.
data: DataBunch
layers: レイヤの数を指定したリスト
emb_szs: カテゴリーデータの列名をキー,埋め込みサイズを値とした辞書
metrics: 評価尺度(accuracyなど)
emb_drop: 埋め込みレイヤのdrop out率

例題:

モジュール読み込み.import * は行儀が悪いが,これが作者の流儀らしい.

from fastai.tabular import * 

untar_dataはfastai.coreにある,データ読み込み関数を用いてデータを読み込む.これは小規模データで$50k以上の収入があるかどうかを当てるのが目的だ.


path = untar_data(URLs.ADULT_SAMPLE)

パスに読み込んだデータが格納されているので,データフレームを生成.


df = pd.read_csv(path/'adult.csv')

前処理の種類を準備.


procs = [FillMissing, Categorify, Normalize]

検証用データのインデックスを準備.


valid_idx = range(len(df)-2000, len(df))

従属変数名とカテゴリー変数が格納されている列リストを準備.


dep_var = '>=50k'
cat_names = ['workclass', 'education', 'marital-status', 'occupation', 'relationship', 'race', 'sex', 'native-country']



DataBunchのインスタンスdataを生成.


data = TabularDataBunch.from_df(path, df, dep_var, 
valid_idx=valid_idx, procs=procs, cat_names=cat_names)

深層学習(PyTorch)の学習器インスタンスlearnを生成し,fitメソッドで訓練.引数はエポック数と学習率.


learn = tabular_learner(data, layers=[200,100], emb_szs={'native-country': 10}, metrics=accuracy)
learn.fit_one_cycle(1, 1e-2)

結果はこんな感じででてくる.


epoch	train_loss    valid_loss   accuracy
1         0.323456    0.313531    0.849000


この記事が気に入ったらサポートをしてみませんか?