paint-brush
ML Modellerinin Tuş Dinamiği Yoluyla Kullanıcı Tanıma Uygulamasıile@tudoracheabogdan
480 okumalar
480 okumalar

ML Modellerinin Tuş Dinamiği Yoluyla Kullanıcı Tanıma Uygulaması

ile Bogdan Tudorache10m2023/10/10
Read on Terminal Reader

Çok uzun; Okumak

Bu makale, davranışsal bir biyometrik yöntem olan tuş vuruşu dinamiklerine dayalı kullanıcı tanıma için makine öğrenimi modellerinin kullanımını araştırıyor. Süreç, yazma kalıplarını çıkarmak ve üç makine öğrenimi modeli oluşturmak için tuş vuruşu verilerinin analiz edilmesini içerir: Destek Vektör Makinesi (SVM), Rastgele Orman ve Aşırı Dereceli Yükseltme (XGBoost). Veriler öncelikle bekletme süresi, baskı-baskı süresi, bırakma-baskı süresi ve bırakma-baskı süresi gibi özellikleri hesaplamak için işlenir. Bu özellikler daha sonra ML modellerini eğitmek için kullanılır. Her modelin eğitimi için kod örnekleri verilmiştir. Makale ayrıca özellik çıkarmanın önemini tartışıyor ve daha fazla okuma için ek kaynaklar sağlıyor
featured image - ML Modellerinin Tuş Dinamiği Yoluyla Kullanıcı Tanıma Uygulaması
Bogdan Tudorache HackerNoon profile picture
0-item

Tuş Vuruşu Dinamiklerini Kullanarak Kullanıcı Tanıma için ML modelleri

Bu makalenin makine öğrenimi modellerinde kullanıcı tanıma için kullanılan tuş vuruşu dinamikleri davranışsal biyometridir. Tuş vuruşu dinamikleri, her kişinin kimliğini doğrulamak için yazdığı farklı yöntemi kullanır. Bu, Tuşa Basma ve Tuş Bırakma sırasındaki 2 tuş vuruşu olayının analiz edilmesiyle gerçekleştirilir; bunlar, bilgisayar klavyelerinde yazma kalıplarını çıkarmak için bir tuş vuruşunu oluşturur.


Bu makale, kullanıcı tanımaya yönelik 3 hassas makine öğrenimi modeli oluşturmak için bu modellerin nasıl uygulanabileceğini inceleyecektir.


Bu makalenin amacı iki bölüme ayrılacaktır: Makine Öğrenimi modelleri oluşturmak ve eğitmek (1. SVM 2. Rastgele Orman 3. XGBoost ) ve modeli, kullanıcıyı 5 girdiye göre tahmin edebilen gerçek, canlı, tek noktalı bir API'de dağıtmak. parametreler: ML modeli ve 4 tuş vuruşu süresi.




1. Bina Modelleri

Sorun

Bu bölümün amacı, tuş vuruşu verilerine dayalı olarak kullanıcı tanıma için ML modelleri oluşturmaktır. Tuş vuruşu dinamiği, bir kişinin kimliğini doğrulamak için kişinin benzersiz bir şekilde yazma yöntemini kullanan davranışsal bir biyometriktir.


Yazma desenleri ağırlıklı olarak bilgisayar klavyelerinden alınmıştır. Tuş vuruşu dinamiklerinde kullanılan modeller esas olarak bir tuş vuruşunu oluşturan iki olaydan türetilir: Tuşa Basma ve Tuş Bırakma.


Tuşa Basma olayı, bir tuşa ilk basıldığında gerçekleşir ve Tuş Bırakma, o tuşun daha sonra bırakılmasıyla gerçekleşir.


Bu adımda, kullanıcıların tuş vuruşu bilgilerinin bir veri seti aşağıdaki bilgilerle birlikte verilir:


  • keystroke.csv : Bu veri setinde 110 kullanıcının tuş vuruşu verileri toplanıyor.
  • Tüm kullanıcılardan 13 uzunluktaki sabit bir dizeyi 8 kez yazmaları istenir ve tuş vuruşu verileri (her tuş için tuşa basma süresi ve tuş bırakma süresi) toplanır.
  • Veri seti 880 satır ve 27 sütundan oluşmaktadır.
  • İlk sütun Kullanıcı Kimliğini belirtir ve geri kalanı ilk ila 13. karakter için basma ve bırakma süresini gösterir.


Aşağıdakileri yapmalısınız:

  1. Genellikle ham veriler yeterince bilgilendirici değildir ve iyi bir model oluşturmak için ham verilerden bilgilendirici özelliklerin çıkarılması gerekir.


Bu bağlamda dört özellik:


  • Hold Time “HT”

  • Press-Press time “PPT”

  • Release-Release Time “RRT”

  • Release-Press time “RPT”


tanıtılmış ve her birinin tanımları yukarıda açıklanmıştır.


2. keystroke.csv, bu özellikleri birbirini takip eden her iki tuş için oluşturmalısınız .


3. Önceki adımı tamamladıktan sonra, her bir özelliğin satır başına ortalamasını ve standart sapmasını hesaplamanız gerekir. Sonuç olarak, satır başına 8 özelliğe (4 ortalama ve 4 standart sapma) sahip olmalısınız. → 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'umda KeystrokeDynamics deposunda bulabileceğiniz tüm kodlar:


ML'leri eğitin

Artık verileri ayrıştırdığımıza göre ML'leri eğiterek modelleri oluşturmaya başlayabiliriz.


Destek Vektör Makinesi

 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)


Ek okuma:


Rastgele Orman


 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)


Ek okuma:



Aşırı Degrade Arttırma


 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)


Ek okuma:




Makaleyi beğendiyseniz ve bana destek olmak istiyorsanız şunları yaptığınızdan emin olun:

🔔 Beni takip et Bogdan Tudorache

🔔 Benimle iletişime geçin: LinkedIn | Reddit