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 게이트웨이를 복제하는 데 사용할 수 있는 웹 프레임워크입니다.


Lambda는 AWS에서 호스팅되는 서버리스 웹 서비스로, 다양한 언어로 작성된 이벤트 기반 코드를 실행할 수 있지만 이 앱에서는 Python을 사용합니다.


데이터 흐름은 다음과 같습니다.

  1. 식별 데이터와 사용하려는 모델이 포함된 헤더를 로드합니다. 이는 기본적으로 json 페이로드입니다. 헤더인증 키 도 추가합니다(Prod에만 해당).
  2. Flask App/API Gateway에 HTTP POST 메서드 요청을 수행합니다.
  3. API Gateway는 인증 키(api key)를 확인하고 요청을 수락하면 처리를 위해 페이로드 를 Lambda로 보냅니다.
  4. FlaskApp/Lambda는 기본 코드를 실행합니다.
  5. 반환 본문 에서 얻는 것은 이벤트가 성공할 경우 예상 사용자의 ID이고, 그렇지 않으면 오류 메시지가 표시됩니다.


Higl레벨 개요


아키텍처 + 데이터 흐름에 대한 높은 수준의 개요


앞서 언급했듯이 Github 프로젝트 페이지에서 모든 코드를 찾을 수 있습니다.

https://github.com/BogdanAlinTudorache/KeystrokDynamics


우편 배달부 요청

날것의

 { "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 앱/람다 앱

모든 것을 AWS로 이동하기 전에 프로세스를 샌드박스 테스트하려면 Flask를 사용하여 엔드투엔드 호출을 복제해야 합니다.

플라스크 앱을 시작하는 방법은 무엇입니까?

GitHub에서는 플라스크_lambda_function.py의 정식 버전을 찾을 수 있으며, 모든 IDE에서는 플라스크 앱이 자동으로 시작되므로 스크립트를 실행하기만 하면 됩니다.


제 경우에는 IntelliJ Idea를 사용하고 있으므로 간단하게 스크립트를 실행합니다(오른쪽 클릭 → 실행).

IDE

실제 시나리오 테스트

IDE 하단에서 스크립트가 시작되면 웹 서비스가 로컬 호스트 및 포트 5000에서 시작되었음을 알리는 Python 콘솔이 표시됩니다(기본값이라고 생각하지만 구성할 수도 있음).

요청을 기다리는 Flask 앱이 있는 Python 콘솔


이제 HTTP 요청 POST를 수행할 때마다 실제 시나리오를 시뮬레이션하는 플라스크 앱을 트리거하게 됩니다.

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로 전환할 수 있습니다.


구조는 매우 간단합니다. 예측_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 모델을 로드하기로 결정한 모델 매개변수에 따라 간단하게 작성되었습니다.


사전 훈련된 모델을 사용하여 사용자 예측을 수행하고 이를 요청자에게 반환합니다. ( 마지막 Postman 응답 사진 참조 )


모델 훈련은 이 기사의 1부 에서 수행되었습니다. 위 링크를 참조하세요 .


기사가 마음에 들고 저를 지지하고 싶다면 다음을 확인하세요.

🔔 나를 따라오세요 Bogdan Tudorache

🔔 나와 연결: LinkedIn | 레딧