评估
sentence_transformers.evaluation
定义了不同的类,这些类可用于在训练期间评估模型。
BinaryClassificationEvaluator
- class sentence_transformers.evaluation.BinaryClassificationEvaluator(sentences1: list[str], sentences2: list[str], labels: list[int], name: str = '', batch_size: int = 32, show_progress_bar: bool = False, write_csv: bool = True, truncate_dim: int | None = None, similarity_fn_names: list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None = None)[source]
通过计算识别相似和不相似句子的准确率,基于嵌入的相似性来评估模型。指标包括余弦相似度、点积、欧几里得距离和曼哈顿距离。返回的分数是使用指定指标的准确率。
结果写入 CSV 文件。如果 CSV 文件已存在,则追加值。
标签对于不相似的对需要为 0,对于相似的对需要为 1。
- 参数:
sentences1 (List[str]) – 第一列句子。
sentences2 (List[str]) – 第二列句子。
labels (List[int]) – labels[i] 是对 (sentences1[i], sentences2[i]) 的标签。必须为 0 或 1。
name (str, optional) – 输出的名称。默认为 “”。
batch_size (int, optional) – 用于计算嵌入的批次大小。默认为 32。
show_progress_bar (bool, optional) – 如果为 true,则打印进度条。默认为 False。
write_csv (bool, optional) – 将结果写入 CSV 文件。默认为 True。
truncate_dim (Optional[int], optional) – 截断句子嵌入的维度。None 使用模型当前的截断维度。默认为 None。
similarity_fn_names (Optional[List[Literal["cosine", "dot", "euclidean", "manhattan"]]], optional) – 要使用的相似度函数。如果未指定,则默认为模型的
similarity_fn_name
属性。默认为 None。
示例
from sentence_transformers import SentenceTransformer from sentence_transformers.evaluation import BinaryClassificationEvaluator from datasets import load_dataset # Load a model model = SentenceTransformer('all-mpnet-base-v2') # Load a dataset with two text columns and a class label column (https://huggingface.co/datasets/sentence-transformers/quora-duplicates) eval_dataset = load_dataset("sentence-transformers/quora-duplicates", "pair-class", split="train[-1000:]") # Initialize the evaluator binary_acc_evaluator = BinaryClassificationEvaluator( sentences1=eval_dataset["sentence1"], sentences2=eval_dataset["sentence2"], labels=eval_dataset["label"], name="quora_duplicates_dev", ) results = binary_acc_evaluator(model) ''' Binary Accuracy Evaluation of the model on the quora_duplicates_dev dataset: Accuracy with Cosine-Similarity: 81.60 (Threshold: 0.8352) F1 with Cosine-Similarity: 75.27 (Threshold: 0.7715) Precision with Cosine-Similarity: 65.81 Recall with Cosine-Similarity: 87.89 Average Precision with Cosine-Similarity: 76.03 Matthews Correlation with Cosine-Similarity: 62.48 ''' print(binary_acc_evaluator.primary_metric) # => "quora_duplicates_dev_cosine_ap" print(results[binary_acc_evaluator.primary_metric]) # => 0.760277070888393
EmbeddingSimilarityEvaluator
- class sentence_transformers.evaluation.EmbeddingSimilarityEvaluator(sentences1: list[str], sentences2: list[str], scores: list[float], batch_size: int = 16, main_similarity: str | SimilarityFunction | None = None, similarity_fn_names: list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None = None, name: str = '', show_progress_bar: bool = False, write_csv: bool = True, precision: Literal['float32', 'int8', 'uint8', 'binary', 'ubinary'] | None = None, truncate_dim: int | None = None)[source]
通过计算与黄金标准标签相比的 Spearman 和 Pearson 等级相关性,基于嵌入的相似性来评估模型。指标包括余弦相似度以及欧几里得距离和曼哈顿距离。返回的分数是使用指定指标的 Spearman 相关性。
- 参数:
sentences1 (List[str]) – 包含句子对中第一个句子的列表。
sentences2 (List[str]) – 包含句子对中第二个句子的列表。
scores (List[float]) – sentences1[i] 和 sentences2[i] 之间的相似度分数。
batch_size (int, optional) – 处理句子的批次大小。默认为 16。
main_similarity (Optional[Union[str, SimilarityFunction]], optional) – 要使用的主要相似度函数。可以是字符串(例如“cosine”、“dot”)或 SimilarityFunction 对象。默认为 None。
similarity_fn_names (List[str], optional) – 要使用的相似度函数名称列表。如果为 None,则使用模型的
similarity_fn_name
属性。默认为 None。name (str, optional) – 评估器的名称。默认为 “”。
show_progress_bar (bool, optional) – 是否在评估期间显示进度条。默认为 False。
write_csv (bool, optional) – 是否将评估结果写入 CSV 文件。默认为 True。
precision (Optional[Literal["float32", "int8", "uint8", "binary", "ubinary"]], optional) – 用于嵌入的精度。可以是 “float32”、“int8”、“uint8”、“binary” 或 “ubinary”。默认为 None。
truncate_dim (Optional[int], optional) – 截断句子嵌入的维度。None 使用模型当前的截断维度。默认为 None。
示例
from datasets import load_dataset from sentence_transformers import SentenceTransformer from sentence_transformers.evaluation import EmbeddingSimilarityEvaluator, SimilarityFunction # Load a model model = SentenceTransformer('all-mpnet-base-v2') # Load the STSB dataset (https://huggingface.co/datasets/sentence-transformers/stsb) eval_dataset = load_dataset("sentence-transformers/stsb", split="validation") # Initialize the evaluator dev_evaluator = EmbeddingSimilarityEvaluator( sentences1=eval_dataset["sentence1"], sentences2=eval_dataset["sentence2"], scores=eval_dataset["score"], name="sts_dev", ) results = dev_evaluator(model) ''' EmbeddingSimilarityEvaluator: Evaluating the model on the sts-dev dataset: Cosine-Similarity : Pearson: 0.8806 Spearman: 0.8810 ''' print(dev_evaluator.primary_metric) # => "sts_dev_pearson_cosine" print(results[dev_evaluator.primary_metric]) # => 0.881019449484294
InformationRetrievalEvaluator
- class sentence_transformers.evaluation.InformationRetrievalEvaluator(queries: dict[str, str], corpus: dict[str, str], relevant_docs: dict[str, set[str]], corpus_chunk_size: int = 50000, mrr_at_k: list[int] = [10], ndcg_at_k: list[int] = [10], accuracy_at_k: list[int] = [1, 3, 5, 10], precision_recall_at_k: list[int] = [1, 3, 5, 10], map_at_k: list[int] = [100], show_progress_bar: bool = False, batch_size: int = 32, name: str = '', write_csv: bool = True, truncate_dim: int | None = None, score_functions: dict[str, Callable[[Tensor, Tensor], Tensor]] | None = None, main_score_function: str | SimilarityFunction | None = None, query_prompt: str | None = None, query_prompt_name: str | None = None, corpus_prompt: str | None = None, corpus_prompt_name: str | None = None)[source]
此类评估信息检索 (IR) 设置。
给定一组查询和一个大型语料库集。它将为每个查询检索前 k 个最相似的文档。它测量平均倒数排名 (MRR)、Recall@k 和归一化折损累积增益 (NDCG)
- 参数:
queries (Dict[str, str]) – 将查询 ID 映射到查询的字典。
corpus (Dict[str, str]) – 将文档 ID 映射到文档的字典。
relevant_docs (Dict[str, Set[str]]) – 将查询 ID 映射到一组相关文档 ID 的字典。
corpus_chunk_size (int) – 每个语料库块的大小。默认为 50000。
mrr_at_k (List[int]) – 一个整数列表,表示 MRR 计算的 k 值。默认为 [10]。
ndcg_at_k (List[int]) – 一个整数列表,表示 NDCG 计算的 k 值。默认为 [10]。
accuracy_at_k (List[int]) – 一个整数列表,表示准确率计算的 k 值。默认为 [1, 3, 5, 10]。
precision_recall_at_k (List[int]) – 一个整数列表,表示精确率和召回率计算的 k 值。默认为 [1, 3, 5, 10]。
map_at_k (List[int]) – 一个整数列表,表示 MAP 计算的 k 值。默认为 [100]。
show_progress_bar (bool) – 是否在评估期间显示进度条。默认为 False。
batch_size (int) – 评估的批次大小。默认为 32。
name (str) – 评估的名称。默认为 “”。
write_csv (bool) – 是否将评估结果写入 CSV 文件。默认为 True。
truncate_dim (int, optional) – 截断嵌入的维度。默认为 None。
score_functions (Dict[str, Callable[[Tensor, Tensor], Tensor]]) – 将评分函数名称映射到评分函数的字典。默认为
model
中的similarity
函数。main_score_function (Union[str, SimilarityFunction], optional) – 用于评估的主要评分函数。默认为 None。
query_prompt (str, optional) – 编码语料库时要使用的提示。默认为 None。
query_prompt_name (str, optional) – 编码语料库时要使用的提示的名称。默认为 None。
corpus_prompt (str, optional) – 编码语料库时要使用的提示。默认为 None。
corpus_prompt_name (str, optional) – 编码语料库时要使用的提示的名称。默认为 None。
示例
import random from sentence_transformers import SentenceTransformer from sentence_transformers.evaluation import InformationRetrievalEvaluator from datasets import load_dataset # Load a model model = SentenceTransformer('all-MiniLM-L6-v2') # Load the Touche-2020 IR dataset (https://huggingface.co/datasets/BeIR/webis-touche2020, https://huggingface.co/datasets/BeIR/webis-touche2020-qrels) corpus = load_dataset("BeIR/webis-touche2020", "corpus", split="corpus") queries = load_dataset("BeIR/webis-touche2020", "queries", split="queries") relevant_docs_data = load_dataset("BeIR/webis-touche2020-qrels", split="test") # For this dataset, we want to concatenate the title and texts for the corpus corpus = corpus.map(lambda x: {'text': x['title'] + " " + x['text']}, remove_columns=['title']) # Shrink the corpus size heavily to only the relevant documents + 30,000 random documents required_corpus_ids = set(map(str, relevant_docs_data["corpus-id"])) required_corpus_ids |= set(random.sample(corpus["_id"], k=30_000)) corpus = corpus.filter(lambda x: x["_id"] in required_corpus_ids) # Convert the datasets to dictionaries corpus = dict(zip(corpus["_id"], corpus["text"])) # Our corpus (cid => document) queries = dict(zip(queries["_id"], queries["text"])) # Our queries (qid => question) relevant_docs = {} # Query ID to relevant documents (qid => set([relevant_cids]) for qid, corpus_ids in zip(relevant_docs_data["query-id"], relevant_docs_data["corpus-id"]): qid = str(qid) corpus_ids = str(corpus_ids) if qid not in relevant_docs: relevant_docs[qid] = set() relevant_docs[qid].add(corpus_ids) # Given queries, a corpus and a mapping with relevant documents, the InformationRetrievalEvaluator computes different IR metrics. ir_evaluator = InformationRetrievalEvaluator( queries=queries, corpus=corpus, relevant_docs=relevant_docs, name="BeIR-touche2020-subset-test", ) results = ir_evaluator(model) ''' Information Retrieval Evaluation of the model on the BeIR-touche2020-test dataset: Queries: 49 Corpus: 31923 Score-Function: cosine Accuracy@1: 77.55% Accuracy@3: 93.88% Accuracy@5: 97.96% Accuracy@10: 100.00% Precision@1: 77.55% Precision@3: 72.11% Precision@5: 71.43% Precision@10: 62.65% Recall@1: 1.72% Recall@3: 4.78% Recall@5: 7.90% Recall@10: 13.86% MRR@10: 0.8580 NDCG@10: 0.6606 MAP@100: 0.2934 ''' print(ir_evaluator.primary_metric) # => "BeIR-touche2020-test_cosine_map@100" print(results[ir_evaluator.primary_metric]) # => 0.29335196224364596
NanoBEIREvaluator
- class sentence_transformers.evaluation.NanoBEIREvaluator(dataset_names: list[~typing.Literal['climatefever', 'dbpedia', 'fever', 'fiqa2018', 'hotpotqa', 'msmarco', 'nfcorpus', 'nq', 'quoraretrieval', 'scidocs', 'arguana', 'scifact', 'touche2020']] | None = None, mrr_at_k: list[int] = [10], ndcg_at_k: list[int] = [10], accuracy_at_k: list[int] = [1, 3, 5, 10], precision_recall_at_k: list[int] = [1, 3, 5, 10], map_at_k: list[int] = [100], show_progress_bar: bool = False, batch_size: int = 32, write_csv: bool = True, truncate_dim: int | None = None, score_functions: dict[str, ~typing.Callable[[~torch.Tensor, ~torch.Tensor], ~torch.Tensor]] | None = None, main_score_function: str | ~sentence_transformers.similarity_functions.SimilarityFunction | None = None, aggregate_fn: ~typing.Callable[[list[float]], float] = <function mean>, aggregate_key: str = 'mean', query_prompts: dict[str, str] | str | None = None, corpus_prompts: dict[str, str] | str | None = None)[source]
此类评估 SentenceTransformer 模型在 NanoBEIR 信息检索数据集集合上的性能。
该集合是基于 BEIR 集合的一组数据集,但规模要小得多,因此可以在进行全面评估之前,用于快速评估模型的检索性能。这些数据集在 Hugging Face 上以 NanoBEIR 集合的形式提供。此评估器将返回与 InformationRetrievalEvaluator 相同的指标(即,MRR、nDCG、Recall@k),针对每个数据集和平均值。
- 参数:
dataset_names (List[str]) – 要评估的数据集名称列表。默认为所有数据集。
mrr_at_k (List[int]) – 一个整数列表,表示 MRR 计算的 k 值。默认为 [10]。
ndcg_at_k (List[int]) – 一个整数列表,表示 NDCG 计算的 k 值。默认为 [10]。
accuracy_at_k (List[int]) – 一个整数列表,表示准确率计算的 k 值。默认为 [1, 3, 5, 10]。
precision_recall_at_k (List[int]) – 一个整数列表,表示精确率和召回率计算的 k 值。默认为 [1, 3, 5, 10]。
map_at_k (List[int]) – 一个整数列表,表示 MAP 计算的 k 值。默认为 [100]。
show_progress_bar (bool) – 是否在评估期间显示进度条。默认为 False。
batch_size (int) – 评估的批次大小。默认为 32。
write_csv (bool) – 是否将评估结果写入 CSV 文件。默认为 True。
truncate_dim (int, optional) – 截断嵌入的维度。默认为 None。
score_functions (Dict[str, Callable[[Tensor, Tensor], Tensor]]) – 一个字典,将评分函数名称映射到评分函数。默认为 {SimilarityFunction.COSINE.value: cos_sim, SimilarityFunction.DOT_PRODUCT.value: dot_score}。
main_score_function (Union[str, SimilarityFunction], optional) – 用于评估的主要评分函数。默认为 None。
aggregate_fn (Callable[[list[float]], float]) – 用于聚合分数的函数。默认为 np.mean。
aggregate_key (str) – 用于聚合分数的键。默认为 “mean”。
query_prompts (str | dict[str, str], optional) – 要添加到查询的提示。如果为字符串,则将相同的提示添加到所有查询。如果为字典,则期望 dataset_names 中的所有数据集都是键。
corpus_prompts (str | dict[str, str], optional) – 要添加到语料库的提示。如果为字符串,则将相同的提示添加到所有语料库。如果为字典,则期望 dataset_names 中的所有数据集都是键。
示例
from sentence_transformers import SentenceTransformer from sentence_transformers.evaluation import NanoBEIREvaluator model = SentenceTransformer('intfloat/multilingual-e5-large-instruct') datasets = ["QuoraRetrieval", "MSMARCO"] query_prompts = { "QuoraRetrieval": "Instruct: Given a question, retrieve questions that are semantically equivalent to the given question\nQuery: ", "MSMARCO": "Instruct: Given a web search query, retrieve relevant passages that answer the query\nQuery: " } evaluator = NanoBEIREvaluator( dataset_names=datasets, query_prompts=query_prompts, ) results = evaluator(model) ''' NanoBEIR Evaluation of the model on ['QuoraRetrieval', 'MSMARCO'] dataset: Evaluating NanoQuoraRetrieval Information Retrieval Evaluation of the model on the NanoQuoraRetrieval dataset: Queries: 50 Corpus: 5046 Score-Function: cosine Accuracy@1: 92.00% Accuracy@3: 98.00% Accuracy@5: 100.00% Accuracy@10: 100.00% Precision@1: 92.00% Precision@3: 40.67% Precision@5: 26.00% Precision@10: 14.00% Recall@1: 81.73% Recall@3: 94.20% Recall@5: 97.93% Recall@10: 100.00% MRR@10: 0.9540 NDCG@10: 0.9597 MAP@100: 0.9395 Evaluating NanoMSMARCO Information Retrieval Evaluation of the model on the NanoMSMARCO dataset: Queries: 50 Corpus: 5043 Score-Function: cosine Accuracy@1: 40.00% Accuracy@3: 74.00% Accuracy@5: 78.00% Accuracy@10: 88.00% Precision@1: 40.00% Precision@3: 24.67% Precision@5: 15.60% Precision@10: 8.80% Recall@1: 40.00% Recall@3: 74.00% Recall@5: 78.00% Recall@10: 88.00% MRR@10: 0.5849 NDCG@10: 0.6572 MAP@100: 0.5892 Average Queries: 50.0 Average Corpus: 5044.5 Aggregated for Score Function: cosine Accuracy@1: 66.00% Accuracy@3: 86.00% Accuracy@5: 89.00% Accuracy@10: 94.00% Precision@1: 66.00% Recall@1: 60.87% Precision@3: 32.67% Recall@3: 84.10% Precision@5: 20.80% Recall@5: 87.97% Precision@10: 11.40% Recall@10: 94.00% MRR@10: 0.7694 NDCG@10: 0.8085 ''' print(evaluator.primary_metric) # => "NanoBEIR_mean_cosine_ndcg@10" print(results[evaluator.primary_metric]) # => 0.8084508771660436
MSEEvaluator
- class sentence_transformers.evaluation.MSEEvaluator(source_sentences: list[str], target_sentences: list[str], teacher_model=None, show_progress_bar: bool = False, batch_size: int = 32, name: str = '', write_csv: bool = True, truncate_dim: int | None = None)[source]
计算计算出的句子嵌入与一些目标句子嵌入之间的均方误差 (x100)。
MSE 在 ||teacher.encode(source_sentences) - student.encode(target_sentences)|| 之间计算。
对于多语言知识蒸馏 (https://arxiv.org/abs/2004.09813),source_sentences 是英语,而 target_sentences 是不同的语言,如德语、中文、西班牙语...
- 参数:
source_sentences (List[str]) – 要使用教师模型嵌入的源句子。
target_sentences (List[str]) – 要使用学生模型嵌入的目标句子。
teacher_model (SentenceTransformer, optional) – 用于计算源句子嵌入的教师模型。
show_progress_bar (bool, optional) – 计算嵌入时显示进度条。默认为 False。
batch_size (int, optional) – 用于计算句子嵌入的批大小。默认为 32。
name (str, optional) – 评估器的名称。默认为 “”。
write_csv (bool, optional) – 将结果写入 CSV 文件。默认为 True。
truncate_dim (int, optional) – 句子嵌入要截断到的维度。None 使用模型的当前截断维度。默认为 None。
示例
from sentence_transformers import SentenceTransformer from sentence_transformers.evaluation import MSEEvaluator from datasets import load_dataset # Load a model student_model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2') teacher_model = SentenceTransformer('all-mpnet-base-v2') # Load any dataset with some texts dataset = load_dataset("sentence-transformers/stsb", split="validation") sentences = dataset["sentence1"] + dataset["sentence2"] # Given queries, a corpus and a mapping with relevant documents, the InformationRetrievalEvaluator computes different IR metrics. mse_evaluator = MSEEvaluator( source_sentences=sentences, target_sentences=sentences, teacher_model=teacher_model, name="stsb-dev", ) results = mse_evaluator(student_model) ''' MSE evaluation (lower = better) on the stsb-dev dataset: MSE (*100): 0.805045 ''' print(mse_evaluator.primary_metric) # => "stsb-dev_negative_mse" print(results[mse_evaluator.primary_metric]) # => -0.8050452917814255
ParaphraseMiningEvaluator
- class sentence_transformers.evaluation.ParaphraseMiningEvaluator(sentences_map: dict[str, str], duplicates_list: list[tuple[str, str]] | None = None, duplicates_dict: dict[str, dict[str, bool]] | None = None, add_transitive_closure: bool = False, query_chunk_size: int = 5000, corpus_chunk_size: int = 100000, max_pairs: int = 500000, top_k: int = 100, show_progress_bar: bool = False, batch_size: int = 16, name: str = '', write_csv: bool = True, truncate_dim: int | None = None)[source]
给定大量的句子,此评估器执行释义(重复)挖掘,并识别具有最高相似度的句子对。它将提取的释义对与一组黄金标签进行比较,并计算 F1 分数。
- 参数:
sentences_map (Dict[str, str]) – 一个字典,将句子 ID 映射到句子。例如,sentences_map[id] => 句子。
duplicates_list (List[Tuple[str, str]], optional) – 一个包含 ID 对 [(id1, id2), (id1, id5)] 的列表,用于标识 sentences_map 中的重复项/释义。默认为 None。
duplicates_dict (Dict[str, Dict[str, bool]], optional) – 一个默认字典,将 [id1][id2] 映射到 true,如果 id1 和 id2 是重复项。必须是对称的,即,如果 [id1][id2] => True,则 [id2][id1] => True。默认为 None。
add_transitive_closure (bool, optional) – 如果为 true,则添加传递闭包,即,如果 dup[a][b] 和 dup[b][c],则 dup[a][c]。默认为 False。
query_chunk_size (int, optional) – 为了识别释义,将计算所有句子对之间的余弦相似度。由于这可能需要大量内存,我们执行批量计算。query_chunk_size 句子将与最多 corpus_chunk_size 句子进行比较。在默认设置中,5000 个句子将被分组在一起,并与最多 10 万个其他句子进行比较。默认为 5000。
corpus_chunk_size (int, optional) – 语料库将被分批处理,以减少内存需求。默认为 100000。
max_pairs (int, optional) – 我们将仅提取最多 max_pairs 个潜在的释义候选对。默认为 500000。
top_k (int, optional) – 对于每个查询,我们提取前 k 个最相似的句子对,并将其添加到排序列表中。即,对于一个句子,我们最多只能找到 top_k 个释义。默认为 100。
show_progress_bar (bool, optional) – 输出进度条。默认为 False。
batch_size (int, optional) – 用于计算句子嵌入的批大小。默认为 16。
name (str, optional) – 实验名称。默认为 “”。
write_csv (bool, optional) – 将结果写入 CSV 文件。默认为 True。
truncate_dim (Optional[int], optional) – 截断句子嵌入的维度。None 使用模型当前的截断维度。默认为 None。
示例
from datasets import load_dataset from sentence_transformers.SentenceTransformer import SentenceTransformer from sentence_transformers.evaluation import ParaphraseMiningEvaluator # Load a model model = SentenceTransformer('all-mpnet-base-v2') # Load the Quora Duplicates Mining dataset questions_dataset = load_dataset("sentence-transformers/quora-duplicates-mining", "questions", split="dev") duplicates_dataset = load_dataset("sentence-transformers/quora-duplicates-mining", "duplicates", split="dev") # Create a mapping from qid to question & a list of duplicates (qid1, qid2) qid_to_questions = dict(zip(questions_dataset["qid"], questions_dataset["question"])) duplicates = list(zip(duplicates_dataset["qid1"], duplicates_dataset["qid2"])) # Initialize the paraphrase mining evaluator paraphrase_mining_evaluator = ParaphraseMiningEvaluator( sentences_map=qid_to_questions, duplicates_list=duplicates, name="quora-duplicates-dev", ) results = paraphrase_mining_evaluator(model) ''' Paraphrase Mining Evaluation of the model on the quora-duplicates-dev dataset: Number of candidate pairs: 250564 Average Precision: 56.51 Optimal threshold: 0.8325 Precision: 52.76 Recall: 59.19 F1: 55.79 ''' print(paraphrase_mining_evaluator.primary_metric) # => "quora-duplicates-dev_average_precision" print(results[paraphrase_mining_evaluator.primary_metric]) # => 0.5650940787776353
RerankingEvaluator
- class sentence_transformers.evaluation.RerankingEvaluator(samples: list[dict[str, str | list[str]]], at_k: int = 10, name: str = '', write_csv: bool = True, similarity_fct: ~typing.Callable[[~torch.Tensor, ~torch.Tensor], ~torch.Tensor] = <function cos_sim>, batch_size: int = 64, show_progress_bar: bool = False, use_batched_encoding: bool = True, truncate_dim: int | None = None, mrr_at_k: int | None = None)[source]
此类评估 SentenceTransformer 模型在重排序任务中的表现。
给定一个查询和文档列表,它计算所有可能的文档的得分 [query, doc_i],并按降序对其进行排序。然后,计算 MRR@10、NDCG@10 和 MAP 以衡量排序的质量。
- 参数:
samples (list) – 字典列表,其中每个字典代表一个样本,并具有以下键:- ‘query’:搜索查询。- ‘positive’:正面(相关)文档的列表。- ‘negative’:负面(不相关)文档的列表。
at_k (int, optional) – 仅考虑每个查询的前 k 个最相似的文档进行评估。默认为 10。
name (str, optional) – 评估器的名称。默认为 “”。
write_csv (bool, optional) – 将结果写入 CSV 文件。默认为 True。
similarity_fct (Callable[[torch.Tensor, torch.Tensor], torch.Tensor], optional) – 句子嵌入之间的相似度函数。默认情况下,为余弦相似度。默认为 cos_sim。
batch_size (int, optional) – 用于计算句子嵌入的批大小。默认为 64。
show_progress_bar (bool, optional) – 计算嵌入时显示进度条。默认为 False。
use_batched_encoding (bool, optional) – 是否批量编码查询和文档以提高速度,或者 1 对 1 编码以节省内存。默认为 True。
truncate_dim (Optional[int], optional) – 截断句子嵌入的维度。None 使用模型当前的截断维度。默认为 None。
mrr_at_k (Optional[int], optional) – 已弃用的参数。请改用 at_k。默认为 None。
示例
from sentence_transformers import SentenceTransformer from sentence_transformers.evaluation import RerankingEvaluator from datasets import load_dataset # Load a model model = SentenceTransformer("all-MiniLM-L6-v2") # Load a dataset with queries, positives, and negatives eval_dataset = load_dataset("microsoft/ms_marco", "v1.1", split="validation") samples = [ { "query": sample["query"], "positive": [text for is_selected, text in zip(sample["passages"]["is_selected"], sample["passages"]["passage_text"]) if is_selected], "negative": [text for is_selected, text in zip(sample["passages"]["is_selected"], sample["passages"]["passage_text"]) if not is_selected], } for sample in eval_dataset ] # Initialize the evaluator reranking_evaluator = RerankingEvaluator( samples=samples, name="ms-marco-dev", ) results = reranking_evaluator(model) ''' RerankingEvaluator: Evaluating the model on the ms-marco-dev dataset: Queries: 9706 Positives: Min 1.0, Mean 1.1, Max 5.0 Negatives: Min 1.0, Mean 7.1, Max 9.0 MAP: 56.07 MRR@10: 56.70 NDCG@10: 67.08 ''' print(reranking_evaluator.primary_metric) # => ms-marco-dev_ndcg@10 print(results[reranking_evaluator.primary_metric]) # => 0.6708042171399308
SentenceEvaluator
- class sentence_transformers.evaluation.SentenceEvaluator[source]
所有评估器的基类。值得注意的是,此类引入了
greater_is_better
和primary_metric
属性。前者是一个布尔值,指示更高的评估分数是否更好,用于在训练参数中将load_best_model_at_end
设置为True
时选择最佳检查点。后者是一个字符串,指示评估器的主要指标。每当评估器返回指标字典时,都必须定义此指标,并且主要指标是指向主要指标的键,即用于模型选择和/或日志记录的指标。
扩展此类并实现 __call__ 以进行自定义评估器。
SequentialEvaluator
- class sentence_transformers.evaluation.SequentialEvaluator(evaluators: ~collections.abc.Iterable[~sentence_transformers.evaluation.SentenceEvaluator.SentenceEvaluator], main_score_function=<function SequentialEvaluator.<lambda>>)[source]
此评估器允许多个子评估器被传递。当评估模型时,数据会按顺序传递给所有子评估器。
所有分数都传递给 ‘main_score_function’,它导出一个最终的分数值
- 参数:
evaluators (Iterable[SentenceEvaluator]) – SentenceEvaluator 对象的集合。
main_score_function (function, optional) – 一个函数,它接受一个分数列表并返回主要分数。默认为选择列表中的最后一个分数。
示例
evaluator1 = BinaryClassificationEvaluator(...) evaluator2 = InformationRetrievalEvaluator(...) evaluator3 = MSEEvaluator(...) seq_evaluator = SequentialEvaluator([evaluator1, evaluator2, evaluator3])
TranslationEvaluator
- class sentence_transformers.evaluation.TranslationEvaluator(source_sentences: list[str], target_sentences: list[str], show_progress_bar: bool = False, batch_size: int = 16, name: str = '', print_wrong_matches: bool = False, write_csv: bool = True, truncate_dim: int | None = None)[source]
给定两组不同语言的句子,例如(en_1, en_2, en_3...)和(fr_1, fr_2, fr_3, ...),并假设 fr_i 是 en_i 的翻译。检查 vec(en_i) 是否与 vec(fr_i) 具有最高的相似度。计算两个方向的准确率
标签需要指示句子之间的相似度。
- 参数:
source_sentences (List[str]) – 源语言的句子列表。
target_sentences (List[str]) – 目标语言的句子列表。
show_progress_bar (bool) – 计算嵌入时是否显示进度条。默认为 False。
batch_size (int) – 用于计算句子嵌入的批大小。默认为 16。
name (str) – 评估器的名称。默认为空字符串。
print_wrong_matches (bool) – 是否打印不正确的匹配项。默认为 False。
write_csv (bool) – 是否将评估结果写入 CSV 文件。默认为 True。
truncate_dim (int, optional) – 句子嵌入要截断到的维度。如果为 None,将使用模型的当前截断维度。默认为 None。
示例
from sentence_transformers import SentenceTransformer from sentence_transformers.evaluation import TranslationEvaluator from datasets import load_dataset # Load a model model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2') # Load a parallel sentences dataset dataset = load_dataset("sentence-transformers/parallel-sentences-news-commentary", "en-nl", split="train[:1000]") # Initialize the TranslationEvaluator using the same texts from two languages translation_evaluator = TranslationEvaluator( source_sentences=dataset["english"], target_sentences=dataset["non_english"], name="news-commentary-en-nl", ) results = translation_evaluator(model) ''' Evaluating translation matching Accuracy of the model on the news-commentary-en-nl dataset: Accuracy src2trg: 90.80 Accuracy trg2src: 90.40 ''' print(translation_evaluator.primary_metric) # => "news-commentary-en-nl_mean_accuracy" print(results[translation_evaluator.primary_metric]) # => 0.906
TripletEvaluator
- class sentence_transformers.evaluation.TripletEvaluator(anchors: list[str], positives: list[str], negatives: list[str], main_similarity_function: str | SimilarityFunction | None = None, margin: float | dict[str, float] | None = None, name: str = '', batch_size: int = 16, show_progress_bar: bool = False, write_csv: bool = True, truncate_dim: int | None = None, similarity_fn_names: list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None = None, main_distance_function: str | SimilarityFunction | None = 'deprecated')[source]
基于三元组评估模型:(句子、正面示例、负面示例)。检查
similarity(sentence, positive_example) < similarity(sentence, negative_example) + margin
是否成立。- 参数:
anchors (List[str]) – 要检查相似度的句子。(例如,查询)
positives (List[str]) – 正面句子列表
negatives (List[str]) – 负面句子列表
main_similarity_function (Union[str, SimilarityFunction], optional) – 要使用的相似度函数。如果未指定,则使用余弦相似度、点积、欧几里得和曼哈顿相似度。默认为 None。
margin (Union[float, Dict[str, float]], optional) – 各种相似度指标的边距。如果提供浮点数,它将用作所有相似度指标的边距。如果提供字典,则键应为“cosine”、“dot”、“manhattan”和“euclidean”。该值指定负样本应比正样本更远离锚点的最小边距。默认为 None。
name (str) – 输出的名称。默认为 “”。
batch_size (int) – 用于计算嵌入的批大小。默认为 16。
show_progress_bar (bool) – 如果为 true,则打印进度条。默认为 False。
write_csv (bool) – 将结果写入 CSV 文件。默认为 True。
truncate_dim (int, optional) – 句子嵌入要截断到的维度。None 使用模型的当前截断维度。默认为 None。
similarity_fn_names (List[str], optional) – 要评估的相似度函数名称列表。如果未指定,则使用
model.similarity_fn_name
进行评估。默认为 None。
示例
from sentence_transformers import SentenceTransformer from sentence_transformers.evaluation import TripletEvaluator from datasets import load_dataset # Load a model model = SentenceTransformer('all-mpnet-base-v2') # Load a dataset with (anchor, positive, negative) triplets dataset = load_dataset("sentence-transformers/all-nli", "triplet", split="dev") # Initialize the TripletEvaluator using anchors, positives, and negatives triplet_evaluator = TripletEvaluator( anchors=dataset[:1000]["anchor"], positives=dataset[:1000]["positive"], negatives=dataset[:1000]["negative"], name="all_nli_dev", ) results = triplet_evaluator(model) ''' TripletEvaluator: Evaluating the model on the all-nli-dev dataset: Accuracy Cosine Similarity: 95.60% ''' print(triplet_evaluator.primary_metric) # => "all_nli_dev_cosine_accuracy" print(results[triplet_evaluator.primary_metric]) # => 0.956