CSAI2026 labs: Lab-2..Lab-6 (Practical + Solution, data), Module-2..Module-6 notebooks and datasets

This commit is contained in:
mikrotik
2026-10-12 19:16:14 +07:00
commit 2fefa615cc
184 changed files with 1016761 additions and 0 deletions
@@ -0,0 +1,406 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "5Qdt9Zcpwy56"
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "eXE4wozRwskK"
},
"outputs": [],
"source": [
"dataset= pd.read_csv('datasets2/network-logs.csv')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 281
},
"id": "haqtAIADxFDq",
"outputId": "6f182e24-81da-4043-f106-bebd63f8fa33"
},
"outputs": [],
"source": [
"hist_dist = dataset[['LATENCY','THROUGHPUT']].hist(grid=False, figsize=(10,4))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
},
"id": "jwS1qbeWxgj8",
"outputId": "af12a8b1-8153-4d15-9db5-aea591fc613f"
},
"outputs": [],
"source": [
"data = dataset[['LATENCY','THROUGHPUT']].values\n",
"plt.scatter(data[:, 0], data[:, 1], alpha=0.6)\n",
"plt.xlabel('LATENCY')\n",
"plt.ylabel('THROUGHPUT')\n",
"plt.title('Data Flow')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "0ir5L5ZIzrtd"
},
"outputs": [],
"source": [
"\"\"\"Anomaly Detection Module\"\"\"\n",
"\n",
"import math\n",
"import numpy as np\n",
"\n",
"\n",
"class GaussianAnomalyDetection:\n",
" \"\"\"GaussianAnomalyDetection Class\"\"\"\n",
"\n",
" def __init__(self, data):\n",
" \"\"\"GaussianAnomalyDetection constructor\"\"\"\n",
"\n",
" # Estimate Gaussian distribution.\n",
" (self.mu_param, self.sigma_squared) = GaussianAnomalyDetection.estimate_gaussian(data)\n",
"\n",
" # Save training data.\n",
" self.data = data\n",
"\n",
" def multivariate_gaussian(self, data):\n",
" \"\"\"Computes the probability density function of the multivariate gaussian distribution\"\"\"\n",
"\n",
" mu_param = self.mu_param\n",
" sigma_squared = self.sigma_squared\n",
"\n",
" # Get number of training sets and features.\n",
" (num_examples, num_features) = data.shape\n",
"\n",
" # nit probabilities matrix.\n",
" probabilities = np.ones((num_examples, 1))\n",
"\n",
" # Go through all training examples and through all features.\n",
" for example_index in range(num_examples):\n",
" for feature_index in range(num_features):\n",
" # Calculate the power of e.\n",
" power_dividend = (data[example_index, feature_index] - mu_param[feature_index]) ** 2\n",
" power_divider = 2 * sigma_squared[feature_index]\n",
" e_power = -1 * power_dividend / power_divider\n",
"\n",
" # Calculate the prefix multiplier.\n",
" probability_prefix = 1 / math.sqrt(2 * math.pi * sigma_squared[feature_index])\n",
"\n",
" # Calculate the probability for the current feature of current example.\n",
" probability = probability_prefix * (math.e ** e_power)\n",
" probabilities[example_index] *= probability\n",
"\n",
" # Return probabilities for all training examples.\n",
" return probabilities\n",
"\n",
" @staticmethod\n",
" def estimate_gaussian(data):\n",
" \"\"\"This function estimates the parameters of a Gaussian distribution using the data in X.\"\"\"\n",
"\n",
" # Get number of features and number of examples.\n",
" num_examples = data.shape[0]\n",
"\n",
" # Estimate Gaussian parameters mu and sigma_squared for every feature.\n",
" mu_param = (1 / num_examples) * np.sum(data, axis=0)\n",
" sigma_squared = (1 / num_examples) * np.sum((data - mu_param) ** 2, axis=0)\n",
"\n",
" # Return Gaussian parameters.\n",
" return mu_param, sigma_squared\n",
"\n",
" @staticmethod\n",
" def select_threshold(labels, probabilities):\n",
" # pylint: disable=R0914\n",
" \"\"\"Finds the best threshold (epsilon) to use for selecting outliers\"\"\"\n",
"\n",
" best_epsilon = 0\n",
" best_f1 = 0\n",
"\n",
" # History data to build the plots.\n",
" precision_history = []\n",
" recall_history = []\n",
" f1_history = []\n",
"\n",
" # Calculate the epsilon steps.\n",
" min_probability = np.min(probabilities)\n",
" max_probability = np.max(probabilities)\n",
" step_size = (max_probability - min_probability) / 1000\n",
"\n",
" # Go through all possible epsilons and pick the one with the highest f1 score.\n",
" for epsilon in np.arange(min_probability, max_probability, step_size):\n",
" predictions = probabilities < epsilon\n",
"\n",
" # The number of false positives: the ground truth label says it’s not\n",
" # an anomaly, but our algorithm incorrectly classified it as an anomaly.\n",
" false_positives = np.sum((predictions == 1) & (labels == 0))\n",
"\n",
" # The number of false negatives: the ground truth label says it’s an anomaly,\n",
" # but our algorithm incorrectly classified it as not being anomalous.\n",
" false_negatives = np.sum((predictions == 0) & (labels == 1))\n",
"\n",
" # The number of true positives: the ground truth label says it’s an\n",
" # anomaly and our algorithm correctly classified it as an anomaly.\n",
" true_positives = np.sum((predictions == 1) & (labels == 1))\n",
"\n",
" # Prevent division by zero.\n",
" if (true_positives + false_positives) == 0 or (true_positives + false_negatives) == 0:\n",
" continue\n",
"\n",
" # Precision.\n",
" precision = true_positives / (true_positives + false_positives)\n",
"\n",
" # Recall.\n",
" recall = true_positives / (true_positives + false_negatives)\n",
"\n",
" # F1.\n",
" f1_score = 2 * precision * recall / (precision + recall)\n",
"\n",
" # Save history data.\n",
" precision_history.append(precision)\n",
" recall_history.append(recall)\n",
" f1_history.append(f1_score)\n",
"\n",
" if f1_score > best_f1:\n",
" best_epsilon = epsilon\n",
" best_f1 = f1_score\n",
"\n",
" return best_epsilon, best_f1, precision_history, recall_history, f1_history"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "xvPaIOLPyJ4y",
"outputId": "3a45d922-29cb-4819-971a-e33121bb2900"
},
"outputs": [],
"source": [
"#Thanks to Oleksii Trekhleb: https://github.com/trekhleb/homemade-machine-learning/blob/master/homemade/anomaly_detection/gaussian_anomaly_detection.py\n",
"gaussian_anomaly_detection = GaussianAnomalyDetection(data)\n",
"\n",
"print('mu param estimation: ')\n",
"print(gaussian_anomaly_detection.mu_param)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "JSdpJIlX1BI7",
"outputId": "68b88a84-c0eb-435e-9f33-62ad5d61896e"
},
"outputs": [],
"source": [
"# print sigma squared estimation\n",
"print(gaussian_anomaly_detection.sigma_squared)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Xku4v-771Nmi",
"outputId": "dd8b213a-83e6-4477-959b-ed96af3ec24f"
},
"outputs": [],
"source": [
"targets = dataset['ANOMALY'].values.reshape((data.shape[0], 1))\n",
"probs = gaussian_anomaly_detection.multivariate_gaussian(data)\n",
"(threshold, F1, precision_, recall_, f1_) = gaussian_anomaly_detection.select_threshold(targets, probs)\n",
"print('\\n')\n",
"print('threshold estimation: ')\n",
"print(threshold)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
},
"id": "tzl0vJA215XU",
"outputId": "25cc06b4-bd7c-4af1-fbdb-0b84dc45ffe3"
},
"outputs": [],
"source": [
"outliers = np.where(probs < threshold)[0]\n",
"plt.scatter(data[:, 0], data[:, 1], alpha=0.6, label='Dataset')\n",
"plt.xlabel('LATENCY')\n",
"plt.ylabel('THROUGHPUT')\n",
"plt.title('Data Flow')\n",
"plt.scatter(data[outliers, 0], data[outliers, 1], alpha=0.6, c = 'red', label='Outliers')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FfHXl2wI3SyB"
},
"source": [
"**False alarm management in anomaly detection**\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "a5xbB9oH3xyl",
"outputId": "3563dffd-3472-4821-abf5-41cb9fac2078"
},
"outputs": [],
"source": [
"# Sensitivity or True Positive rate (TPR) = True positive / (True Positive + False Negative)\n",
"# F1 = 2* precision * sensitivity /(Precision * sensitivy)\n",
"print('F1 score: ')\n",
"print(F1)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lspjMm4_4src"
},
"source": [
"**Reveiver operating characteristic analysis**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "vMeNGF1f4xHp"
},
"outputs": [],
"source": [
"from sklearn.metrics import roc_curve\n",
"FPR,TPR,OPC = roc_curve(targets, probs)\n",
"#TPR is true positive rate\n",
"#FPR is false positive rate\n",
"# Operating characteristic OPC"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 281
},
"id": "T2HXei9P5gJz",
"outputId": "9a2e2dfc-9c16-43b9-c6ac-f68ff5bfda3d"
},
"outputs": [],
"source": [
"# Plotting sensitivity\n",
"plt.plot(OPC, TPR)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 281
},
"id": "ZcKxWc_65qrN",
"outputId": "d81b9678-76f0-4615-ac5c-d5e5b46f596d"
},
"outputs": [],
"source": [
"# Plotting ROC cuver\n",
"plt.plot(FPR, TPR)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"colab": {
"name": "Udemy Gaussian Amomaly detection.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}