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
この記事が気に入ったらサポートをしてみませんか?