Extracción y evaluación de características de texto

Machine LearningMachine LearningBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

La biblioteca scikit-learn proporciona herramientas para la extracción y evaluación de características de texto. En este laboratorio, usaremos el conjunto de datos 20newsgroups para demostrar cómo extraer características de datos de texto, construir una canalización y evaluar el rendimiento del modelo mediante el ajuste de hiperparámetros.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/naive_bayes("Naive Bayes") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/feature_extraction("Feature Extraction") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/pipeline("Pipeline") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/naive_bayes -.-> lab-49157{{"Extracción y evaluación de características de texto"}} sklearn/feature_extraction -.-> lab-49157{{"Extracción y evaluación de características de texto"}} sklearn/pipeline -.-> lab-49157{{"Extracción y evaluación de características de texto"}} sklearn/model_selection -.-> lab-49157{{"Extracción y evaluación de características de texto"}} sklearn/datasets -.-> lab-49157{{"Extracción y evaluación de características de texto"}} ml/sklearn -.-> lab-49157{{"Extracción y evaluación de características de texto"}} end

Cargar datos

Cargaremos el conjunto de datos 20newsgroups, que es una colección de aproximadamente 20.000 documentos de grupos de noticias en 20 categorías diferentes. Para este laboratorio, nos centraremos en dos categorías: alt.atheism y talk.religion.misc.

from sklearn.datasets import fetch_20newsgroups

categories = [
    "alt.atheism",
    "talk.religion.misc",
]

data_train = fetch_20newsgroups(
    subset="train",
    categories=categories,
    shuffle=True,
    random_state=42,
    remove=("headers", "footers", "quotes"),
)

data_test = fetch_20newsgroups(
    subset="test",
    categories=categories,
    shuffle=True,
    random_state=42,
    remove=("headers", "footers", "quotes"),
)

print(f"Cargando el conjunto de datos 20 newsgroups para {len(data_train.target_names)} categorías:")
print(data_train.target_names)
print(f"{len(data_train.data)} documentos")

Definir una canalización con ajuste de hiperparámetros

Definimos una canalización que combina un vectorizador de características de texto con un clasificador simple para la clasificación de texto. Usaremos Complement Naive Bayes como clasificador y TfidfVectorizer para la extracción de características.

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import ComplementNB
from sklearn.pipeline import Pipeline
import numpy as np

pipeline = Pipeline(
    [
        ("vect", TfidfVectorizer()),
        ("clf", ComplementNB()),
    ]
)

parameter_grid = {
    "vect__max_df": (0.2, 0.4, 0.6, 0.8, 1.0),
    "vect__min_df": (1, 3, 5, 10),
    "vect__ngram_range": ((1, 1), (1, 2)),  ## unigramas o bigramas
    "vect__norm": ("l1", "l2"),
    "clf__alpha": np.logspace(-6, 6, 13),
}

Ajuste de hiperparámetros

Usamos RandomizedSearchCV para explorar la cuadrícula de hiperparámetros y encontrar la mejor combinación de hiperparámetros para la canalización. En este caso, establecemos n_iter = 40 para limitar el espacio de búsqueda. Podemos aumentar n_iter para obtener un análisis más informativo, pero aumentará el tiempo de cálculo.

from sklearn.model_selection import RandomizedSearchCV

random_search = RandomizedSearchCV(
    estimator=pipeline,
    param_distributions=parameter_grid,
    n_iter=40,
    random_state=0,
    n_jobs=2,
    verbose=1,
)

print("Realizando búsqueda en cuadrícula...")
print("Hiperparámetros a evaluar:")
pprint(parameter_grid)

random_search.fit(data_train.data, data_train.target)

test_accuracy = random_search.score(data_test.data, data_test.target)

Visualización de resultados

Podemos visualizar los resultados del ajuste de hiperparámetros usando plotly.express. Usamos un diagrama de dispersión para visualizar el equilibrio entre el tiempo de puntuación y la puntuación promedio de prueba. También podemos usar coordenadas paralelas para visualizar aún más la puntuación promedio de prueba en función de los hiperparámetros ajustados.

import pandas as pd
import plotly.express as px
import math

def shorten_param(param_name):
    """Elimina los prefijos de los componentes en param_name."""
    if "__" está en param_name:
        return param_name.rsplit("__", 1)[1]
    return param_name

cv_results = pd.DataFrame(random_search.cv_results_)
cv_results = cv_results.rename(shorten_param, axis=1)

param_names = [shorten_param(name) for name in parameter_grid.keys()]
labels = {
    "mean_score_time": "Tiempo de puntuación CV (s)",
    "mean_test_score": "Puntuación CV (precision)",
}
fig = px.scatter(
    cv_results,
    x="mean_score_time",
    y="mean_test_score",
    error_x="std_score_time",
    error_y="std_test_score",
    hover_data=param_names,
    labels=labels,
)

fig.update_layout(
    title={
        "text": "equilibrio entre el tiempo de puntuación y la puntuación promedio de prueba",
        "y": 0.95,
        "x": 0.5,
        "xanchor": "center",
        "yanchor": "top",
    }
)

column_results = param_names + ["mean_test_score", "mean_score_time"]

transform_funcs = dict.fromkeys(column_results, lambda x: x)
## Usando una escala logarítmica para alpha
transform_funcs["alpha"] = math.log10
## Las normas L1 se asignan al índice 1 y las normas L2 al índice 2
transform_funcs["norm"] = lambda x: 2 si x == "l2" else 1
## Los unigramas se asignan al índice 1 y los bigramas al índice 2
transform_funcs["ngram_range"] = lambda x: x[1]

fig = px.parallel_coordinates(
    cv_results[column_results].apply(transform_funcs),
    color="mean_test_score",
    color_continuous_scale=px.colors.sequential.Viridis_r,
    labels=labels,
)
fig.update_layout(
    title={
        "text": "Diagrama de coordenadas paralelas de la canalización de clasificador de texto",
        "y": 0.99,
        "x": 0.5,
        "xanchor": "center",
        "yanchor": "top",
    }
)

Resumen

En este laboratorio, demostramos cómo extraer características de datos de texto, construir una canalización y evaluar el rendimiento del modelo usando el ajuste de hiperparámetros. Usamos el conjunto de datos 20newsgroups para mostrar cómo usar RandomizedSearchCV para encontrar la mejor combinación de hiperparámetros para la canalización y visualizar los resultados usando plotly.express.