이 기사의 사용자 인식을 위한 기계 학습 모델에 사용되는 키 입력 역학은 행동 생체 인식입니다. 키스트로크 역학은 각 사람이 자신의 신원을 확인하기 위해 입력하는 독특한 방식을 사용합니다. 이는 타이핑 패턴을 추출하기 위해 컴퓨터 키보드의 키 입력을 구성하는 키 누르기 및 키 놓기의 2가지 키 입력 이벤트를 분석하여 수행됩니다. 이 기사에서는 이러한 ML 모델을 실제 상황에서 사용하여 사용자를 예측하는 방법을 살펴봅니다.
이전 기사에서는 동일한 텍스트를 12번 쓰도록 요청받은 100명의 사용자로부터 얻은 +880개의 키보드 입력 세트에서 3개의 ML 모델을 훈련할 수 있는 방법을 설명했습니다.
실제 상황을 시뮬레이션하는 데 사용할 앱입니다.
샌드박스 : 실제 시나리오를 테스트하기 위해 우리는
Production : 이 애플리케이션을 프로덕션으로 옮기고 싶을 때 간단히 Flask 코드의 일부를
Flask는 Lambda + API 게이트웨이를 복제하는 데 사용할 수 있는 웹 프레임워크입니다.
Lambda는 AWS에서 호스팅되는 서버리스 웹 서비스로, 다양한 언어로 작성된 이벤트 기반 코드를 실행할 수 있지만 이 앱에서는 Python을 사용합니다.
데이터 흐름은 다음과 같습니다.
앞서 언급했듯이 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 } }
모든 것을 AWS로 이동하기 전에 프로세스를 샌드박스 테스트하려면 Flask를 사용하여 엔드투엔드 호출을 복제해야 합니다.
GitHub에서는 플라스크_lambda_function.py의 정식 버전을 찾을 수 있으며, 모든 IDE에서는 플라스크 앱이 자동으로 시작되므로 스크립트를 실행하기만 하면 됩니다.
제 경우에는 IntelliJ Idea를 사용하고 있으므로 간단하게 스크립트를 실행합니다(오른쪽 클릭 → 실행).
IDE 하단에서 스크립트가 시작되면 웹 서비스가 로컬 호스트 및 포트 5000에서 시작되었음을 알리는 Python 콘솔이 표시됩니다(기본값이라고 생각하지만 구성할 수도 있음).
이제 HTTP 요청 POST를 수행할 때마다 실제 시나리오를 시뮬레이션하는 플라스크 앱을 트리거하게 됩니다.
@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