paint-brush
キーストロークのダイナミクス — ユーザーの予測 — Lambda アプリ@tudoracheabogdan
441 測定値
441 測定値

キーストロークのダイナミクス — ユーザーの予測 — Lambda アプリ

Bogdan Tudorache8m2023/10/22
Read on Terminal Reader

長すぎる; 読むには

この記事では、ユーザー識別のための行動生体認証の形式としてのキーストローク ダイナミクスの使用について詳しく説明します。この記事では、機械学習モデルを利用することで、各個人の固有のタイピング スタイル、特にキーを押すイベントとキーを離すイベントのパターンを本人確認にどのように利用できるかを調査しています。 これらの機械学習モデルを実際のシナリオでユーザー認証と予測にどのように適用できるかを学びます。
featured image - キーストロークのダイナミクス — ユーザーの予測 — Lambda アプリ
Bogdan Tudorache HackerNoon profile picture
0-item
1-item
2-item

この記事のユーザー認識の機械学習モデルで使用されるキーストロークのダイナミクスは、行動生体認証です。キーストローク ダイナミクスは、各人が入力する独特の方法を使用して自分の身元を確認します。これは、コンピュータのキーボードのキーストロークを構成する、キーを押すときとキーを離すときの 2 つのキーストローク イベントを分析して入力パターンを抽出することによって実現されます。この記事では、これらの ML モデルを実際の状況でユーザーを予測するためにどのように使用できるかを検討します。


前回の記事では、同じテキストを 12 回書くように依頼された 100 人のユーザーからの 880 以上のキーボード入力のセットで 3 つの ML モデルをトレーニングする方法について説明しました。


実際の状況をシミュレートするために使用するアプリ。

実際の生活状況をシミュレートする


建築学、建築物、建築様式

サンドボックス: 実際のシナリオをテストするために使用します。郵便屋さん+フラスコ


Production : このアプリケーションを実稼働環境に移行したい場合は、Flask コードのビットを、 AWSラムダ


Flask は、Lambda + API Gateway を複製するために使用できる Web フレームワークです。


Lambda は AWS でホストされるサーバーレス Web サービスで、さまざまな言語で記述されたイベント駆動型のコードを実行できますが、このアプリでは Python を使用します。


データフローは次のとおりです。

  1. ヘッダーに識別データと使用したいモデルをロードします。これは基本的にJSON ペイロードです。ヘッダーには認証キーも追加します (製品のみ)
  2. Flask App/API Gatewayに対してHTTP POSTメソッドリクエストを行います。
  3. API Gateway は認証キー (API キー) をチェックし、リクエストを受け入れると、処理のためにペイロードをLambda に送信します。
  4. FlaskApp/Lambda は基礎となるコードを実行します
  5. イベントが成功した場合、戻りの本文で取得されるのは予測されたユーザーの ID であり、そうでない場合はエラー メッセージが表示されます。


HiglLevel の概要


アーキテクチャとデータフローの概要


前述したように、すべてのコードは Github プロジェクト ページで見つけることができます。

https://github.com/BogdanAlinTudorache/KeythroughDynamics


郵便配達員のリクエスト

{ "info": { "_postman_id": "c62ddbda-e487-432f-998a-4dfc9313f0fa", "name": "BogdanTudorache", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ { "name": "predict_user", "request": { "method": "POST", "header": [], "body": { "mode": "raw", "raw": "{\n \"Model\": \"RF\",\n \"HT\": {\n \"Mean\": 48.43,\n \"STD\": 23.34\n },\n \"PPT\": {\n \"Mean\": 120.43,\n \"STD\": 37.41\n },\n \"RRT\": {\n \"Mean\": 124.43,\n \"STD\": 45.34\n },\n \"RPT\": {\n \"Mean\": 132.56,\n \"STD\": 47.12\n }\n}", "options": { "raw": { "language": "json" } } }, "url": { "raw": "http://127.0.0.1:5000", "protocol": "http", "host": [ "127", "0", "0", "1" ], "port": "5000" } }, "response": [] } ] }


ファイルは GitHub からダウンロードできます。

{ "Model": "RF", "HT": { "Mean": 48.43, "STD": 23.34 }, "PPT": { "Mean": 120.43, "STD": 37.41 }, "RRT": { "Mean": 124.43, "STD": 45.34 }, "RPT": { "Mean": 132.56, "STD": 47.12 } }


Flask アプリ / Lambda アプリ

すべてを AWS に移行する前にプロセスをサンドボックス テストしたい場合は、Flask を使用してエンドツーエンドの呼び出しを複製する必要があります。

Flask アプリを起動するにはどうすればよいですか?

GitHub には flask_lambda_function.py のフルバージョンがあり、どの IDE でもスクリプトを実行するだけで flask アプリが自動的に起動します。


私の場合は IntelliJ Idea を使用しているので、スクリプトを実行するだけです (右クリック → 実行)。

IDE

現実のシナリオをテストする

IDE の下部でスクリプトが開始されると、Web サービスがローカルホストとポート 5000 で開始されたことを通知する Python コンソールが表示されます (これはデフォルトだと思いますが、これを構成することもできます)。

リクエストを待機している Flask アプリを備えた Python コンソール


これで、HTTP リクエスト POST を実行するたびに、flask アプリをトリガーして、実際のシナリオをシミュレートすることになります。

POSTリクエスト:

ポストボディ

Python コンソールの応答:

コンソールの応答

郵便配達員の応答:

郵便配達員の対応

コードのディープダイブ

@app.route('/', methods=['GET', 'POST']) def index(): # Bellow code should be uncommented when running in AWS:Lambda # above should be commented as well as flask import + app definition # def lambda_handler(event, context): """ Lambda handler: When a request hits the API gateway linked to this lambda_function this is the function that gets called. The request data is passed as the event variable which is a dictionary object, in this case it the json of the POST request from which we extract the body details """ # Parses the details from the POST request: extracts model and input data # Based on model it imports the trained model from local # Outputs the predicted user based on input data try: prediction = functions.predict_user(request.get_json()) # Below code should be uncommented when running from AWS, above should be commented. # prediction = functions.predict_user(event) return jsonify({'statuscode': 200, 'status': 'success', 'predicted user': str(prediction) }) except Exception as e: return jsonify({'statuscode': 400, 'status': 'error', 'message': str(e)})


上記のコードは flask-app に設定されていますが、特定の行をコメント化またはコメント解除することで、簡単に Lambda に切り替えることができます。


構造は非常に単純です。別の関数である detect_user() を呼び出し、POST リクエストからの json 本文を入力として提供するだけです。

予測ユーザー()

 def predict_user(event): """ Gets the input details from the body of the POST request and returns the predicted user """ # Print the event for debugging purposes print(event) # Check if the message has the correct body structure if ['Model', 'HT', 'PPT', 'RRT', 'RPT'] == list(event.keys()): print(f"Model is:", event['Model']) if event["Model"] == "SVM": # Load the trained SVM model from the joblib file model_path = os.path.join(basedir, 'models', 'svm_model.joblib') model = joblib.load(model_path) elif event["Model"] == "RF": # Load the trained Random Forest model from the joblib file model_path = os.path.join(basedir, 'models', 'rf_model.joblib') model = joblib.load(model_path) elif event["Model"] == "XGBoost": # Load the trained XGBoost model from the joblib file model_path = os.path.join(basedir, 'models', 'xgb_model.joblib') model = joblib.load('model_path') # Extract the features from the event dictionary features = [ event['HT']['Mean'], event['HT']['STD'], event['PPT']['Mean'], event['PPT']['STD'], event['RRT']['Mean'], event['RRT']['STD'], event['RPT']['Mean'], event['RPT']['STD'] ] # Make a prediction using the loaded model and the extracted features prediction = model.predict([features]) # Return the predicted user return prediction[0]


この関数は単純化して記述されており、モデル パラメーターに応じて、特定の事前トレーニングされた ML モデルをロードすることを決定します。


事前トレーニングされたモデルを使用してユーザー予測を行い、それをリクエスターに返します。 (最後の郵便配達員の応答写真を参照)


モデルのトレーニングはこの記事のパート Iで行われています。上記のリンクを参照してください


この記事が気に入って私をサポートしていただける場合は、必ず次のことを行ってください。

🔔 フォローしてくださいボグダン・トゥドラシュ

🔔 私とつながりましょう: LinkedIn | レディット