半年ぶりの TryHackMe で Advent of Cyber 2023 に挑む 15日目【Advent of Cyber: Day 15】

note に引っ越そうか考え中。テストもかねて note でも投稿しています。

note.com

15日目。

[Day 15] Jingle Bell SPAM: Machine Learning Saves the Day!

What is the key first step in the Machine Learning pipeline?

本文解説にステップごとに説明がある。正解は Data Collection。

Which data preprocessing feature is used to create new features or modify existing ones to improve model performance?

本文解説、Step 2 の表を読めばよい。正解は Feature Engineering(特徴量エンジニアリング)。機械学習モデルの「いい感じ」の特徴量を追加することらしい。

During the data splitting step, 20% of the dataset was split for testing. What is the percentage weightage avg of precision of spam detection?

Split View を開くと Jupyter Notebook が使える状態になっているので、上から順にコードを実行していく。Step 5 で学習モデルの評価が出力されるので、weighted avg の precision を答える。

なお、この出力は本文解説や下の画像の数値とズレる場合があるので、その時は適当に答えてね、とのこと。また、weightage avg は加重平均のことで、下記サイトの画像を見ればわかる(気がする)。そういえば高校数学でもあったようななかったような……

atmarkit.itmedia.co.jp

How many of the test emails are marked as spam?

test_data = pd.read_csv("______") のアンダーバーを test_emails.csv に書き換え実行していき、レポートの出力を見れば spam メールが 3 通ある、ということがわかる。

One of the emails that is detected as spam contains a secret code. What is the code?

出力結果は results_df 変数に入っているが、レポートでは Messages が省略されているので print(['Messages'][n]) という風にコードを書き加えて spam メール判定されたメール内容を見ると答えがわかる。

解説

Step 1 から Step 4 まででモデルの作成(学習)、Step 5 でモデルの精度を出力している。

Step 1

まずはデータを収集する。データがないことには始まらない。Pandas の DataFrame メソッドで扱いやすいデータ構造にしている(変数 df)。

Step 2

Message を適当なベクトルデータに変換する。テキストデータはそのままでは学習に利用できない。適当なメソッドを使うことでテキストデータがいい感じのベクトルデータに変換される。

Step 3

Message カラムの数値を X、対応する Classification カラムの ham / spam を y とした上で、これらを訓練データとテストデータに分ける。

Step 4

Step 3 で作成した訓練データを用いて学習を行う。モデルを指定し(clf = MultinomialNB())、学習する。

これで学習は終了である。完成した識別器(clf)を用いて新たなデータで ham / spam を識別したければ result = clf.predict(下処理したデータ) のようにすれば result 変数に結果が格納される。

感想

前回から随分と時間がたってしまった……休日に寝たきりは気分が落ち込んでよくない。

自分は X が何で y が何かよく混乱するし、そんなだから大学でも機械学習の単位は何回受けても落としてた記憶がある。やっぱり文字や式を追ってるだけだとちょっとわかりづらいよね~って話。だいたいの機械学習の解説って、今回の Step 5 まで説明するけど実際に使うのはそこから戻って Step 4 のものになるから前後関係がごちゃっとしててアレだなぁとよく思う。Step 4 までの全体像をまとめた画像みたいなのも見たことないし。

まぁしかし Python にかかれば適当なライブラリをインポートすればいい感じにデータを処理・学習してくれるメソッドがすぐ使えるから改めて便利だなぁと思った。

ちなみにスパムメールといえば昔、「和田ア〇子のマル秘画像はこちら(以下 URL)」みたいなものが送られてきた思い出がある。