2021年3月7日の記録


今日やったこと、理解したこと

  • 機械学習のモデル比較用関数作成
    • 時系列データの将来予測モデル。気温の変化みたいなデータだと思っていただければよいかと。
    • 以下のコードを作成。fit_and_outputの関数部分にトレーニングデータとテストデータを分けたり、モデルをFitさせたり、フィッティング具合をグラフ化したるする要素が入っている。
    • Nodeの数や参照する過去データのサイズ、バッチサイズ、Early stopping時のpatience(何回変化が起こらなければストップさせるか)、Optimizerをそれぞれ変化させることができる。全部いっぺんに変えて全モデルを作ることもできるけどかなり時間がかかる。
models = []

# layernodes = [8, 16, 32, 64]
layernodes = [8, 16, 32, 64]
# window_lengths = [2, 4, 6, 8]
window_lengths = [2]
# batch_sizes = [8, 16, 32, 64]
batch_sizes = [32]
# patiences = [3, 5, 7, 9]
patiences = [5]
# optimizers = ['adam', 'sgd', 'rmsprop', 'adagrad']
optimizers = ['adam']

for ln in layernodes:
    for win in window_lengths:
        for bs in batch_sizes:
            for p in patiences:
                for opt in optimizers:
                    model = Sequential()
                    model.add(LSTM(ln, input_shape=(win, num_features)))
                    model.add(Dense(1))
                    model.compile(loss='mean_squared_error', optimizer=opt)
                    
                    models.append([model, 0.2, win, bs, p, True, False, opt])

r2_scores = []
for m in models:
    ts = fit_and_output(*m[:7])
    _r2_ave = np.mean(np.array([t['r2_score'] for t in ts]))
    r2_scores.append(_r2_ave)
print(r2_scores)
  • CrowdWorksがらみ

    • VBAで迷路作成
      迷路を生成するVBAプログラムを、サイズ可変な形になるよう修正してほしいというお仕事。迷路の生成は「穴掘り法」にしてほしいということだったが、要するに深さ優先探索のことらしかった。
      面白そうだったので少し触ってみたが、参考にしている元のVBAプログラムがややごちゃっとした書かれ方だった印象なので、そっ閉じした。前にPython深さ優先探索については少し学んだが、その時は結構シンプルに書けたような記憶がある。VBAかつ「罫線で壁を表現」というところで、最初に抱いた感触よりも手ごわそうな印象だったので、やめて正解だったかもしれない。

    • Excel VBAでデータ整理(急募案件)
      比較的簡単そうな案件(入力用csvからデータを読み込んで、指定したデータを検索し、該当するデータセットから得られる情報を整形して出力する)を見つけたので応募しようかと思ったが、VBAは久しく触っていなかったので、リハビリがてら応募せずに試してみることに。実際、思っていたよりも時間がかかった。セルの選択、それを配列に代入、値の検索と、検索結果から得られる配列に格納された情報を読み取って、いい感じにまとめて出力させる。
      こうやって書くと単純なんだけど、「値やの確認方法(ウォッチリストを使う)」「オブジェクトの宣言(Setで値を入れる)」「可変な入力領域からの値の取得(後述)」「関数間の変数の受け渡し(後述)」などなど、学びが多かった。いや、すごい基本的なことなんだけど…。あとPythonの方が100倍楽だと思った。

  • 可変な入力領域からの値の読み取りや書き出し
    最終行を取得するには、Cells(Rows.Count, 1).End(xlUp) を使うと良い。

Function getItemMaster() As Variant
    Sheets("商品マスタ").Select
    getItemMaster = Range(Range("B2"), Cells(Rows.Count, 3).End(xlUp))
End Function
  • 関数間の変数の受け渡し
    戻り値の設定は、関数名に値を代入することでOK。上の例でも、getItemMasterという関数名にRangeを入れているので、この範囲にある値が配列として格納されている。
    ByvalとByrefについて。Byvalは値受け渡し(元の変数を変えない)、Byrefは参照渡し(元の変数ごと変える)。関数の中で値を変える場合や、配列などそもそも1つの値を定義できない場合はByrefで渡す。デフォルトはByref。関数の中で値が変えられてしまうと困る場合はByvalで渡す。

  • Ubound
    Ubound(arr, 1)のように書くと、配列arrに対しての行数を持って来れる。 Ubound(arr, 2) とすると列数。

  • Google Apps Script (GAS) でGmail送信の自動化 某YouTuberの動画を参考に実装。 スプレッドシートに保存した宛先リストの取得、件名・本文の取得、メールの送信(GmailApp.sendEmailを使う)、送信履歴の書き込み、メニューに送信ボタンの追加、などを実装した。

問題点、つまづいたところ

  • 機械学習はOK
  • Excel VBAでの範囲指定は慣れるまで時間がかかりそう。あと配列の要素に対してForループ回すとか、いちいち変数定義しないといけないの面倒くさいと感じてしまった。
  • はてなMarkdownで書いている本ブログ、どうやらコードを書いた後だと箇条書きの設定がリセットされてしまうらしく(?)、思ったようなレベル(インデント)で書けなかった。

次にやること

  • 機械学習モデルは今1点の将来予測しかしてないので、長期にデータを予測するようなモデルに修正したい。
  • GASの勉強すると言いつつ、しばらくは機械学習モデルのアップデートに時間を使いそう。