paint-brush
キーストロークダイナミクスによるユーザー認識における ML モデルの応用@tudoracheabogdan
480 測定値
480 測定値

キーストロークダイナミクスによるユーザー認識における ML モデルの応用

Bogdan Tudorache10m2023/10/10
Read on Terminal Reader

長すぎる; 読むには

この記事では、行動生体認証手法であるキーストローク ダイナミクスに基づくユーザー認識のための機械学習モデルの使用について説明します。このプロセスには、キーストローク データを分析して入力パターンを抽出し、サポート ベクター マシン (SVM)、ランダム フォレスト、極端な勾配ブースティング (XGBoost) という 3 つの機械学習モデルを構築することが含まれます。データはまず、ホールド時間、プレス-プレス時間、リリース-リリース時間、リリース-プレス時間などの特徴を計算するために処理されます。これらの機能は、ML モデルのトレーニングに使用されます。各モデルのトレーニングのコード例が提供されます。この記事では、特徴抽出の重要性についても説明し、さらに読むための追加リソースも提供します。
featured image - キーストロークダイナミクスによるユーザー認識における ML モデルの応用
Bogdan Tudorache HackerNoon profile picture
0-item

キーストローク ダイナミクスを使用したユーザー認識のための ML モデル

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


この記事では、これらのパターンを適用して、ユーザー認識のための 3 つの正確な機械学習モデルを作成する方法を検討します。


この記事の目標は、機械学習モデル (1. SVM 2. Random Forest 3. XGBoost )の構築とトレーニング、および 5 つの入力に基づいてユーザーを予測できる実際のライブ シングルポイント API にモデルをデプロイする2 つの部分に分かれています。パラメータ: ML モデルと 4 つのキーストローク時間。




1. モデルの構築

問題

このパートの目的は、キーストロークデータに基づいてユーザー認識のためのML モデルを構築することです。キーストローク ダイナミクスは、個人の入力方法を利用して個人の身元を確認する行動生体認証です。


タイピング パターンは主にコンピュータのキーボードから抽出されます。キーストロークのダイナミクスで使用されるパターンは、主にキーストロークを構成する 2 つのイベント (キーを押すとキーを離す) から派生します。


Key-Press イベントはキーを最初に押すときに発生し、Key-Release はその後そのキーを離したときに発生します。


このステップでは、ユーザーのキーストローク情報のデータセットが次の情報とともに提供されます。


  • keystroke.csv : このデータセットでは、110 人のユーザーからのキーストローク データが収集されます。
  • すべてのユーザーは、長さ 13 の定数文字列を 8 回入力するように求められ、キーストローク データ (各キーのキーを押した時間とキーを放した時間) が収集されます。
  • データ セットには 880 行と 27 列が含まれています。
  • 最初の列は UserID を示し、残りは 1 番目から 13 番目までの文字を押して離す時間を示します。


次のことを行う必要があります。

  1. 通常、生データは十分な情報を提供しないため、適切なモデルを構築するには生データから有益な特徴を抽出する必要があります。


この点に関しては、次の 4 つの特徴があります。


  • Hold Time “HT”

  • Press-Press time “PPT”

  • Release-Release Time “RRT”

  • Release-Press time “RPT”


が導入され、それぞれの定義は上で説明されています。


2. keystroke.csv,連続する 2 つのキーごとにこれらの機能を生成する必要があります。


3. 前のステップを完了したら、行ごとに各特徴の平均と標準偏差を計算する必要があります。結果として、行ごとに 8 つの特徴 (4 つの平均と 4 つの標準偏差) が必要になります。 → process_csv()



 def calculate_mean_and_standard_deviation(feature_list): from math import sqrt # calculate the mean mean = sum(feature_list) / len(feature_list) # calculate the squared differences from the mean squared_diffs = [(x - mean) ** 2 for x in feature_list] # calculate the sum of the squared differences sum_squared_diffs = sum(squared_diffs) # calculate the variance variance = sum_squared_diffs / (len(feature_list) - 1) # calculate the standard deviation std_dev = sqrt(variance) return mean, std_dev



 def process_csv(df_input_csv_data): data = { 'user': [], 'ht_mean': [], 'ht_std_dev': [], 'ppt_mean': [], 'ppt_std_dev': [], 'rrt_mean': [], 'rrt_std_dev': [], 'rpt_mean': [], 'rpt_std_dev': [], } # iterate over each row in the dataframe for i, row in df_input_csv_data.iterrows(): # iterate over each pair of consecutive presses and releases # print('user:', row['user']) # list of hold times ht_list = [] # list of press-press times ppt_list = [] # list of release-release times rrt_list = [] # list of release-press times rpt_list = [] # I use the IF to select only the X rows of the csv if i < 885: for j in range(12): # calculate the hold time: release[j]-press[j] ht = row[f"release-{j}"] - row[f"press-{j}"] # append hold time to list of hold times ht_list.append(ht) # calculate the press-press time: press[j+1]-press[j] if j < 11: ppt = row[f"press-{j + 1}"] - row[f"press-{j}"] ppt_list.append(ppt) # calculate the release-release time: release[j+1]-release[j] if j < 11: rrt = row[f"release-{j + 1}"] - row[f"release-{j}"] rrt_list.append(rrt) # calculate the release-press time: press[j+1] - release[j] if j < 10: rpt = row[f"press-{j + 1}"] - row[f"release-{j}"] rpt_list.append(rpt) # ht_list, ppt_list, rrt_list, rpt_list are a list of calculated values for each feature -> feature_list ht_mean, ht_std_dev = calculate_mean_and_standard_deviation(ht_list) ppt_mean, ppt_std_dev = calculate_mean_and_standard_deviation(ppt_list) rrt_mean, rrt_std_dev = calculate_mean_and_standard_deviation(rrt_list) rpt_mean, rpt_std_dev = calculate_mean_and_standard_deviation(rpt_list) # print(ht_mean, ht_std_dev) # print(ppt_mean, ppt_std_dev) # print(rrt_mean, rrt_std_dev) # print(rpt_mean, rpt_std_dev) data['user'].append(row['user']) data['ht_mean'].append(ht_mean) data['ht_std_dev'].append(ht_std_dev) data['ppt_mean'].append(ppt_mean) data['ppt_std_dev'].append(ppt_std_dev) data['rrt_mean'].append(rrt_mean) data['rrt_std_dev'].append(rrt_std_dev) data['rpt_mean'].append(rpt_mean) data['rpt_std_dev'].append(rpt_std_dev) else: break data_df = pd.DataFrame(data) return data_df


私の GitHub の KeythroughDynamics リポジトリにあるすべてのコード:


ML をトレーニングする

データを解析したので、ML をトレーニングしてモデルの構築を開始できます。


サポートベクターマシン

def train_svm(training_data, features): import joblib from sklearn.svm import SVC """ SVM stands for Support Vector Machine, which is a type of machine learning algorithm used: for classification and regression analysis. SVM algorithm aims to find a hyperplane in an n-dimensional space that separates the data into two classes. The hyperplane is chosen in such a way that it maximizes the margin between the two classes, making the classification more robust and accurate. In addition, SVM can also handle non-linearly separable data by mapping the original features to a higher-dimensional space, where a linear hyperplane can be used for classification. :param training_data: :param features: :return: ML Trained model """ # Split the data into features and labels X = training_data[features] y = training_data['user'] # Train an SVM model on the data svm_model = SVC() svm_model.fit(X, y) # Save the trained model to disk svm_model_name = 'models/svm_model.joblib' joblib.dump(svm_model, svm_model_name)


追加の資料:


ランダムフォレスト


def train_random_forest(training_data, features): """ Random Forest is a type of machine learning algorithm that belongs to the family of ensemble learning methods. It is used for classification, regression, and other tasks that involve predicting an output value based on a set of input features. The algorithm works by creating multiple decision trees, where each tree is built using a random subset of the input features and a random subset of the training data. Each tree is trained independently, and the final output is obtained by combining the outputs of all the trees in some way, such as taking the average (for regression) or majority vote (for classification). :param training_data: :param features: :return: ML Trained model """ import joblib from sklearn.ensemble import RandomForestClassifier # Split the data into features and labels X = training_data[features] y = training_data['user'] # Train a Random Forest model on the data rf_model = RandomForestClassifier() rf_model.fit(X, y) # Save the trained model to disk rf_model_name = 'models/rf_model.joblib' joblib.dump(rf_model, rf_model_name)


追加の資料:



極端な勾配ブースティング


def train_xgboost(training_data, features): import joblib import xgboost as xgb from sklearn.preprocessing import LabelEncoder """ XGBoost stands for Extreme Gradient Boosting, which is a type of gradient boosting algorithm used for classification and regression analysis. XGBoost is an ensemble learning method that combines multiple decision trees to create a more powerful model. Each tree is built using a gradient boosting algorithm, which iteratively improves the model by minimizing a loss function. XGBoost has several advantages over other boosting algorithms, including its speed, scalability, and ability to handle missing values. :param training_data: :param features: :return: ML Trained model """ # Split the data into features and labels X = training_data[features] label_encoder = LabelEncoder() y = label_encoder.fit_transform(training_data['user']) # Train an XGBoost model on the data xgb_model = xgb.XGBClassifier() xgb_model.fit(X, y) # Save the trained model to disk xgb_model_name = 'models/xgb_model.joblib' joblib.dump(xgb_model, xgb_model_name)


追加の資料:




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

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

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