evaluación con slides y ejercicios

parent 54d04e20
...@@ -802,14 +802,185 @@ ...@@ -802,14 +802,185 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"# Métricas de evaluación" "# 8. Métricas de Evaluación en Minería de Datos\n",
"\n",
"## Contenido de la Presentación\n",
"\n",
"https://docs.google.com/presentation/d/1kjkdn_m0jZjLYmp4GuPyXtDwi9wdUKPkQISXhQD5cCk/edit?usp=sharing\n",
"\n",
"\n",
"\n",
"#### 8.1 Técnicas de evaluación en Aprendizaje Automático:\n",
" - Motivación SPAM!\n",
" - Gold Standard\n",
" - Tabla de contingencia\n",
" - Exactitud (Accuracy)\n",
" - Precisión\n",
" - Exhaustividad (Recall)\n",
"\n",
"#### 8.2 Validación de evaluación en Aprendizaje Automático:\n",
" - Conjunto de entrenamiento, Conjunto de prueba\n",
" - Validación cruzada\n",
" \n",
" \n"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"# Ejemplos completos en casos de uso" "# Ejemplos completos en sklearn"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.98"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Cada estimador (clasificador) debe exponer un método \"score\" que nos indica la calidad de predicción.\n",
"\n",
"from sklearn import datasets, svm\n",
"\n",
"digits = datasets.load_digits()\n",
"X_digits = digits.data\n",
"y_digits = digits.target\n",
"svc = svm.SVC(C=1, kernel='linear')\n",
"svc.fit(X_digits[:-100], y_digits[:-100]).score(X_digits[-100:], y_digits[-100:])\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.9348914858096828, 0.9565943238731218, 0.9398998330550918]\n"
]
}
],
"source": [
"# Para tener una mejor estimación del modelo, podemos dividir los datos que usamos para entrenamiento y test.\n",
"# A esto se le llama validación cruzada\n",
"import numpy as np\n",
"\n",
"X_folds = np.array_split(X_digits, 3)\n",
"y_folds = np.array_split(y_digits, 3)\n",
"scores = list()\n",
"\n",
"for k in range(3):\n",
" # We use 'list' to copy, in order to 'pop' later on\n",
" X_train = list(X_folds)\n",
" X_test = X_train.pop(k)\n",
" X_train = np.concatenate(X_train)\n",
" y_train = list(y_folds)\n",
" y_test = y_train.pop(k)\n",
" y_train = np.concatenate(y_train)\n",
" scores.append(svc.fit(X_train, y_train).score(X_test, y_test))\n",
"print(scores) \n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train: [2 3 4 5 6 7 8 9] | test: [0 1]\n",
"Train: [0 1 4 5 6 7 8 9] | test: [2 3]\n",
"Train: [0 1 2 3 6 7 8 9] | test: [4 5]\n",
"Train: [0 1 2 3 4 5 8 9] | test: [6 7]\n",
"Train: [0 1 2 3 4 5 6 7] | test: [8 9]\n"
]
},
{
"data": {
"text/plain": [
"array([0.96578289, 0.92708922, 0.96681476, 0.96362897, 0.93192644])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Ejemplo de uso de la métrica de precisión_macro y Kfolds 5\n",
"\n",
"from sklearn.model_selection import KFold, cross_val_score\n",
"\n",
"X = [\"a\", \"a\", \"a\", \"b\", \"b\", \"c\", \"c\", \"c\", \"c\", \"c\"]\n",
"\n",
"k_fold = KFold(n_splits=5)\n",
"for train_indices, test_indices in k_fold.split(X):\n",
" print('Train: %s | test: %s' % (train_indices, test_indices))\n",
"\n",
"cross_val_score(svc, X_digits, y_digits, cv=k_fold,\n",
" scoring='precision_macro')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ejercicios"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##  1. SpamDetector\n",
"\n",
"Implemente la clase SpamDetector usando sklearn. La clase debe ser un estimador para la clasificación binaria de textos (correo electrónico) en dos categorías: \"HAM\", \"SPAM\". El constructor debe recibir los textos de cada categoría así como sus respectivas etiquetas. Debe implementar los métodos $fit(X, y)$ y $predict(T)$, donde $X$ es una matriz de $(nDocumentos,mPalabras)$ cuyos valores corresponden a las frecuencias. \n",
"\n",
"\n",
"Utilice como datos de ejemplo, una selección de su propio correo electrónico personal.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##  2. Validación SpamDetector\n",
"\n",
"Evalue la clase SpamDetector usando el esquema de validación cruzada con $F-measure$ como métrica de score y grafíque los valores de score para cada entrenamiento.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##  3. Persistencia SpamDetector\n",
"\n",
"Evalue la clase SpamDetector usando el esquema de validación cruzada con $F-measure$ como métrica de score y guarde, de manera persistente, en un archivo pickle el mejor estimador según los resultados de la evaluación."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##  4. Reuso SpamDetector\n",
"\n",
"Modifique la clase SpamDetector para que el constructor cargue un modelo previamente entrenado desde un archivo. Pruebe el código haciendo que se cargue el pickle del ejercicio anterior y realice la predicción de nuevos documentos no utilizados en el entrenamiento.\n"
] ]
}, },
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment