Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save josejesus30/ee0f9028fb8c8f2bd384cfea53f1ff67 to your computer and use it in GitHub Desktop.
Save josejesus30/ee0f9028fb8c8f2bd384cfea53f1ff67 to your computer and use it in GitHub Desktop.
En este caso de uso práctico se presenta un mecanismo de extracción de características (reducción de dimensionalidad) mediante el uso del algoritmo PCA.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Modelo: _Análisis de Componentes Principales para la reducción de la dimensionalidad_\n",
"En este caso de uso práctico se presenta un mecanismo de extracción de características (reducción de dimensionalidad) mediante el uso del algoritmo PCA."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Autor: José Alamo Palomino"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Caso Práctico: Detección de malware en Android"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"El sofisticado y avanzado malware de Android puede identificar la presencia del emulador utilizado por el analista de malware y, en respuesta, alterar su comportamiento para evadir la detección. Para superar este problema, instalamos las aplicaciones de Android en el dispositivo real y capturamos su tráfico de red. Vea nuestro Sandbox de Android disponible al público .\n",
"\n",
"El conjunto de datos CICAAGM se captura instalando las aplicaciones de Android en los teléfonos inteligentes reales semiautomatizados. El conjunto de datos se genera a partir de 1900 aplicaciones con las siguientes tres categorías:\n",
"\n",
"### 1. Adware (250 aplicaciones)\n",
"\n",
"* **Airpush:** diseñado para entregar anuncios no solicitados a los sistemas del usuario para el robo de información.\n",
"\n",
"* **Dowgin:** diseñado como una biblioteca de publicidad que también puede robar la información del usuario.\n",
"\n",
"* **Kemoge:** diseñado para hacerse cargo del dispositivo Android de un usuario. Este adware es un híbrido de botnet y se disfraza de aplicaciones populares a través del reempaquetado.\n",
"\n",
"* **Mobidash:** diseñado para mostrar anuncios y comprometer la información personal del usuario.\n",
"\n",
"* **Shuanet:** similar a Kemoge, Shuanet también está diseñado para hacerse cargo del dispositivo de un usuario.\n",
"\n",
"### 2. Malware general (150 aplicaciones)\n",
"\n",
"* **AVpass:** diseñado para ser distribuido bajo la apariencia de una aplicación de reloj.\n",
"\n",
"* **FakeAV:** Diseñado como una estafa que engaña al usuario para que compre una versión completa del software con el fin de mediar infecciones no existentes.\n",
"\n",
"* **FakeFlash / FakePlayer:** diseñado como una aplicación Flash falsa para dirigir a los usuarios a un sitio web (después de una instalación exitosa).\n",
"\n",
"* **GGtracker:** diseñado para el fraude por SMS (envía mensajes SMS a un número de tarifa premium) y robo de información.\n",
"\n",
"* **Penetho:** diseñado como un servicio falso (hacktool para dispositivos Android que se puede usar para descifrar la contraseña de WiFi). El malware también puede infectar la computadora del usuario a través de archivos adjuntos de correo electrónico infectados, actualizaciones falsas, medios externos y documentos infectados.\n",
"\n",
"### 3. Benigno (1500 aplicaciones)\n",
"\n",
"* 2015 GooglePlay market (top gratis popular y top gratis nuevo)\n",
"* 2016 GooglePlay market (top gratis popular y top gratis nuevo)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Observación:\n",
"El conjunto de datos esta formado mendiante la instalación de aplicaciones en dispositivos android, y una vez que se han instalado esas aplicaciones lo que se hace es capturar el tráfico de red que generan esos dispositivos.\n",
"\n",
"EL objetivo es entrenar un algoritmo de Random Forest que sea capaz de diferenciar flujos de tráfico de red pertenecientes a las clases benign, asware y GeneralMalware y que cuando llegue tráfico de red nuevo, nuestro algoritmo de random forest devolverá alguna de las 3 categorias mencionadas. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h2 style=\"color:blue\">1. Importando librerías necesarias</h2>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import f1_score"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h2 style=\"color:blue\">2. Funciones auxiliares</h2>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.1 Función para la partición del conjunto de datos"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"def train_val_test_split(df, rstate=42, shuffle=True, stratify=None):\n",
" strat = df[stratify] if stratify else None\n",
" train_set, test_set = train_test_split(\n",
" df, test_size=0.4, random_state=rstate, shuffle=shuffle, stratify=strat)\n",
" strat = test_set[stratify] if stratify else None\n",
" val_set, test_set = train_test_split(\n",
" test_set, test_size=0.5, random_state=rstate, shuffle=shuffle, stratify=strat)\n",
" return (train_set, val_set, test_set)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 Función para separar las características de entrada de las de salida"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"def remove_labels(df, label_name):\n",
" X = df.drop(label_name, axis=1)\n",
" y = df[label_name].copy()\n",
" return (X, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h2 style=\"color:blue\">3. Lectura del conjunto de datos</h2>"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>duration</th>\n",
" <th>total_fpackets</th>\n",
" <th>total_bpackets</th>\n",
" <th>total_fpktl</th>\n",
" <th>total_bpktl</th>\n",
" <th>min_fpktl</th>\n",
" <th>min_bpktl</th>\n",
" <th>max_fpktl</th>\n",
" <th>max_bpktl</th>\n",
" <th>mean_fpktl</th>\n",
" <th>...</th>\n",
" <th>mean_idle</th>\n",
" <th>max_idle</th>\n",
" <th>std_idle</th>\n",
" <th>FFNEPD</th>\n",
" <th>Init_Win_bytes_forward</th>\n",
" <th>Init_Win_bytes_backward</th>\n",
" <th>RRT_samples_clnt</th>\n",
" <th>Act_data_pkt_forward</th>\n",
" <th>min_seg_size_forward</th>\n",
" <th>calss</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1020586</td>\n",
" <td>668</td>\n",
" <td>1641</td>\n",
" <td>35692</td>\n",
" <td>2276876</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>679</td>\n",
" <td>1390</td>\n",
" <td>53.431138</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>4194240</td>\n",
" <td>1853440</td>\n",
" <td>1640</td>\n",
" <td>668</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>80794</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>75</td>\n",
" <td>124</td>\n",
" <td>75</td>\n",
" <td>124</td>\n",
" <td>75</td>\n",
" <td>124</td>\n",
" <td>75.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>998</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>187</td>\n",
" <td>0</td>\n",
" <td>52</td>\n",
" <td>-1</td>\n",
" <td>83</td>\n",
" <td>-1</td>\n",
" <td>62.333333</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>4</td>\n",
" <td>101888</td>\n",
" <td>-1</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>189868</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>1448</td>\n",
" <td>6200</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>706</td>\n",
" <td>1390</td>\n",
" <td>160.888889</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>4194240</td>\n",
" <td>2722560</td>\n",
" <td>8</td>\n",
" <td>9</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>110577</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>528</td>\n",
" <td>1422</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>331</td>\n",
" <td>1005</td>\n",
" <td>132.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>155136</td>\n",
" <td>31232</td>\n",
" <td>5</td>\n",
" <td>4</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631950</th>\n",
" <td>530</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>74</td>\n",
" <td>334</td>\n",
" <td>74</td>\n",
" <td>334</td>\n",
" <td>74</td>\n",
" <td>334</td>\n",
" <td>74.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631951</th>\n",
" <td>50240627</td>\n",
" <td>23</td>\n",
" <td>24</td>\n",
" <td>4767</td>\n",
" <td>6107</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>533</td>\n",
" <td>855</td>\n",
" <td>207.260870</td>\n",
" <td>...</td>\n",
" <td>9842879.0</td>\n",
" <td>9964749</td>\n",
" <td>1.196806e+05</td>\n",
" <td>2</td>\n",
" <td>317952</td>\n",
" <td>107008</td>\n",
" <td>11</td>\n",
" <td>23</td>\n",
" <td>32</td>\n",
" <td>GeneralMalware</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631952</th>\n",
" <td>35471450</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>52</td>\n",
" <td>104</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>52.000000</td>\n",
" <td>...</td>\n",
" <td>35300000.0</td>\n",
" <td>35290631</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>3904</td>\n",
" <td>88704</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>32</td>\n",
" <td>asware</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631953</th>\n",
" <td>41713629</td>\n",
" <td>12</td>\n",
" <td>26</td>\n",
" <td>1821</td>\n",
" <td>18643</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>489</td>\n",
" <td>1390</td>\n",
" <td>151.750000</td>\n",
" <td>...</td>\n",
" <td>20200000.0</td>\n",
" <td>32711382</td>\n",
" <td>1.770000e+07</td>\n",
" <td>2</td>\n",
" <td>227456</td>\n",
" <td>2432</td>\n",
" <td>23</td>\n",
" <td>12</td>\n",
" <td>20</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631954</th>\n",
" <td>50110119</td>\n",
" <td>20</td>\n",
" <td>23</td>\n",
" <td>4130</td>\n",
" <td>6043</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>533</td>\n",
" <td>855</td>\n",
" <td>206.500000</td>\n",
" <td>...</td>\n",
" <td>9873329.4</td>\n",
" <td>9906007</td>\n",
" <td>4.737363e+04</td>\n",
" <td>2</td>\n",
" <td>266112</td>\n",
" <td>59904</td>\n",
" <td>11</td>\n",
" <td>20</td>\n",
" <td>32</td>\n",
" <td>GeneralMalware</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>631955 rows × 80 columns</p>\n",
"</div>"
],
"text/plain": [
" duration total_fpackets total_bpackets total_fpktl total_bpktl \\\n",
"0 1020586 668 1641 35692 2276876 \n",
"1 80794 1 1 75 124 \n",
"2 998 3 0 187 0 \n",
"3 189868 9 9 1448 6200 \n",
"4 110577 4 6 528 1422 \n",
"... ... ... ... ... ... \n",
"631950 530 1 1 74 334 \n",
"631951 50240627 23 24 4767 6107 \n",
"631952 35471450 1 2 52 104 \n",
"631953 41713629 12 26 1821 18643 \n",
"631954 50110119 20 23 4130 6043 \n",
"\n",
" min_fpktl min_bpktl max_fpktl max_bpktl mean_fpktl ... \\\n",
"0 52 52 679 1390 53.431138 ... \n",
"1 75 124 75 124 75.000000 ... \n",
"2 52 -1 83 -1 62.333333 ... \n",
"3 52 52 706 1390 160.888889 ... \n",
"4 52 52 331 1005 132.000000 ... \n",
"... ... ... ... ... ... ... \n",
"631950 74 334 74 334 74.000000 ... \n",
"631951 52 52 533 855 207.260870 ... \n",
"631952 52 52 52 52 52.000000 ... \n",
"631953 40 40 489 1390 151.750000 ... \n",
"631954 52 52 533 855 206.500000 ... \n",
"\n",
" mean_idle max_idle std_idle FFNEPD Init_Win_bytes_forward \\\n",
"0 0.0 -1 0.000000e+00 2 4194240 \n",
"1 0.0 -1 0.000000e+00 2 0 \n",
"2 0.0 -1 0.000000e+00 4 101888 \n",
"3 0.0 -1 0.000000e+00 2 4194240 \n",
"4 0.0 -1 0.000000e+00 2 155136 \n",
"... ... ... ... ... ... \n",
"631950 0.0 -1 0.000000e+00 2 0 \n",
"631951 9842879.0 9964749 1.196806e+05 2 317952 \n",
"631952 35300000.0 35290631 0.000000e+00 2 3904 \n",
"631953 20200000.0 32711382 1.770000e+07 2 227456 \n",
"631954 9873329.4 9906007 4.737363e+04 2 266112 \n",
"\n",
" Init_Win_bytes_backward RRT_samples_clnt Act_data_pkt_forward \\\n",
"0 1853440 1640 668 \n",
"1 0 0 1 \n",
"2 -1 0 3 \n",
"3 2722560 8 9 \n",
"4 31232 5 4 \n",
"... ... ... ... \n",
"631950 0 0 1 \n",
"631951 107008 11 23 \n",
"631952 88704 1 1 \n",
"631953 2432 23 12 \n",
"631954 59904 11 20 \n",
"\n",
" min_seg_size_forward calss \n",
"0 32 benign \n",
"1 0 benign \n",
"2 32 benign \n",
"3 32 benign \n",
"4 32 benign \n",
"... ... ... \n",
"631950 0 benign \n",
"631951 32 GeneralMalware \n",
"631952 32 asware \n",
"631953 20 benign \n",
"631954 32 GeneralMalware \n",
"\n",
"[631955 rows x 80 columns]"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('datasets/TotalFeatures-ISCXFlowMeter.csv')\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" <h2 style=\"color:blue\">4. Visualización del conjunto de datos</h2>"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>duration</th>\n",
" <th>total_fpackets</th>\n",
" <th>total_bpackets</th>\n",
" <th>total_fpktl</th>\n",
" <th>total_bpktl</th>\n",
" <th>min_fpktl</th>\n",
" <th>min_bpktl</th>\n",
" <th>max_fpktl</th>\n",
" <th>max_bpktl</th>\n",
" <th>mean_fpktl</th>\n",
" <th>...</th>\n",
" <th>mean_idle</th>\n",
" <th>max_idle</th>\n",
" <th>std_idle</th>\n",
" <th>FFNEPD</th>\n",
" <th>Init_Win_bytes_forward</th>\n",
" <th>Init_Win_bytes_backward</th>\n",
" <th>RRT_samples_clnt</th>\n",
" <th>Act_data_pkt_forward</th>\n",
" <th>min_seg_size_forward</th>\n",
" <th>calss</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1020586</td>\n",
" <td>668</td>\n",
" <td>1641</td>\n",
" <td>35692</td>\n",
" <td>2276876</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>679</td>\n",
" <td>1390</td>\n",
" <td>53.431138</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>2</td>\n",
" <td>4194240</td>\n",
" <td>1853440</td>\n",
" <td>1640</td>\n",
" <td>668</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>80794</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>75</td>\n",
" <td>124</td>\n",
" <td>75</td>\n",
" <td>124</td>\n",
" <td>75</td>\n",
" <td>124</td>\n",
" <td>75.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>998</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>187</td>\n",
" <td>0</td>\n",
" <td>52</td>\n",
" <td>-1</td>\n",
" <td>83</td>\n",
" <td>-1</td>\n",
" <td>62.333333</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>4</td>\n",
" <td>101888</td>\n",
" <td>-1</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>189868</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>1448</td>\n",
" <td>6200</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>706</td>\n",
" <td>1390</td>\n",
" <td>160.888889</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>2</td>\n",
" <td>4194240</td>\n",
" <td>2722560</td>\n",
" <td>8</td>\n",
" <td>9</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>110577</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>528</td>\n",
" <td>1422</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>331</td>\n",
" <td>1005</td>\n",
" <td>132.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>2</td>\n",
" <td>155136</td>\n",
" <td>31232</td>\n",
" <td>5</td>\n",
" <td>4</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>261876</td>\n",
" <td>7</td>\n",
" <td>6</td>\n",
" <td>1618</td>\n",
" <td>882</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>730</td>\n",
" <td>477</td>\n",
" <td>231.142857</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>2</td>\n",
" <td>4194240</td>\n",
" <td>926720</td>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>14</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>104</td>\n",
" <td>0</td>\n",
" <td>52</td>\n",
" <td>-1</td>\n",
" <td>52</td>\n",
" <td>-1</td>\n",
" <td>52.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>3</td>\n",
" <td>5824</td>\n",
" <td>-1</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>29675</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>71</td>\n",
" <td>213</td>\n",
" <td>71</td>\n",
" <td>213</td>\n",
" <td>71</td>\n",
" <td>213</td>\n",
" <td>71.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>806635</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>239</td>\n",
" <td>0</td>\n",
" <td>52</td>\n",
" <td>-1</td>\n",
" <td>83</td>\n",
" <td>-1</td>\n",
" <td>59.750000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>5</td>\n",
" <td>107008</td>\n",
" <td>-1</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>56620</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>1074</td>\n",
" <td>719</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>592</td>\n",
" <td>667</td>\n",
" <td>358.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>3</td>\n",
" <td>128512</td>\n",
" <td>10816</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>32</td>\n",
" <td>benign</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>10 rows × 80 columns</p>\n",
"</div>"
],
"text/plain": [
" duration total_fpackets total_bpackets total_fpktl total_bpktl \\\n",
"0 1020586 668 1641 35692 2276876 \n",
"1 80794 1 1 75 124 \n",
"2 998 3 0 187 0 \n",
"3 189868 9 9 1448 6200 \n",
"4 110577 4 6 528 1422 \n",
"5 261876 7 6 1618 882 \n",
"6 14 2 0 104 0 \n",
"7 29675 1 1 71 213 \n",
"8 806635 4 0 239 0 \n",
"9 56620 3 2 1074 719 \n",
"\n",
" min_fpktl min_bpktl max_fpktl max_bpktl mean_fpktl ... mean_idle \\\n",
"0 52 52 679 1390 53.431138 ... 0.0 \n",
"1 75 124 75 124 75.000000 ... 0.0 \n",
"2 52 -1 83 -1 62.333333 ... 0.0 \n",
"3 52 52 706 1390 160.888889 ... 0.0 \n",
"4 52 52 331 1005 132.000000 ... 0.0 \n",
"5 52 52 730 477 231.142857 ... 0.0 \n",
"6 52 -1 52 -1 52.000000 ... 0.0 \n",
"7 71 213 71 213 71.000000 ... 0.0 \n",
"8 52 -1 83 -1 59.750000 ... 0.0 \n",
"9 52 52 592 667 358.000000 ... 0.0 \n",
"\n",
" max_idle std_idle FFNEPD Init_Win_bytes_forward \\\n",
"0 -1 0.0 2 4194240 \n",
"1 -1 0.0 2 0 \n",
"2 -1 0.0 4 101888 \n",
"3 -1 0.0 2 4194240 \n",
"4 -1 0.0 2 155136 \n",
"5 -1 0.0 2 4194240 \n",
"6 -1 0.0 3 5824 \n",
"7 -1 0.0 2 0 \n",
"8 -1 0.0 5 107008 \n",
"9 -1 0.0 3 128512 \n",
"\n",
" Init_Win_bytes_backward RRT_samples_clnt Act_data_pkt_forward \\\n",
"0 1853440 1640 668 \n",
"1 0 0 1 \n",
"2 -1 0 3 \n",
"3 2722560 8 9 \n",
"4 31232 5 4 \n",
"5 926720 3 7 \n",
"6 -1 0 2 \n",
"7 0 0 1 \n",
"8 -1 0 4 \n",
"9 10816 1 3 \n",
"\n",
" min_seg_size_forward calss \n",
"0 32 benign \n",
"1 0 benign \n",
"2 32 benign \n",
"3 32 benign \n",
"4 32 benign \n",
"5 32 benign \n",
"6 32 benign \n",
"7 0 benign \n",
"8 32 benign \n",
"9 32 benign \n",
"\n",
"[10 rows x 80 columns]"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>duration</th>\n",
" <th>total_fpackets</th>\n",
" <th>total_bpackets</th>\n",
" <th>total_fpktl</th>\n",
" <th>total_bpktl</th>\n",
" <th>min_fpktl</th>\n",
" <th>min_bpktl</th>\n",
" <th>max_fpktl</th>\n",
" <th>max_bpktl</th>\n",
" <th>mean_fpktl</th>\n",
" <th>...</th>\n",
" <th>min_idle</th>\n",
" <th>mean_idle</th>\n",
" <th>max_idle</th>\n",
" <th>std_idle</th>\n",
" <th>FFNEPD</th>\n",
" <th>Init_Win_bytes_forward</th>\n",
" <th>Init_Win_bytes_backward</th>\n",
" <th>RRT_samples_clnt</th>\n",
" <th>Act_data_pkt_forward</th>\n",
" <th>min_seg_size_forward</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>6.319550e+05</td>\n",
" <td>631955.000000</td>\n",
" <td>631955.000000</td>\n",
" <td>6.319550e+05</td>\n",
" <td>6.319550e+05</td>\n",
" <td>631955.000000</td>\n",
" <td>631955.000000</td>\n",
" <td>631955.000000</td>\n",
" <td>631955.000000</td>\n",
" <td>631955.000000</td>\n",
" <td>...</td>\n",
" <td>6.319550e+05</td>\n",
" <td>6.319550e+05</td>\n",
" <td>6.319550e+05</td>\n",
" <td>6.319550e+05</td>\n",
" <td>631955.000000</td>\n",
" <td>6.319550e+05</td>\n",
" <td>6.319550e+05</td>\n",
" <td>631955.000000</td>\n",
" <td>631955.00000</td>\n",
" <td>631955.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>2.195245e+07</td>\n",
" <td>6.728514</td>\n",
" <td>10.431934</td>\n",
" <td>9.540172e+02</td>\n",
" <td>1.206042e+04</td>\n",
" <td>141.475727</td>\n",
" <td>44.357688</td>\n",
" <td>263.675901</td>\n",
" <td>183.248084</td>\n",
" <td>174.959706</td>\n",
" <td>...</td>\n",
" <td>1.997327e+07</td>\n",
" <td>2.031228e+07</td>\n",
" <td>2.075238e+07</td>\n",
" <td>4.663875e+05</td>\n",
" <td>2.360896</td>\n",
" <td>9.620796e+05</td>\n",
" <td>3.104519e+05</td>\n",
" <td>9.733144</td>\n",
" <td>6.72471</td>\n",
" <td>19.965713</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>1.900578e+08</td>\n",
" <td>174.161354</td>\n",
" <td>349.424019</td>\n",
" <td>8.235040e+04</td>\n",
" <td>4.824716e+05</td>\n",
" <td>157.680880</td>\n",
" <td>89.099554</td>\n",
" <td>289.644383</td>\n",
" <td>371.863224</td>\n",
" <td>162.024811</td>\n",
" <td>...</td>\n",
" <td>1.897986e+08</td>\n",
" <td>1.897902e+08</td>\n",
" <td>1.899721e+08</td>\n",
" <td>6.199704e+06</td>\n",
" <td>3.041810</td>\n",
" <td>1.705655e+06</td>\n",
" <td>6.647956e+05</td>\n",
" <td>347.877923</td>\n",
" <td>174.13813</td>\n",
" <td>14.914261</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>-1.800000e+01</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000e+00</td>\n",
" <td>0.000000e+00</td>\n",
" <td>-1.000000</td>\n",
" <td>-1.000000</td>\n",
" <td>-1.000000</td>\n",
" <td>-1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>-1.000000e+00</td>\n",
" <td>0.000000e+00</td>\n",
" <td>-1.000000e+00</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2.000000</td>\n",
" <td>-1.000000e+00</td>\n",
" <td>-1.000000e+00</td>\n",
" <td>0.000000</td>\n",
" <td>0.00000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>0.000000e+00</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>6.900000e+01</td>\n",
" <td>0.000000e+00</td>\n",
" <td>52.000000</td>\n",
" <td>-1.000000</td>\n",
" <td>52.000000</td>\n",
" <td>-1.000000</td>\n",
" <td>52.000000</td>\n",
" <td>...</td>\n",
" <td>-1.000000e+00</td>\n",
" <td>0.000000e+00</td>\n",
" <td>-1.000000e+00</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2.000000</td>\n",
" <td>0.000000e+00</td>\n",
" <td>-1.000000e+00</td>\n",
" <td>0.000000</td>\n",
" <td>1.00000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>2.445000e+04</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1.840000e+02</td>\n",
" <td>0.000000e+00</td>\n",
" <td>52.000000</td>\n",
" <td>-1.000000</td>\n",
" <td>83.000000</td>\n",
" <td>-1.000000</td>\n",
" <td>83.000000</td>\n",
" <td>...</td>\n",
" <td>-1.000000e+00</td>\n",
" <td>0.000000e+00</td>\n",
" <td>-1.000000e+00</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2.000000</td>\n",
" <td>8.761600e+04</td>\n",
" <td>-1.000000e+00</td>\n",
" <td>0.000000</td>\n",
" <td>1.00000</td>\n",
" <td>32.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>1.759751e+06</td>\n",
" <td>3.000000</td>\n",
" <td>1.000000</td>\n",
" <td>4.270000e+02</td>\n",
" <td>1.670000e+02</td>\n",
" <td>108.000000</td>\n",
" <td>52.000000</td>\n",
" <td>421.000000</td>\n",
" <td>115.000000</td>\n",
" <td>356.000000</td>\n",
" <td>...</td>\n",
" <td>1.013498e+06</td>\n",
" <td>1.291379e+06</td>\n",
" <td>1.306116e+06</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2.000000</td>\n",
" <td>3.046400e+05</td>\n",
" <td>9.049600e+04</td>\n",
" <td>1.000000</td>\n",
" <td>3.00000</td>\n",
" <td>32.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>4.431076e+10</td>\n",
" <td>48255.000000</td>\n",
" <td>74768.000000</td>\n",
" <td>4.049644e+07</td>\n",
" <td>1.039222e+08</td>\n",
" <td>1390.000000</td>\n",
" <td>1390.000000</td>\n",
" <td>1500.000000</td>\n",
" <td>1390.000000</td>\n",
" <td>1390.000000</td>\n",
" <td>...</td>\n",
" <td>4.431072e+10</td>\n",
" <td>4.430000e+10</td>\n",
" <td>4.431072e+10</td>\n",
" <td>8.470000e+08</td>\n",
" <td>2269.000000</td>\n",
" <td>4.194240e+06</td>\n",
" <td>4.194240e+06</td>\n",
" <td>74524.000000</td>\n",
" <td>48255.00000</td>\n",
" <td>44.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>8 rows × 79 columns</p>\n",
"</div>"
],
"text/plain": [
" duration total_fpackets total_bpackets total_fpktl \\\n",
"count 6.319550e+05 631955.000000 631955.000000 6.319550e+05 \n",
"mean 2.195245e+07 6.728514 10.431934 9.540172e+02 \n",
"std 1.900578e+08 174.161354 349.424019 8.235040e+04 \n",
"min -1.800000e+01 0.000000 0.000000 0.000000e+00 \n",
"25% 0.000000e+00 1.000000 0.000000 6.900000e+01 \n",
"50% 2.445000e+04 1.000000 0.000000 1.840000e+02 \n",
"75% 1.759751e+06 3.000000 1.000000 4.270000e+02 \n",
"max 4.431076e+10 48255.000000 74768.000000 4.049644e+07 \n",
"\n",
" total_bpktl min_fpktl min_bpktl max_fpktl \\\n",
"count 6.319550e+05 631955.000000 631955.000000 631955.000000 \n",
"mean 1.206042e+04 141.475727 44.357688 263.675901 \n",
"std 4.824716e+05 157.680880 89.099554 289.644383 \n",
"min 0.000000e+00 -1.000000 -1.000000 -1.000000 \n",
"25% 0.000000e+00 52.000000 -1.000000 52.000000 \n",
"50% 0.000000e+00 52.000000 -1.000000 83.000000 \n",
"75% 1.670000e+02 108.000000 52.000000 421.000000 \n",
"max 1.039222e+08 1390.000000 1390.000000 1500.000000 \n",
"\n",
" max_bpktl mean_fpktl ... min_idle mean_idle \\\n",
"count 631955.000000 631955.000000 ... 6.319550e+05 6.319550e+05 \n",
"mean 183.248084 174.959706 ... 1.997327e+07 2.031228e+07 \n",
"std 371.863224 162.024811 ... 1.897986e+08 1.897902e+08 \n",
"min -1.000000 0.000000 ... -1.000000e+00 0.000000e+00 \n",
"25% -1.000000 52.000000 ... -1.000000e+00 0.000000e+00 \n",
"50% -1.000000 83.000000 ... -1.000000e+00 0.000000e+00 \n",
"75% 115.000000 356.000000 ... 1.013498e+06 1.291379e+06 \n",
"max 1390.000000 1390.000000 ... 4.431072e+10 4.430000e+10 \n",
"\n",
" max_idle std_idle FFNEPD Init_Win_bytes_forward \\\n",
"count 6.319550e+05 6.319550e+05 631955.000000 6.319550e+05 \n",
"mean 2.075238e+07 4.663875e+05 2.360896 9.620796e+05 \n",
"std 1.899721e+08 6.199704e+06 3.041810 1.705655e+06 \n",
"min -1.000000e+00 0.000000e+00 2.000000 -1.000000e+00 \n",
"25% -1.000000e+00 0.000000e+00 2.000000 0.000000e+00 \n",
"50% -1.000000e+00 0.000000e+00 2.000000 8.761600e+04 \n",
"75% 1.306116e+06 0.000000e+00 2.000000 3.046400e+05 \n",
"max 4.431072e+10 8.470000e+08 2269.000000 4.194240e+06 \n",
"\n",
" Init_Win_bytes_backward RRT_samples_clnt Act_data_pkt_forward \\\n",
"count 6.319550e+05 631955.000000 631955.00000 \n",
"mean 3.104519e+05 9.733144 6.72471 \n",
"std 6.647956e+05 347.877923 174.13813 \n",
"min -1.000000e+00 0.000000 0.00000 \n",
"25% -1.000000e+00 0.000000 1.00000 \n",
"50% -1.000000e+00 0.000000 1.00000 \n",
"75% 9.049600e+04 1.000000 3.00000 \n",
"max 4.194240e+06 74524.000000 48255.00000 \n",
"\n",
" min_seg_size_forward \n",
"count 631955.000000 \n",
"mean 19.965713 \n",
"std 14.914261 \n",
"min 0.000000 \n",
"25% 0.000000 \n",
"50% 32.000000 \n",
"75% 32.000000 \n",
"max 44.000000 \n",
"\n",
"[8 rows x 79 columns]"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe()"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 631955 entries, 0 to 631954\n",
"Data columns (total 80 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 duration 631955 non-null int64 \n",
" 1 total_fpackets 631955 non-null int64 \n",
" 2 total_bpackets 631955 non-null int64 \n",
" 3 total_fpktl 631955 non-null int64 \n",
" 4 total_bpktl 631955 non-null int64 \n",
" 5 min_fpktl 631955 non-null int64 \n",
" 6 min_bpktl 631955 non-null int64 \n",
" 7 max_fpktl 631955 non-null int64 \n",
" 8 max_bpktl 631955 non-null int64 \n",
" 9 mean_fpktl 631955 non-null float64\n",
" 10 mean_bpktl 631955 non-null float64\n",
" 11 std_fpktl 631955 non-null float64\n",
" 12 std_bpktl 631955 non-null float64\n",
" 13 total_fiat 631955 non-null int64 \n",
" 14 total_biat 631955 non-null int64 \n",
" 15 min_fiat 631955 non-null int64 \n",
" 16 min_biat 631955 non-null int64 \n",
" 17 max_fiat 631955 non-null int64 \n",
" 18 max_biat 631955 non-null int64 \n",
" 19 mean_fiat 631955 non-null float64\n",
" 20 mean_biat 631955 non-null float64\n",
" 21 std_fiat 631955 non-null float64\n",
" 22 std_biat 631955 non-null float64\n",
" 23 fpsh_cnt 631955 non-null int64 \n",
" 24 bpsh_cnt 631955 non-null int64 \n",
" 25 furg_cnt 631955 non-null int64 \n",
" 26 burg_cnt 631955 non-null int64 \n",
" 27 total_fhlen 631955 non-null int64 \n",
" 28 total_bhlen 631955 non-null int64 \n",
" 29 fPktsPerSecond 631955 non-null float64\n",
" 30 bPktsPerSecond 631955 non-null float64\n",
" 31 flowPktsPerSecond 631955 non-null float64\n",
" 32 flowBytesPerSecond 631955 non-null float64\n",
" 33 min_flowpktl 631955 non-null int64 \n",
" 34 max_flowpktl 631955 non-null int64 \n",
" 35 mean_flowpktl 631955 non-null float64\n",
" 36 std_flowpktl 631955 non-null float64\n",
" 37 min_flowiat 631955 non-null int64 \n",
" 38 max_flowiat 631955 non-null int64 \n",
" 39 mean_flowiat 631955 non-null float64\n",
" 40 std_flowiat 631955 non-null float64\n",
" 41 flow_fin 631955 non-null int64 \n",
" 42 flow_syn 631955 non-null int64 \n",
" 43 flow_rst 631955 non-null int64 \n",
" 44 flow_psh 631955 non-null int64 \n",
" 45 flow_ack 631955 non-null int64 \n",
" 46 flow_urg 631955 non-null int64 \n",
" 47 flow_cwr 631955 non-null int64 \n",
" 48 flow_ece 631955 non-null int64 \n",
" 49 downUpRatio 631955 non-null float64\n",
" 50 avgPacketSize 631955 non-null float64\n",
" 51 fAvgSegmentSize 631955 non-null float64\n",
" 52 fHeaderBytes 631955 non-null int64 \n",
" 53 fAvgBytesPerBulk 631955 non-null int64 \n",
" 54 fAvgPacketsPerBulk 631955 non-null int64 \n",
" 55 fAvgBulkRate 631955 non-null int64 \n",
" 56 bVarianceDataBytes 631955 non-null float64\n",
" 57 bAvgSegmentSize 631955 non-null int64 \n",
" 58 bAvgBytesPerBulk 631955 non-null int64 \n",
" 59 bAvgPacketsPerBulk 631955 non-null int64 \n",
" 60 bAvgBulkRate 631955 non-null int64 \n",
" 61 sflow_fpacket 631955 non-null int64 \n",
" 62 sflow_fbytes 631955 non-null int64 \n",
" 63 sflow_bpacket 631955 non-null int64 \n",
" 64 sflow_bbytes 631955 non-null int64 \n",
" 65 min_active 631955 non-null int64 \n",
" 66 mean_active 631955 non-null float64\n",
" 67 max_active 631955 non-null int64 \n",
" 68 std_active 631955 non-null float64\n",
" 69 min_idle 631955 non-null int64 \n",
" 70 mean_idle 631955 non-null float64\n",
" 71 max_idle 631955 non-null int64 \n",
" 72 std_idle 631955 non-null float64\n",
" 73 FFNEPD 631955 non-null int64 \n",
" 74 Init_Win_bytes_forward 631955 non-null int64 \n",
" 75 Init_Win_bytes_backward 631955 non-null int64 \n",
" 76 RRT_samples_clnt 631955 non-null int64 \n",
" 77 Act_data_pkt_forward 631955 non-null int64 \n",
" 78 min_seg_size_forward 631955 non-null int64 \n",
" 79 calss 631955 non-null object \n",
"dtypes: float64(24), int64(55), object(1)\n",
"memory usage: 385.7+ MB\n"
]
}
],
"source": [
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"benign 471597\n",
"asware 155613\n",
"GeneralMalware 4745\n",
"Name: calss, dtype: int64"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['calss'].value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h2 style=\"color:blue\">5. Extracción de características: PCA</h2>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"El algoritmo PCA sirve para la extracción de características, y la diferencia fundamental con la selección de características es que nosotros vamos a **reducir el conjunto de datos original y transformarlo en un conjunto de datos nuevo**.\n",
"\n",
"Vamos a reducir la dimensionalidad pero tambien van a modificarse los valores de las características que se mantienen. "
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"# Separamos las variables de entrada (X) de la etiqueta (y)\n",
"X_df, y_df = remove_labels(df, 'calss')"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>duration</th>\n",
" <th>total_fpackets</th>\n",
" <th>total_bpackets</th>\n",
" <th>total_fpktl</th>\n",
" <th>total_bpktl</th>\n",
" <th>min_fpktl</th>\n",
" <th>min_bpktl</th>\n",
" <th>max_fpktl</th>\n",
" <th>max_bpktl</th>\n",
" <th>mean_fpktl</th>\n",
" <th>...</th>\n",
" <th>min_idle</th>\n",
" <th>mean_idle</th>\n",
" <th>max_idle</th>\n",
" <th>std_idle</th>\n",
" <th>FFNEPD</th>\n",
" <th>Init_Win_bytes_forward</th>\n",
" <th>Init_Win_bytes_backward</th>\n",
" <th>RRT_samples_clnt</th>\n",
" <th>Act_data_pkt_forward</th>\n",
" <th>min_seg_size_forward</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1020586</td>\n",
" <td>668</td>\n",
" <td>1641</td>\n",
" <td>35692</td>\n",
" <td>2276876</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>679</td>\n",
" <td>1390</td>\n",
" <td>53.431138</td>\n",
" <td>...</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>4194240</td>\n",
" <td>1853440</td>\n",
" <td>1640</td>\n",
" <td>668</td>\n",
" <td>32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>80794</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>75</td>\n",
" <td>124</td>\n",
" <td>75</td>\n",
" <td>124</td>\n",
" <td>75</td>\n",
" <td>124</td>\n",
" <td>75.000000</td>\n",
" <td>...</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>998</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>187</td>\n",
" <td>0</td>\n",
" <td>52</td>\n",
" <td>-1</td>\n",
" <td>83</td>\n",
" <td>-1</td>\n",
" <td>62.333333</td>\n",
" <td>...</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>4</td>\n",
" <td>101888</td>\n",
" <td>-1</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>189868</td>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>1448</td>\n",
" <td>6200</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>706</td>\n",
" <td>1390</td>\n",
" <td>160.888889</td>\n",
" <td>...</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>4194240</td>\n",
" <td>2722560</td>\n",
" <td>8</td>\n",
" <td>9</td>\n",
" <td>32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>110577</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>528</td>\n",
" <td>1422</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>331</td>\n",
" <td>1005</td>\n",
" <td>132.000000</td>\n",
" <td>...</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>155136</td>\n",
" <td>31232</td>\n",
" <td>5</td>\n",
" <td>4</td>\n",
" <td>32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631950</th>\n",
" <td>530</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>74</td>\n",
" <td>334</td>\n",
" <td>74</td>\n",
" <td>334</td>\n",
" <td>74</td>\n",
" <td>334</td>\n",
" <td>74.000000</td>\n",
" <td>...</td>\n",
" <td>-1</td>\n",
" <td>0.0</td>\n",
" <td>-1</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631951</th>\n",
" <td>50240627</td>\n",
" <td>23</td>\n",
" <td>24</td>\n",
" <td>4767</td>\n",
" <td>6107</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>533</td>\n",
" <td>855</td>\n",
" <td>207.260870</td>\n",
" <td>...</td>\n",
" <td>9655008</td>\n",
" <td>9842879.0</td>\n",
" <td>9964749</td>\n",
" <td>1.196806e+05</td>\n",
" <td>2</td>\n",
" <td>317952</td>\n",
" <td>107008</td>\n",
" <td>11</td>\n",
" <td>23</td>\n",
" <td>32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631952</th>\n",
" <td>35471450</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>52</td>\n",
" <td>104</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>52.000000</td>\n",
" <td>...</td>\n",
" <td>35290631</td>\n",
" <td>35300000.0</td>\n",
" <td>35290631</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2</td>\n",
" <td>3904</td>\n",
" <td>88704</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631953</th>\n",
" <td>41713629</td>\n",
" <td>12</td>\n",
" <td>26</td>\n",
" <td>1821</td>\n",
" <td>18643</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>489</td>\n",
" <td>1390</td>\n",
" <td>151.750000</td>\n",
" <td>...</td>\n",
" <td>7740379</td>\n",
" <td>20200000.0</td>\n",
" <td>32711382</td>\n",
" <td>1.770000e+07</td>\n",
" <td>2</td>\n",
" <td>227456</td>\n",
" <td>2432</td>\n",
" <td>23</td>\n",
" <td>12</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631954</th>\n",
" <td>50110119</td>\n",
" <td>20</td>\n",
" <td>23</td>\n",
" <td>4130</td>\n",
" <td>6043</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>533</td>\n",
" <td>855</td>\n",
" <td>206.500000</td>\n",
" <td>...</td>\n",
" <td>9792882</td>\n",
" <td>9873329.4</td>\n",
" <td>9906007</td>\n",
" <td>4.737363e+04</td>\n",
" <td>2</td>\n",
" <td>266112</td>\n",
" <td>59904</td>\n",
" <td>11</td>\n",
" <td>20</td>\n",
" <td>32</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>631955 rows × 79 columns</p>\n",
"</div>"
],
"text/plain": [
" duration total_fpackets total_bpackets total_fpktl total_bpktl \\\n",
"0 1020586 668 1641 35692 2276876 \n",
"1 80794 1 1 75 124 \n",
"2 998 3 0 187 0 \n",
"3 189868 9 9 1448 6200 \n",
"4 110577 4 6 528 1422 \n",
"... ... ... ... ... ... \n",
"631950 530 1 1 74 334 \n",
"631951 50240627 23 24 4767 6107 \n",
"631952 35471450 1 2 52 104 \n",
"631953 41713629 12 26 1821 18643 \n",
"631954 50110119 20 23 4130 6043 \n",
"\n",
" min_fpktl min_bpktl max_fpktl max_bpktl mean_fpktl ... min_idle \\\n",
"0 52 52 679 1390 53.431138 ... -1 \n",
"1 75 124 75 124 75.000000 ... -1 \n",
"2 52 -1 83 -1 62.333333 ... -1 \n",
"3 52 52 706 1390 160.888889 ... -1 \n",
"4 52 52 331 1005 132.000000 ... -1 \n",
"... ... ... ... ... ... ... ... \n",
"631950 74 334 74 334 74.000000 ... -1 \n",
"631951 52 52 533 855 207.260870 ... 9655008 \n",
"631952 52 52 52 52 52.000000 ... 35290631 \n",
"631953 40 40 489 1390 151.750000 ... 7740379 \n",
"631954 52 52 533 855 206.500000 ... 9792882 \n",
"\n",
" mean_idle max_idle std_idle FFNEPD Init_Win_bytes_forward \\\n",
"0 0.0 -1 0.000000e+00 2 4194240 \n",
"1 0.0 -1 0.000000e+00 2 0 \n",
"2 0.0 -1 0.000000e+00 4 101888 \n",
"3 0.0 -1 0.000000e+00 2 4194240 \n",
"4 0.0 -1 0.000000e+00 2 155136 \n",
"... ... ... ... ... ... \n",
"631950 0.0 -1 0.000000e+00 2 0 \n",
"631951 9842879.0 9964749 1.196806e+05 2 317952 \n",
"631952 35300000.0 35290631 0.000000e+00 2 3904 \n",
"631953 20200000.0 32711382 1.770000e+07 2 227456 \n",
"631954 9873329.4 9906007 4.737363e+04 2 266112 \n",
"\n",
" Init_Win_bytes_backward RRT_samples_clnt Act_data_pkt_forward \\\n",
"0 1853440 1640 668 \n",
"1 0 0 1 \n",
"2 -1 0 3 \n",
"3 2722560 8 9 \n",
"4 31232 5 4 \n",
"... ... ... ... \n",
"631950 0 0 1 \n",
"631951 107008 11 23 \n",
"631952 88704 1 1 \n",
"631953 2432 23 12 \n",
"631954 59904 11 20 \n",
"\n",
" min_seg_size_forward \n",
"0 32 \n",
"1 0 \n",
"2 32 \n",
"3 32 \n",
"4 32 \n",
"... ... \n",
"631950 0 \n",
"631951 32 \n",
"631952 32 \n",
"631953 20 \n",
"631954 32 \n",
"\n",
"[631955 rows x 79 columns]"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Variables de entrada\n",
"X_df"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 benign\n",
"1 benign\n",
"2 benign\n",
"3 benign\n",
"4 benign\n",
" ... \n",
"631950 benign\n",
"631951 GeneralMalware\n",
"631952 asware\n",
"631953 benign\n",
"631954 GeneralMalware\n",
"Name: calss, Length: 631955, dtype: object"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Variables de salida\n",
"y_df"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 0, 0, ..., 1, 0, 2], dtype=int64)"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Transformamos y a valor numérico\n",
"y_df = y_df.factorize()[0]\n",
"y_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**La extracción de características es una técnica muy útil para representar un conjunto de datos multidimensional y ganar intuiciones sobre los límites de decisión que construye un algoritmo. Para ello podemos utilizar el algoritmo PCA y reducir el numero de características a 2.**\n",
"\n",
"Las técnicas de extracción de características como PCA, son muy útiles para transformar ese conjunto de datos inicial con muchas características o dimensiones en un conjunto de datos diferente pero que mantiene la distribución del conjunto de datos original, además tiene 2 ó 3 características, de manera que podemos representarlo gráficamente."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.decomposition import PCA\n",
"\n",
"# Reducimos el conjunto de datos a 2 dimensiones utilizando el algoritmo PCA\n",
"\n",
"# Instanciamos la clase PCA en el objeto \"pca\", pasándole como parámetro \"n_components=2\", que es el número de componentes\n",
"# o dimensiones.\n",
"pca = PCA(n_components=2)\n",
"\n",
"# aplicamos la propiedad fit_transform en X_df\n",
"df_reduced = pca.fit_transform(X_df)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>c1</th>\n",
" <th>c2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-6.653632e+07</td>\n",
" <td>-9.564604e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-6.704580e+07</td>\n",
" <td>-9.898031e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-6.712784e+07</td>\n",
" <td>-9.875840e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-6.699982e+07</td>\n",
" <td>-9.782837e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-6.702599e+07</td>\n",
" <td>-9.829385e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631950</th>\n",
" <td>-6.712883e+07</td>\n",
" <td>-9.876545e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631951</th>\n",
" <td>-1.490810e+07</td>\n",
" <td>1.783457e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631952</th>\n",
" <td>2.098170e+07</td>\n",
" <td>6.844411e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631953</th>\n",
" <td>1.163357e+07</td>\n",
" <td>3.237585e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631954</th>\n",
" <td>-1.486282e+07</td>\n",
" <td>1.778576e+07</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>631955 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" c1 c2\n",
"0 -6.653632e+07 -9.564604e+06\n",
"1 -6.704580e+07 -9.898031e+06\n",
"2 -6.712784e+07 -9.875840e+06\n",
"3 -6.699982e+07 -9.782837e+06\n",
"4 -6.702599e+07 -9.829385e+06\n",
"... ... ...\n",
"631950 -6.712883e+07 -9.876545e+06\n",
"631951 -1.490810e+07 1.783457e+07\n",
"631952 2.098170e+07 6.844411e+07\n",
"631953 1.163357e+07 3.237585e+07\n",
"631954 -1.486282e+07 1.778576e+07\n",
"\n",
"[631955 rows x 2 columns]"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Construimos nuestro nuevo conjunto de datos con 2 dimensiones\n",
"# Mantenemos los 631955 registros pero hemos transformado esas 79 columnas, características o atributos de entrada en \n",
"# 2 únicos atributos o columnas.\n",
"df_reduced = pd.DataFrame(df_reduced, columns=[\"c1\", \"c2\"])\n",
"df_reduced"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>c1</th>\n",
" <th>c2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-6.653632e+07</td>\n",
" <td>-9.564604e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-6.704580e+07</td>\n",
" <td>-9.898031e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-6.712784e+07</td>\n",
" <td>-9.875840e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-6.699982e+07</td>\n",
" <td>-9.782837e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-6.702599e+07</td>\n",
" <td>-9.829385e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>-6.691581e+07</td>\n",
" <td>-9.791010e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>-6.713106e+07</td>\n",
" <td>-9.880533e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>-6.709856e+07</td>\n",
" <td>-9.884049e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>-6.610628e+07</td>\n",
" <td>-9.807246e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>-6.705952e+07</td>\n",
" <td>-9.848264e+06</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" c1 c2\n",
"0 -6.653632e+07 -9.564604e+06\n",
"1 -6.704580e+07 -9.898031e+06\n",
"2 -6.712784e+07 -9.875840e+06\n",
"3 -6.699982e+07 -9.782837e+06\n",
"4 -6.702599e+07 -9.829385e+06\n",
"5 -6.691581e+07 -9.791010e+06\n",
"6 -6.713106e+07 -9.880533e+06\n",
"7 -6.709856e+07 -9.884049e+06\n",
"8 -6.610628e+07 -9.807246e+06\n",
"9 -6.705952e+07 -9.848264e+06"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 10 primeros registros\n",
"df_reduced.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Representamos el nuevo conjunto de datos con dos características de entrada y tres categorías (y)**"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"plt.figure(figsize=(12, 6))\n",
"plt.plot(df_reduced[\"c1\"][y_df==0], df_reduced[\"c2\"][y_df==0], \"yo\", label=\"normal\")\n",
"plt.plot(df_reduced[\"c1\"][y_df==1], df_reduced[\"c2\"][y_df==1], \"bs\", label=\"adware\")\n",
"plt.plot(df_reduced[\"c1\"][y_df==2], df_reduced[\"c2\"][y_df==2], \"g^\", label=\"malware\")\n",
"plt.xlabel(\"c1\", fontsize=15)\n",
"plt.ylabel(\"c2\", fontsize=15, rotation=0)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.91695209, 0.05610877])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Calculamos la proporción de varianza que se ha preservado del conjunto original\n",
"pca.explained_variance_ratio_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"El resultado anterior nos indica que el 91,6% de la varianza del conjunto de datos original se mantiene en el primer eje, y el 5,6% en el segundo eje. Esto quiere decir que aproximadamente 2,8% de la varianza se mantiene en el resto de ejes que no se han utilizado para construir el nuevo conjunto, por lo tanto, es razonable pensar que el resto de características del conjunto de datos no aportaban demasiada información."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Representamos el límite de decisión que generaría un algoritmo en este nuevo conjunto de datos reducido**"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini',\n",
" max_depth=3, max_features=None, max_leaf_nodes=None,\n",
" min_impurity_decrease=0.0, min_impurity_split=None,\n",
" min_samples_leaf=1, min_samples_split=2,\n",
" min_weight_fraction_leaf=0.0, presort='deprecated',\n",
" random_state=42, splitter='best')"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Generamos un modelo con el conjunto de datos reducido\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"\n",
"clf_tree_reduced = DecisionTreeClassifier(max_depth=3, random_state=42)\n",
"clf_tree_reduced.fit(df_reduced, y_df)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Representamos el límite de decisión generado por el modelo\n",
"from matplotlib.colors import ListedColormap\n",
"\n",
"def plot_decision_boundary(clf, X, y, plot_training=True, resolution=1000):\n",
" mins = X.min(axis=0) - 1\n",
" maxs = X.max(axis=0) + 1\n",
" x1, x2 = np.meshgrid(np.linspace(mins[0], maxs[0], resolution),\n",
" np.linspace(mins[1], maxs[1], resolution))\n",
" X_new = np.c_[x1.ravel(), x2.ravel()]\n",
" y_pred = clf.predict(X_new).reshape(x1.shape)\n",
" custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])\n",
" plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)\n",
" custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])\n",
" plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)\n",
" if plot_training:\n",
" plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"yo\", label=\"normal\")\n",
" plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"bs\", label=\"adware\")\n",
" plt.plot(X[:, 0][y==2], X[:, 1][y==2], \"g^\", label=\"malware\")\n",
" plt.axis([mins[0], maxs[0], mins[1], maxs[1]]) \n",
" plt.xlabel(r\"$x_1$\", fontsize=18)\n",
" plt.ylabel(r\"$x_2$\", fontsize=18, rotation=0)\n",
"\n",
"plt.figure(figsize=(12, 6))\n",
"plot_decision_boundary(clf_tree_reduced, df_reduced.values, y_df)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Si nuestro objetivo no es visualizar el conjunto de datos, sino reducir la dimensionalidad del conjunto de datos original, en lugar de seleccionar arbitrariamente el numero de dimensiones, sklearn nos proporciona un mecanismo para seleccionar aquellas dimensiones que mantienen un determinado porcetaje de varianza."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"# Reducimos el conjunto de datos manteniendo el 99,9% de varianza\n",
"from sklearn.decomposition import PCA\n",
"\n",
"pca = PCA(n_components=0.999)\n",
"df_reduced = pca.fit_transform(X_df)"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Número de componentes: 6\n"
]
}
],
"source": [
"# Numero de dimensionaes del nuevo conjunto\n",
"print(\"Número de componentes:\", pca.n_components_)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([9.16952089e-01, 5.61087653e-02, 2.16566915e-02, 3.65011318e-03,\n",
" 5.56686331e-04, 3.79356201e-04])"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Calculamos la proporción de varianza que se ha preservado del conjunto original\n",
"pca.explained_variance_ratio_"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>c1</th>\n",
" <th>c2</th>\n",
" <th>c3</th>\n",
" <th>c4</th>\n",
" <th>c5</th>\n",
" <th>c6</th>\n",
" <th>Class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-6.653632e+07</td>\n",
" <td>-9.564604e+06</td>\n",
" <td>3.437284e+06</td>\n",
" <td>-2.949219e+06</td>\n",
" <td>1.822415e+06</td>\n",
" <td>-1.049114e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-6.704580e+07</td>\n",
" <td>-9.898031e+06</td>\n",
" <td>3.424601e+06</td>\n",
" <td>-3.127607e+06</td>\n",
" <td>2.800781e+06</td>\n",
" <td>-1.063954e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-6.712784e+07</td>\n",
" <td>-9.875840e+06</td>\n",
" <td>3.461085e+06</td>\n",
" <td>-3.118886e+06</td>\n",
" <td>2.823975e+06</td>\n",
" <td>-1.022121e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-6.699982e+07</td>\n",
" <td>-9.782837e+06</td>\n",
" <td>3.436564e+06</td>\n",
" <td>-3.051254e+06</td>\n",
" <td>2.557188e+06</td>\n",
" <td>-9.126112e+05</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-6.702599e+07</td>\n",
" <td>-9.829385e+06</td>\n",
" <td>3.484764e+06</td>\n",
" <td>-3.108501e+06</td>\n",
" <td>2.726738e+06</td>\n",
" <td>-1.074407e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631950</th>\n",
" <td>-6.712883e+07</td>\n",
" <td>-9.876545e+06</td>\n",
" <td>3.460169e+06</td>\n",
" <td>-3.121068e+06</td>\n",
" <td>2.841346e+06</td>\n",
" <td>-1.034425e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631951</th>\n",
" <td>-1.490810e+07</td>\n",
" <td>1.783457e+07</td>\n",
" <td>3.127773e+06</td>\n",
" <td>7.128419e+06</td>\n",
" <td>-3.846691e+07</td>\n",
" <td>-8.013578e+06</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631952</th>\n",
" <td>2.098170e+07</td>\n",
" <td>6.844411e+07</td>\n",
" <td>-3.376382e+07</td>\n",
" <td>-2.849601e+07</td>\n",
" <td>2.306222e+06</td>\n",
" <td>-3.567339e+05</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631953</th>\n",
" <td>1.163357e+07</td>\n",
" <td>3.237585e+07</td>\n",
" <td>5.077168e+06</td>\n",
" <td>1.323917e+07</td>\n",
" <td>-5.531286e+07</td>\n",
" <td>-1.294719e+07</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>631954</th>\n",
" <td>-1.486282e+07</td>\n",
" <td>1.778576e+07</td>\n",
" <td>3.238090e+06</td>\n",
" <td>7.021148e+06</td>\n",
" <td>-3.809729e+07</td>\n",
" <td>-8.235398e+06</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>631955 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" c1 c2 c3 c4 c5 \\\n",
"0 -6.653632e+07 -9.564604e+06 3.437284e+06 -2.949219e+06 1.822415e+06 \n",
"1 -6.704580e+07 -9.898031e+06 3.424601e+06 -3.127607e+06 2.800781e+06 \n",
"2 -6.712784e+07 -9.875840e+06 3.461085e+06 -3.118886e+06 2.823975e+06 \n",
"3 -6.699982e+07 -9.782837e+06 3.436564e+06 -3.051254e+06 2.557188e+06 \n",
"4 -6.702599e+07 -9.829385e+06 3.484764e+06 -3.108501e+06 2.726738e+06 \n",
"... ... ... ... ... ... \n",
"631950 -6.712883e+07 -9.876545e+06 3.460169e+06 -3.121068e+06 2.841346e+06 \n",
"631951 -1.490810e+07 1.783457e+07 3.127773e+06 7.128419e+06 -3.846691e+07 \n",
"631952 2.098170e+07 6.844411e+07 -3.376382e+07 -2.849601e+07 2.306222e+06 \n",
"631953 1.163357e+07 3.237585e+07 5.077168e+06 1.323917e+07 -5.531286e+07 \n",
"631954 -1.486282e+07 1.778576e+07 3.238090e+06 7.021148e+06 -3.809729e+07 \n",
"\n",
" c6 Class \n",
"0 -1.049114e+06 0 \n",
"1 -1.063954e+06 0 \n",
"2 -1.022121e+06 0 \n",
"3 -9.126112e+05 0 \n",
"4 -1.074407e+06 0 \n",
"... ... ... \n",
"631950 -1.034425e+06 0 \n",
"631951 -8.013578e+06 2 \n",
"631952 -3.567339e+05 1 \n",
"631953 -1.294719e+07 0 \n",
"631954 -8.235398e+06 2 \n",
"\n",
"[631955 rows x 7 columns]"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Transformamos a un DataFrame de Pandas\n",
"df_reduced = pd.DataFrame(df_reduced, columns=[\"c1\", \"c2\", \"c3\", \"c4\", \"c5\", \"c6\"])\n",
"df_reduced[\"Class\"] = y_df\n",
"df_reduced"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h2 style=\"color:blue\">6. División del conjunto de datos</h2>"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"# Dividimos el conjunto de datos\n",
"train_set, val_set, test_set = train_val_test_split(df_reduced)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>c1</th>\n",
" <th>c2</th>\n",
" <th>c3</th>\n",
" <th>c4</th>\n",
" <th>c5</th>\n",
" <th>c6</th>\n",
" <th>Class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>508881</th>\n",
" <td>-6.712885e+07</td>\n",
" <td>-9.876478e+06</td>\n",
" <td>3.460136e+06</td>\n",
" <td>-3.120779e+06</td>\n",
" <td>2.838979e+06</td>\n",
" <td>-1.032784e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>208326</th>\n",
" <td>-6.712918e+07</td>\n",
" <td>-9.875923e+06</td>\n",
" <td>3.459967e+06</td>\n",
" <td>-3.118586e+06</td>\n",
" <td>2.821194e+06</td>\n",
" <td>-1.020321e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>107213</th>\n",
" <td>-6.712918e+07</td>\n",
" <td>-9.875923e+06</td>\n",
" <td>3.459967e+06</td>\n",
" <td>-3.118586e+06</td>\n",
" <td>2.821194e+06</td>\n",
" <td>-1.020321e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>466726</th>\n",
" <td>-6.710449e+07</td>\n",
" <td>-9.882485e+06</td>\n",
" <td>3.449502e+06</td>\n",
" <td>-3.121323e+06</td>\n",
" <td>2.815688e+06</td>\n",
" <td>-1.033614e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>230085</th>\n",
" <td>-6.712918e+07</td>\n",
" <td>-9.875923e+06</td>\n",
" <td>3.459967e+06</td>\n",
" <td>-3.118586e+06</td>\n",
" <td>2.821194e+06</td>\n",
" <td>-1.020321e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>110268</th>\n",
" <td>-4.875034e+07</td>\n",
" <td>-1.097862e+07</td>\n",
" <td>3.460739e+06</td>\n",
" <td>-3.015505e+06</td>\n",
" <td>1.066143e+05</td>\n",
" <td>-2.308220e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>259178</th>\n",
" <td>3.783083e+07</td>\n",
" <td>-2.111494e+07</td>\n",
" <td>1.301973e+04</td>\n",
" <td>-3.084080e+06</td>\n",
" <td>2.770827e+06</td>\n",
" <td>-1.000296e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>365838</th>\n",
" <td>-6.706623e+07</td>\n",
" <td>-9.836596e+06</td>\n",
" <td>3.462837e+06</td>\n",
" <td>-3.084332e+06</td>\n",
" <td>2.701442e+06</td>\n",
" <td>-9.492921e+05</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>131932</th>\n",
" <td>-6.712918e+07</td>\n",
" <td>-9.875909e+06</td>\n",
" <td>3.459959e+06</td>\n",
" <td>-3.118507e+06</td>\n",
" <td>2.820990e+06</td>\n",
" <td>-1.020006e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>121958</th>\n",
" <td>-6.712918e+07</td>\n",
" <td>-9.875923e+06</td>\n",
" <td>3.459967e+06</td>\n",
" <td>-3.118586e+06</td>\n",
" <td>2.821194e+06</td>\n",
" <td>-1.020321e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>379173 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" c1 c2 c3 c4 c5 \\\n",
"508881 -6.712885e+07 -9.876478e+06 3.460136e+06 -3.120779e+06 2.838979e+06 \n",
"208326 -6.712918e+07 -9.875923e+06 3.459967e+06 -3.118586e+06 2.821194e+06 \n",
"107213 -6.712918e+07 -9.875923e+06 3.459967e+06 -3.118586e+06 2.821194e+06 \n",
"466726 -6.710449e+07 -9.882485e+06 3.449502e+06 -3.121323e+06 2.815688e+06 \n",
"230085 -6.712918e+07 -9.875923e+06 3.459967e+06 -3.118586e+06 2.821194e+06 \n",
"... ... ... ... ... ... \n",
"110268 -4.875034e+07 -1.097862e+07 3.460739e+06 -3.015505e+06 1.066143e+05 \n",
"259178 3.783083e+07 -2.111494e+07 1.301973e+04 -3.084080e+06 2.770827e+06 \n",
"365838 -6.706623e+07 -9.836596e+06 3.462837e+06 -3.084332e+06 2.701442e+06 \n",
"131932 -6.712918e+07 -9.875909e+06 3.459959e+06 -3.118507e+06 2.820990e+06 \n",
"121958 -6.712918e+07 -9.875923e+06 3.459967e+06 -3.118586e+06 2.821194e+06 \n",
"\n",
" c6 Class \n",
"508881 -1.032784e+06 0 \n",
"208326 -1.020321e+06 0 \n",
"107213 -1.020321e+06 0 \n",
"466726 -1.033614e+06 0 \n",
"230085 -1.020321e+06 0 \n",
"... ... ... \n",
"110268 -2.308220e+06 0 \n",
"259178 -1.000296e+06 0 \n",
"365838 -9.492921e+05 0 \n",
"131932 -1.020006e+06 0 \n",
"121958 -1.020321e+06 0 \n",
"\n",
"[379173 rows x 7 columns]"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_set"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>c1</th>\n",
" <th>c2</th>\n",
" <th>c3</th>\n",
" <th>c4</th>\n",
" <th>c5</th>\n",
" <th>c6</th>\n",
" <th>Class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>240832</th>\n",
" <td>-3.522534e+07</td>\n",
" <td>-1.329271e+07</td>\n",
" <td>2.411139e+06</td>\n",
" <td>-3.109766e+06</td>\n",
" <td>2.811310e+06</td>\n",
" <td>-1.017766e+06</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>326539</th>\n",
" <td>-6.701093e+07</td>\n",
" <td>-9.907277e+06</td>\n",
" <td>3.409810e+06</td>\n",
" <td>-3.131379e+06</td>\n",
" <td>2.792243e+06</td>\n",
" <td>-1.082202e+06</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>200606</th>\n",
" <td>-6.712918e+07</td>\n",
" <td>-9.875923e+06</td>\n",
" <td>3.459967e+06</td>\n",
" <td>-3.118586e+06</td>\n",
" <td>2.821194e+06</td>\n",
" <td>-1.020321e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>431142</th>\n",
" <td>-4.256612e+07</td>\n",
" <td>-2.354263e+06</td>\n",
" <td>1.153506e+07</td>\n",
" <td>-3.312392e+06</td>\n",
" <td>2.921617e+06</td>\n",
" <td>-1.167700e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>478100</th>\n",
" <td>2.235887e+07</td>\n",
" <td>1.898609e+07</td>\n",
" <td>2.733221e+07</td>\n",
" <td>3.696151e+06</td>\n",
" <td>-5.782130e+06</td>\n",
" <td>1.849395e+07</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>215540</th>\n",
" <td>-3.968974e+07</td>\n",
" <td>-1.281458e+07</td>\n",
" <td>2.557897e+06</td>\n",
" <td>-3.110930e+06</td>\n",
" <td>2.812511e+06</td>\n",
" <td>-1.017843e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>516620</th>\n",
" <td>-6.713350e+07</td>\n",
" <td>-9.886325e+06</td>\n",
" <td>3.469475e+06</td>\n",
" <td>-3.171433e+06</td>\n",
" <td>3.265767e+06</td>\n",
" <td>-1.322324e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>592495</th>\n",
" <td>-6.696096e+07</td>\n",
" <td>-9.837763e+06</td>\n",
" <td>3.533368e+06</td>\n",
" <td>-3.174420e+06</td>\n",
" <td>2.691177e+06</td>\n",
" <td>-1.082761e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>279808</th>\n",
" <td>7.514034e+07</td>\n",
" <td>1.065070e+08</td>\n",
" <td>-4.535891e+07</td>\n",
" <td>3.717859e+07</td>\n",
" <td>2.080574e+06</td>\n",
" <td>6.265738e+06</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34456</th>\n",
" <td>-6.712918e+07</td>\n",
" <td>-9.875923e+06</td>\n",
" <td>3.459967e+06</td>\n",
" <td>-3.118586e+06</td>\n",
" <td>2.821194e+06</td>\n",
" <td>-1.020321e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>126391 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" c1 c2 c3 c4 c5 \\\n",
"240832 -3.522534e+07 -1.329271e+07 2.411139e+06 -3.109766e+06 2.811310e+06 \n",
"326539 -6.701093e+07 -9.907277e+06 3.409810e+06 -3.131379e+06 2.792243e+06 \n",
"200606 -6.712918e+07 -9.875923e+06 3.459967e+06 -3.118586e+06 2.821194e+06 \n",
"431142 -4.256612e+07 -2.354263e+06 1.153506e+07 -3.312392e+06 2.921617e+06 \n",
"478100 2.235887e+07 1.898609e+07 2.733221e+07 3.696151e+06 -5.782130e+06 \n",
"... ... ... ... ... ... \n",
"215540 -3.968974e+07 -1.281458e+07 2.557897e+06 -3.110930e+06 2.812511e+06 \n",
"516620 -6.713350e+07 -9.886325e+06 3.469475e+06 -3.171433e+06 3.265767e+06 \n",
"592495 -6.696096e+07 -9.837763e+06 3.533368e+06 -3.174420e+06 2.691177e+06 \n",
"279808 7.514034e+07 1.065070e+08 -4.535891e+07 3.717859e+07 2.080574e+06 \n",
"34456 -6.712918e+07 -9.875923e+06 3.459967e+06 -3.118586e+06 2.821194e+06 \n",
"\n",
" c6 Class \n",
"240832 -1.017766e+06 1 \n",
"326539 -1.082202e+06 1 \n",
"200606 -1.020321e+06 0 \n",
"431142 -1.167700e+06 0 \n",
"478100 1.849395e+07 0 \n",
"... ... ... \n",
"215540 -1.017843e+06 0 \n",
"516620 -1.322324e+06 0 \n",
"592495 -1.082761e+06 0 \n",
"279808 6.265738e+06 1 \n",
"34456 -1.020321e+06 0 \n",
"\n",
"[126391 rows x 7 columns]"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"val_set"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>c1</th>\n",
" <th>c2</th>\n",
" <th>c3</th>\n",
" <th>c4</th>\n",
" <th>c5</th>\n",
" <th>c6</th>\n",
" <th>Class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>541262</th>\n",
" <td>-4.331457e+07</td>\n",
" <td>-6.688204e+06</td>\n",
" <td>1.172307e+07</td>\n",
" <td>-3.208084e+06</td>\n",
" <td>-8.829879e+06</td>\n",
" <td>-4.193189e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>335127</th>\n",
" <td>-6.712687e+07</td>\n",
" <td>-9.876602e+06</td>\n",
" <td>3.459028e+06</td>\n",
" <td>-3.119139e+06</td>\n",
" <td>2.823132e+06</td>\n",
" <td>-1.023254e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>217235</th>\n",
" <td>-6.712918e+07</td>\n",
" <td>-9.875923e+06</td>\n",
" <td>3.459967e+06</td>\n",
" <td>-3.118586e+06</td>\n",
" <td>2.821194e+06</td>\n",
" <td>-1.020321e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>230087</th>\n",
" <td>8.906373e+07</td>\n",
" <td>1.181202e+08</td>\n",
" <td>-4.992390e+07</td>\n",
" <td>3.903072e+07</td>\n",
" <td>3.441380e+06</td>\n",
" <td>1.771358e+06</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>493773</th>\n",
" <td>-6.631246e+07</td>\n",
" <td>-9.493603e+06</td>\n",
" <td>3.510767e+06</td>\n",
" <td>-2.933745e+06</td>\n",
" <td>1.639827e+06</td>\n",
" <td>-1.197380e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>234003</th>\n",
" <td>-6.694606e+07</td>\n",
" <td>-9.805741e+06</td>\n",
" <td>3.489556e+06</td>\n",
" <td>-3.071515e+06</td>\n",
" <td>2.537482e+06</td>\n",
" <td>-9.724698e+05</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>521896</th>\n",
" <td>-6.713259e+07</td>\n",
" <td>-9.884166e+06</td>\n",
" <td>3.467482e+06</td>\n",
" <td>-3.160482e+06</td>\n",
" <td>3.171946e+06</td>\n",
" <td>-1.259239e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>608911</th>\n",
" <td>2.166144e+08</td>\n",
" <td>2.168474e+08</td>\n",
" <td>-9.152850e+07</td>\n",
" <td>8.083598e+07</td>\n",
" <td>-7.069317e+06</td>\n",
" <td>3.165290e+07</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>234796</th>\n",
" <td>-5.257914e+07</td>\n",
" <td>-5.220519e+06</td>\n",
" <td>7.859933e+06</td>\n",
" <td>-2.671070e+06</td>\n",
" <td>1.963959e+06</td>\n",
" <td>6.151725e+05</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>225327</th>\n",
" <td>-6.676682e+07</td>\n",
" <td>-9.859577e+06</td>\n",
" <td>3.724604e+06</td>\n",
" <td>-3.179077e+06</td>\n",
" <td>2.615899e+06</td>\n",
" <td>-1.184431e+06</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>126391 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" c1 c2 c3 c4 c5 \\\n",
"541262 -4.331457e+07 -6.688204e+06 1.172307e+07 -3.208084e+06 -8.829879e+06 \n",
"335127 -6.712687e+07 -9.876602e+06 3.459028e+06 -3.119139e+06 2.823132e+06 \n",
"217235 -6.712918e+07 -9.875923e+06 3.459967e+06 -3.118586e+06 2.821194e+06 \n",
"230087 8.906373e+07 1.181202e+08 -4.992390e+07 3.903072e+07 3.441380e+06 \n",
"493773 -6.631246e+07 -9.493603e+06 3.510767e+06 -2.933745e+06 1.639827e+06 \n",
"... ... ... ... ... ... \n",
"234003 -6.694606e+07 -9.805741e+06 3.489556e+06 -3.071515e+06 2.537482e+06 \n",
"521896 -6.713259e+07 -9.884166e+06 3.467482e+06 -3.160482e+06 3.171946e+06 \n",
"608911 2.166144e+08 2.168474e+08 -9.152850e+07 8.083598e+07 -7.069317e+06 \n",
"234796 -5.257914e+07 -5.220519e+06 7.859933e+06 -2.671070e+06 1.963959e+06 \n",
"225327 -6.676682e+07 -9.859577e+06 3.724604e+06 -3.179077e+06 2.615899e+06 \n",
"\n",
" c6 Class \n",
"541262 -4.193189e+06 0 \n",
"335127 -1.023254e+06 0 \n",
"217235 -1.020321e+06 0 \n",
"230087 1.771358e+06 1 \n",
"493773 -1.197380e+06 0 \n",
"... ... ... \n",
"234003 -9.724698e+05 1 \n",
"521896 -1.259239e+06 0 \n",
"608911 3.165290e+07 0 \n",
"234796 6.151725e+05 1 \n",
"225327 -1.184431e+06 0 \n",
"\n",
"[126391 rows x 7 columns]"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_set"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [],
"source": [
"# Separando las características de entrada de la de salida\n",
"X_train, y_train = remove_labels(train_set, 'Class')\n",
"X_val, y_val = remove_labels(val_set, 'Class')\n",
"X_test, y_test = remove_labels(test_set, 'Class')"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Longitud del Training Set: 379173\n",
"Longitud del Validation Set: 126391\n",
"Longitud del Test Set: 126391\n"
]
}
],
"source": [
"print(\"Longitud del Training Set:\", len(train_set))\n",
"print(\"Longitud del Validation Set:\", len(val_set))\n",
"print(\"Longitud del Test Set:\", len(test_set))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<h2 style=\"color:blue\">7. Random Forests</h2>"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,\n",
" criterion='gini', max_depth=30, max_features='auto',\n",
" max_leaf_nodes=None, max_samples=None,\n",
" min_impurity_decrease=0.0, min_impurity_split=None,\n",
" min_samples_leaf=1, min_samples_split=2,\n",
" min_weight_fraction_leaf=0.0, n_estimators=200,\n",
" n_jobs=-1, oob_score=False, random_state=42, verbose=0,\n",
" warm_start=False)"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.ensemble import RandomForestClassifier\n",
"\n",
"# max_depth=30 -> profundidad máxima de 30 ramas\n",
"clf_rnd = RandomForestClassifier(n_estimators=200, max_depth=30, random_state=42, n_jobs=-1)\n",
"clf_rnd.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 0, 0, ..., 0, 1, 0], dtype=int64)"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Predecimos con el conjunto de datos de validación\n",
"y_val_pred = clf_rnd.predict(X_val)\n",
"y_val_pred"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"F1 score validation test: 0.8914140064148489\n"
]
}
],
"source": [
"# F1 score conjunto de datos de validación\n",
"print(\"F1 score validation test:\", f1_score(y_val_pred, y_val, average='weighted'))"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [],
"source": [
"# Predecimos con el conjunto de datos de pruebas\n",
"y_test_pred = clf_rnd.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"F1 score test set: 0.8945365648002198\n"
]
}
],
"source": [
"# F1 score conjunto de datos de pruebas\n",
"print(\"F1 score test set:\", f1_score(y_test_pred, y_test, average='weighted'))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"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.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment