Spaces:
Sleeping
Sleeping
import os | |
import numpy as np | |
import requests | |
from sklearn import metrics | |
BINARY_CLASSIFICATION_EVAL_METRICS = ( | |
"eval_loss", | |
"eval_accuracy", | |
"eval_f1", | |
"eval_auc", | |
"eval_precision", | |
"eval_recall", | |
) | |
MULTI_CLASS_CLASSIFICATION_EVAL_METRICS = ( | |
"eval_loss", | |
"eval_accuracy", | |
"eval_f1_macro", | |
"eval_f1_micro", | |
"eval_f1_weighted", | |
"eval_precision_macro", | |
"eval_precision_micro", | |
"eval_precision_weighted", | |
"eval_recall_macro", | |
"eval_recall_micro", | |
"eval_recall_weighted", | |
) | |
MODEL_CARD = """ | |
--- | |
library_name: transformers | |
tags: | |
- autotrain | |
- text-classification{base_model} | |
widget: | |
- text: "I love AutoTrain"{dataset_tag} | |
--- | |
# Model Trained Using AutoTrain | |
- Problem type: Text Classification | |
## Validation Metrics | |
{validation_metrics} | |
""" | |
def _binary_classification_metrics(pred): | |
""" | |
Calculate various binary classification metrics. | |
Args: | |
pred (tuple): A tuple containing raw predictions and true labels. | |
- raw_predictions (numpy.ndarray): The raw prediction scores from the model. | |
- labels (numpy.ndarray): The true labels. | |
Returns: | |
dict: A dictionary containing the following metrics: | |
- "f1" (float): The F1 score. | |
- "precision" (float): The precision score. | |
- "recall" (float): The recall score. | |
- "auc" (float): The Area Under the ROC Curve (AUC) score. | |
- "accuracy" (float): The accuracy score. | |
""" | |
raw_predictions, labels = pred | |
predictions = np.argmax(raw_predictions, axis=1) | |
result = { | |
"f1": metrics.f1_score(labels, predictions), | |
"precision": metrics.precision_score(labels, predictions), | |
"recall": metrics.recall_score(labels, predictions), | |
"auc": metrics.roc_auc_score(labels, raw_predictions[:, 1]), | |
"accuracy": metrics.accuracy_score(labels, predictions), | |
} | |
return result | |
def _multi_class_classification_metrics(pred): | |
""" | |
Compute various classification metrics for multi-class classification. | |
Args: | |
pred (tuple): A tuple containing raw predictions and true labels. | |
- raw_predictions (numpy.ndarray): The raw prediction scores for each class. | |
- labels (numpy.ndarray): The true labels. | |
Returns: | |
dict: A dictionary containing the following metrics: | |
- "f1_macro": F1 score with macro averaging. | |
- "f1_micro": F1 score with micro averaging. | |
- "f1_weighted": F1 score with weighted averaging. | |
- "precision_macro": Precision score with macro averaging. | |
- "precision_micro": Precision score with micro averaging. | |
- "precision_weighted": Precision score with weighted averaging. | |
- "recall_macro": Recall score with macro averaging. | |
- "recall_micro": Recall score with micro averaging. | |
- "recall_weighted": Recall score with weighted averaging. | |
- "accuracy": Accuracy score. | |
""" | |
raw_predictions, labels = pred | |
predictions = np.argmax(raw_predictions, axis=1) | |
results = { | |
"f1_macro": metrics.f1_score(labels, predictions, average="macro"), | |
"f1_micro": metrics.f1_score(labels, predictions, average="micro"), | |
"f1_weighted": metrics.f1_score(labels, predictions, average="weighted"), | |
"precision_macro": metrics.precision_score(labels, predictions, average="macro"), | |
"precision_micro": metrics.precision_score(labels, predictions, average="micro"), | |
"precision_weighted": metrics.precision_score(labels, predictions, average="weighted"), | |
"recall_macro": metrics.recall_score(labels, predictions, average="macro"), | |
"recall_micro": metrics.recall_score(labels, predictions, average="micro"), | |
"recall_weighted": metrics.recall_score(labels, predictions, average="weighted"), | |
"accuracy": metrics.accuracy_score(labels, predictions), | |
} | |
return results | |
def create_model_card(config, trainer, num_classes): | |
""" | |
Generates a model card for a text classification model. | |
Args: | |
config (object): Configuration object containing various settings and paths. | |
trainer (object): Trainer object used for evaluating the model. | |
num_classes (int): Number of classes in the classification task. | |
Returns: | |
str: A formatted string representing the model card. | |
""" | |
if config.valid_split is not None: | |
eval_scores = trainer.evaluate() | |
valid_metrics = ( | |
BINARY_CLASSIFICATION_EVAL_METRICS if num_classes == 2 else MULTI_CLASS_CLASSIFICATION_EVAL_METRICS | |
) | |
eval_scores = [f"{k[len('eval_'):]}: {v}" for k, v in eval_scores.items() if k in valid_metrics] | |
eval_scores = "\n\n".join(eval_scores) | |
else: | |
eval_scores = "No validation metrics available" | |
if config.data_path == f"{config.project_name}/autotrain-data" or os.path.isdir(config.data_path): | |
dataset_tag = "" | |
else: | |
dataset_tag = f"\ndatasets:\n- {config.data_path}" | |
if os.path.isdir(config.model): | |
base_model = "" | |
else: | |
base_model = f"\nbase_model: {config.model}" | |
model_card = MODEL_CARD.format( | |
dataset_tag=dataset_tag, | |
validation_metrics=eval_scores, | |
base_model=base_model, | |
) | |
return model_card | |
def pause_endpoint(params): | |
""" | |
Pauses a Hugging Face endpoint using the provided parameters. | |
This function constructs an API URL using the endpoint ID from the environment | |
variables, and sends a POST request to pause the specified endpoint. | |
Args: | |
params (object): An object containing the following attribute: | |
- token (str): The authorization token required to authenticate the API request. | |
Returns: | |
dict: The JSON response from the API call. | |
""" | |
endpoint_id = os.environ["ENDPOINT_ID"] | |
username = endpoint_id.split("/")[0] | |
project_name = endpoint_id.split("/")[1] | |
api_url = f"https://api.endpoints.huggingface.cloud/v2/endpoint/{username}/{project_name}/pause" | |
headers = {"Authorization": f"Bearer {params.token}"} | |
r = requests.post(api_url, headers=headers) | |
return r.json() | |