2021年3月15日の記録


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

  • LSTM改良。後輩の書いたインプットデータ追加のコードを修正し、より多くの特徴量を使ってLSTM実施。上手く回った。
  • optunaによるハイパーパラメーターの最適化。思ったよりコードを大きく修正する必要があるかもしれないので、まだ途中。
  • Multi-step forecastingについて。勉強してみたが、既存のコードを修正すると大幅な変更が必要そう。メンターに聞いても「とりあえず1つの変数でやってみよう」と言うだけで手がかりつかめず。

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

  • Multi-step forecastingの実装。抜本的に書き直す方向で検討。

次にやること

  • 既存LSTMモデルのOptunaによるハイパーパラメーター最適化。
  • Multi-step forecastingの実装。

2021年3月8日の記録


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

  • 時系列データ分析のTensorflowのドキュメントを読んだ。今自分が持っているコードよりも洗練されていると思われる。Multi-step forecastingの実装をしたいので、一旦この型に書き換えてみても良いかもしれない。

www.tensorflow.org

  • 昨日から回している機械学習のRunはまだ終わっていない。パラメーター5つに対してそれぞれ4つの値を入れて総当たりしているので、45=1024回走らせる必要があるから当然といえば当然。これで一回傾向が見られれば良い。

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

  • 総当たりはやめた方が良い。最初にやって傾向をつかむには良いかもしれないが。

次にやること

  • Multi-step forecastingの実装。

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の勉強すると言いつつ、しばらくは機械学習モデルのアップデートに時間を使いそう。

2021年3月6日の記録


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

  • ブログの種類の検索
    • Mark Downで書けるBoost Noteはかなり使いやすいが、10文書までしか登録できない。制限を外すには月額3$かかる。ブログというかドキュメント管理アプリ。
    • WordPressは本体無料だがサーバーレンタル必須。これに月額1000円ほどかかる。カスタマイズ性が高いらしい。独自ドメインが使える。CrowdWorksとかでWordPressがどうとかいう依頼もそれなりに見かけるので、経験を積むという意味では投資しても良いかも。
      • 格安レンタルサーバー(さくらサーバー)だと数百円でOKのものもあった。プランの変更ができないと書いてあったが、乗換はできるのか?
    • はてなブログは無料で始められる。Mark Down記法は使えない、と思ったら使えた。とりあえずこれで始めるのが最強か?

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

  • 結局Boost Noteを使っているが、月額料金かかるならWordPressを始めてもいいかも。でもこれにあまり時間をかけたくない。GASの勉強を優先するならはてなブログとりあえず作るか。

次にやること

目標と自己紹介


目標と動機

プログラミング学習をした記録を残しつつ、自分の成果としてどこかにまとめて発表する下地をつくりたい。

自己紹介

簡単な経歴

  • 某国立大学工学部→そのまま大学院へ。専門は環境・エネルギー・資源。
  • 資源系の技術職として日系企業に入社。専門ソフトウェアを使ったプロジェクトベースの仕事がメイン。2年くらい海外赴任してました。現場(海の上とか)での仕事もそれなりに経験させてもらいました。
  • 2年ほど前から出向先でDXの取り組みを重視していたため、プログラミングに本格的に取り組むようになりました。研修に参加したり資格を取得したりしてPython機械学習について学びましたが、実践的な知識を身に着けるため、この記録を開始しました。

プログラミング経験

  • 大学時代にCやC++などのプログラミングやExcel VBAについて学びました。研究では実験がメインだったのであまり使わず。
  • 入社2年目くらいに、あるルールに基づいて複雑な計算をするというニーズが社内に出たときに、Excel VBAを使ってそのプログラムを実装することになりました。セル操作、最適化アルゴリズムの実装、可視化などの勉強になりました。
  • しばらくプログラミングからは離れていましたが、デジタル化やAIが盛り上がってきていたところだったので、2019年頃から勉強を再開しました。Python機械学習ディープラーニング)を実装することを目標にして勉強を開始し、2020年にJDLAのG検定とE資格を取得しました。
  • 「本業にも使える機械学習」を実装すべく、実データに対して機械学習を適用するプロジェクトに取り組んでいます。
  • 副業にも興味が出てきたので、ニーズがありそうなGoogle Apps Scriptの勉強を始めました。