البرمجة اللغوية العصبية المتعددة التسمية: تحليل لنهج عدم توازن الفئة وفقدان الوظيفة

البرمجة اللغوية العصبية المتعددة التسمية: تحليل لنهج عدم توازن الفئة وفقدان الوظيفة

عقدة المصدر: 2016453

تشير البرمجة اللغوية العصبية المتعددة التسميات إلى مهمة تعيين تسميات متعددة لإدخال نص معين ، بدلاً من تسمية واحدة فقط. في مهام البرمجة اللغوية العصبية التقليدية ، مثل تصنيف النص أو تحليل المشاعر ، يتم عادةً تعيين تسمية واحدة لكل إدخال بناءً على محتواه. ومع ذلك ، في العديد من سيناريوهات العالم الحقيقي ، يمكن أن ينتمي جزء من النص إلى فئات متعددة أو يعبر عن مشاعر متعددة في وقت واحد.

تعد معالجة اللغات الطبيعية متعددة التسميات أمرًا مهمًا لأنها تتيح لنا الحصول على معلومات أكثر دقة وتعقيدًا من البيانات النصية. على سبيل المثال ، في مجال تحليل ملاحظات العملاء ، قد تعبر مراجعة العميل عن المشاعر الإيجابية والسلبية في نفس الوقت ، أو قد تمس جوانب متعددة من منتج أو خدمة. من خلال تعيين تسميات متعددة لمثل هذه المدخلات ، يمكننا الحصول على فهم أكثر شمولاً لملاحظات العميل واتخاذ إجراءات أكثر استهدافًا لمعالجة مخاوفهم.

تتعمق هذه المقالة في حالة جديرة بالملاحظة لاستخدام Provectus في معالجة اللغات الطبيعية متعددة العلامات. 

السياق: 

اتصل بنا أحد العملاء وطلب منهم مساعدتهم أتمتة وثائق العنونة من نوع معين. للوهلة الأولى ، بدت المهمة واضحة ومباشرة ويمكن حلها بسهولة. ومع ذلك ، أثناء عملنا على الحالة ، واجهنا مجموعة بيانات بها تعليقات توضيحية غير متسقة. على الرغم من أن عملائنا واجهوا تحديات مع اختلاف أعداد الفصول والتغييرات في فريق المراجعة الخاص بهم بمرور الوقت ، فقد استثمروا جهودًا كبيرة في إنشاء مجموعة بيانات متنوعة مع مجموعة من التعليقات التوضيحية. على الرغم من وجود بعض الاختلالات والشكوك في الملصقات ، فقد وفرت مجموعة البيانات هذه فرصة قيمة للتحليل والمزيد من الاستكشاف.

 

دعنا نلقي نظرة فاحصة على مجموعة البيانات ، ونستكشف المقاييس ومنهجنا ، ونلخص كيف حل Provectus مشكلة تصنيف النص متعدد التسميات.

تحتوي مجموعة البيانات على 14,354 ملاحظة ، مع 124 فئة فريدة (ملصقات). مهمتنا هي تخصيص فئة واحدة أو أكثر لكل ملاحظة.

يوفر الجدول 1 إحصائيات وصفية لمجموعة البيانات.

في المتوسط ​​، لدينا حوالي فصلين لكل ملاحظة ، بمتوسط ​​261 نصًا مختلفًا يصف فصلًا واحدًا.

 

البرمجة اللغوية العصبية المتعددة التسمية: تحليل لنهج عدم توازن الفئة وفقدان الوظيفة
الجدول 1: إحصاء مجموعة البيانات
 

في الشكل 1 ، نرى توزيع الفئات في الرسم البياني العلوي ، ولدينا عدد معين من تسميات HEAD مع أعلى معدل تكرار في مجموعة البيانات. لاحظ أيضًا أن غالبية الفئات لها تكرار منخفض.

 

البرمجة اللغوية العصبية المتعددة التسمية: تحليل لنهج عدم توازن الفئة وفقدان الوظيفة
 

في الرسم البياني السفلي ، نرى أن هناك تداخلًا متكررًا بين الفئات التي يتم تمثيلها بشكل أفضل في مجموعة البيانات ، والفئات ذات الأهمية المنخفضة.

لقد غيرنا عملية تقسيم مجموعة البيانات إلى مجموعات تدريب / اختبار / اختبار. بدلاً من استخدام الطريقة التقليدية ، استخدمنا التقسيم الطبقي التكراري ، لتوفير توزيع متوازن جيدًا للأدلة على علاقات التسمية. لذلك ، استخدمنا Scikit متعدد التعلم

from skmultilearn.model_selection import iterative_train_test_split mlb = MultiLabelBinarizer() def balanced_split(df, mlb, test_size=0.5): ind = np.expand_dims(np.arange(len(df)), axis=1) mlb.fit_transform(df["tag"]) labels = mlb.transform(df["tag"]) ind_train, _, ind_test, _ = iterative_train_test_split( ind, labels, test_size ) return df.iloc[ind_train[:, 0]], df.iloc[ind_test[:, 0]] df_train, df_tmp = balanced_split(df, test_size=0.4)
df_val, df_test = balanced_split(df_tmp, test_size=0.5)

 

حصلنا على التوزيع التالي:

  1. تحتوي مجموعة بيانات التدريب على 60٪ من البيانات وتغطي جميع الملصقات البالغ عددها 124 ملصقًا
  2. تحتوي مجموعة بيانات التحقق من الصحة على 20٪ من البيانات وتغطي جميع التصنيفات البالغ عددها 124
  3. تحتوي مجموعة بيانات الاختبار على 20٪ من البيانات وتغطي جميع الملصقات البالغ عددها 124 ملصقًا

التصنيف متعدد الملصقات هو نوع من خوارزمية التعلم الآلي الخاضعة للإشراف والتي تسمح لنا بتعيين تسميات متعددة لعينة بيانات واحدة. وهو يختلف عن التصنيف الثنائي حيث يتنبأ النموذج بفئتين فقط ، وتصنيف متعدد الفئات حيث يتنبأ النموذج بفئة واحدة فقط من بين فئات متعددة لعينة.

تختلف مقاييس التقييم لأداء التصنيف متعدد التصنيفات بطبيعتها عن تلك المستخدمة في التصنيف متعدد الفئات (أو الثنائي) بسبب الاختلافات الكامنة في مشكلة التصنيف. يمكن العثور على مزيد من المعلومات التفصيلية على ويكيبيديا.

اخترنا المقاييس الأكثر ملاءمة لنا:

  1. دقة يقيس نسبة التوقعات الإيجابية الحقيقية بين إجمالي التوقعات الإيجابية التي قدمها النموذج.
  2. تذكر يقيس نسبة التوقعات الإيجابية الحقيقية بين جميع العينات الإيجابية الفعلية.
  3. درجة F1 هي الوسيلة التوافقية للدقة والاستدعاء ، مما يساعد على إعادة التوازن بين الاثنين.
  4. يدق الخسارة هي جزء التسميات التي تم توقعها بشكل غير صحيح

نحن أيضا نتتبع عدد التسميات المتوقعة في المجموعة {المُعرَّفة على أنها عدد التصنيفات ، والتي نحقق لها درجة F1> 0}.

يعد التصنيف متعدد الملصقات نوعًا من مشكلات التعلم الخاضع للإشراف حيث يمكن ربط مثيل واحد أو مثال واحد بتسميات أو تصنيفات متعددة ، على عكس التصنيف التقليدي أحادي التسمية ، حيث يرتبط كل مثيل فقط بتسمية فئة واحدة.

لحل مشاكل التصنيف متعدد العلامات ، هناك فئتان رئيسيتان من التقنيات:

  1. طرق تحويل المشكلة
  2. طرق التكيف الخوارزمية

تمكّننا طرق تحويل المشكلة من تحويل مهام التصنيف متعددة التسميات إلى مهام تصنيف متعددة ذات تسمية واحدة. على سبيل المثال ، يعامل نهج خط الأساس للصلة الثنائية (BR) كل تسمية على أنها مشكلة تصنيف ثنائية منفصلة. في هذه الحالة ، يتم تحويل مشكلة التسمية المتعددة إلى مشاكل متعددة ذات تسمية واحدة.

تعدل طرق تكيف الخوارزميات الخوارزميات نفسها للتعامل مع البيانات متعددة التسمية محليًا ، دون تحويل المهمة إلى مهام تصنيف متعددة ذات تسمية واحدة. مثال على هذا النهج هو نموذج بيرت، وهو نموذج لغة قائم على المحولات مدرب مسبقًا ويمكن ضبطه لمهام معالجة اللغات الطبيعية المختلفة ، بما في ذلك تصنيف النص متعدد التسميات. تم تصميم BERT للتعامل مع البيانات متعددة التسميات مباشرة ، دون الحاجة إلى تحويل المشكلة.

في سياق استخدام BERT لتصنيف النص متعدد التسميات ، فإن النهج القياسي هو استخدام خسارة Binary Cross-Entropy (BCE) كوظيفة خسارة. خسارة BCE هي دالة خسارة شائعة الاستخدام لمشاكل التصنيف الثنائي ويمكن توسيعها بسهولة للتعامل مع مشاكل التصنيف متعدد العلامات عن طريق حساب الخسارة لكل ملصق بشكل مستقل ، ثم جمع الخسائر. في هذه الحالة ، تقيس دالة خسارة BCE الخطأ بين الاحتمالات المتوقعة والتسميات الحقيقية ، حيث يتم الحصول على الاحتمالات المتوقعة من طبقة التنشيط السيني النهائية في نموذج BERT.

الآن ، دعنا نلقي نظرة فاحصة على الشكل 2 أدناه. 

 

البرمجة اللغوية العصبية المتعددة التسمية: تحليل لنهج عدم توازن الفئة وفقدان الوظيفة
الشكل 2. مقاييس النماذج الأساسية
 

يوضح الرسم البياني الموجود على اليسار مقارنة بين مقاييس "خط الأساس: BERT" و "خط الأساس: ML". وبالتالي ، يمكن ملاحظة أنه بالنسبة "لخط الأساس: BERT" ، فإن درجات F1 و Recall أعلى بحوالي 1.5 مرة ، في حين أن دقة "خط الأساس: ML" أعلى بمرتين من تلك الخاصة بالنموذج 2. من خلال تحليل النسبة المئوية الإجمالية لـ تظهر الفئات المتوقعة على اليمين ، نرى أن "خط الأساس: BERT" تنبأ بالفئات بأكثر من 1 مرات من "خط الأساس: ML".

نظرًا لأن النتيجة القصوى لـ "خط الأساس: BERT" أقل من 50٪ من جميع الفئات ، فإن النتائج غير مشجعة تمامًا. دعنا نتعرف على كيفية تحسين هذه النتائج.

بناء على المقال المتميز "طرق الموازنة لتصنيف النص متعدد العلامات مع توزيع الفئة طويل الذيل"، تعلمنا أن الخسارة المتوازنة في التوزيع قد تكون الطريقة الأنسب لنا.

توزيع الخسارة المتوازن

الخسارة المتوازنة للتوزيع هي تقنية مستخدمة في مشاكل تصنيف النص متعدد التسميات لمعالجة الاختلالات في توزيع الفئات. في هذه المشكلات ، يكون لبعض الفئات تكرار حدوث أعلى بكثير مقارنة بالآخرين ، مما يؤدي إلى تحيز النموذج تجاه هذه الفئات الأكثر تكرارًا.

لمعالجة هذه المشكلة ، تهدف الخسارة المتوازنة للتوزيع إلى موازنة مساهمة كل عينة في دالة الخسارة. يتم تحقيق ذلك من خلال إعادة ترجيح فقدان كل عينة بناءً على معكوس تكرار حدوثها في مجموعة البيانات. من خلال القيام بذلك ، يتم زيادة مساهمة الفصول الأقل تكرارا ، وتقل مساهمة الفئات الأكثر تكرارا ، وبالتالي موازنة التوزيع الكلي للفئة.

لقد أثبتت هذه التقنية فعاليتها في تحسين أداء النماذج في مشاكل التوزيع الصنفية طويلة الذيل. من خلال تقليل تأثير الفصول المتكررة وزيادة تأثير الفئات النادرة ، يكون النموذج قادرًا على التقاط أنماط في البيانات بشكل أفضل وإنتاج تنبؤات أكثر توازناً.

البرمجة اللغوية العصبية المتعددة التسمية: تحليل لنهج عدم توازن الفئة وفقدان الوظيفة
تنفيذ فئة إعادة العينة
 

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np class ResampleLoss(nn.Module): def __init__( self, use_sigmoid=True, partial=False, loss_weight=1.0, reduction="mean", reweight_func=None, weight_norm=None, focal=dict(focal=True, alpha=0.5, gamma=2), map_param=dict(alpha=10.0, beta=0.2, gamma=0.1), CB_loss=dict(CB_beta=0.9, CB_mode="average_w"), logit_reg=dict(neg_scale=5.0, init_bias=0.1), class_freq=None, train_num=None, ): super(ResampleLoss, self).__init__() assert (use_sigmoid is True) or (partial is False) self.use_sigmoid = use_sigmoid self.partial = partial self.loss_weight = loss_weight self.reduction = reduction if self.use_sigmoid: if self.partial: self.cls_criterion = partial_cross_entropy else: self.cls_criterion = binary_cross_entropy else: self.cls_criterion = cross_entropy # reweighting function self.reweight_func = reweight_func # normalization (optional) self.weight_norm = weight_norm # focal loss params self.focal = focal["focal"] self.gamma = focal["gamma"] self.alpha = focal["alpha"] # mapping function params self.map_alpha = map_param["alpha"] self.map_beta = map_param["beta"] self.map_gamma = map_param["gamma"] # CB loss params (optional) self.CB_beta = CB_loss["CB_beta"] self.CB_mode = CB_loss["CB_mode"] self.class_freq = ( torch.from_numpy(np.asarray(class_freq)).float().cuda() ) self.num_classes = self.class_freq.shape[0] self.train_num = train_num # only used to be divided by class_freq # regularization params self.logit_reg = logit_reg self.neg_scale = ( logit_reg["neg_scale"] if "neg_scale" in logit_reg else 1.0 ) init_bias = ( logit_reg["init_bias"] if "init_bias" in logit_reg else 0.0 ) self.init_bias = ( -torch.log(self.train_num / self.class_freq - 1) * init_bias ) self.freq_inv = ( torch.ones(self.class_freq.shape).cuda() / self.class_freq ) self.propotion_inv = self.train_num / self.class_freq def forward( self, cls_score, label, weight=None, avg_factor=None, reduction_override=None, **kwargs ): assert reduction_override in (None, "none", "mean", "sum") reduction = ( reduction_override if reduction_override else self.reduction ) weight = self.reweight_functions(label) cls_score, weight = self.logit_reg_functions( label.float(), cls_score, weight ) if self.focal: logpt = self.cls_criterion( cls_score.clone(), label, weight=None, reduction="none", avg_factor=avg_factor, ) # pt is sigmoid(logit) for pos or sigmoid(-logit) for neg pt = torch.exp(-logpt) wtloss = self.cls_criterion( cls_score, label.float(), weight=weight, reduction="none" ) alpha_t = torch.where(label == 1, self.alpha, 1 - self.alpha) loss = alpha_t * ((1 - pt) ** self.gamma) * wtloss loss = reduce_loss(loss, reduction) else: loss = self.cls_criterion( cls_score, label.float(), weight, reduction=reduction ) loss = self.loss_weight * loss return loss def reweight_functions(self, label): if self.reweight_func is None: return None elif self.reweight_func in ["inv", "sqrt_inv"]: weight = self.RW_weight(label.float()) elif self.reweight_func in "rebalance": weight = self.rebalance_weight(label.float()) elif self.reweight_func in "CB": weight = self.CB_weight(label.float()) else: return None if self.weight_norm is not None: if "by_instance" in self.weight_norm: max_by_instance, _ = torch.max(weight, dim=-1, keepdim=True) weight = weight / max_by_instance elif "by_batch" in self.weight_norm: weight = weight / torch.max(weight) return weight def logit_reg_functions(self, labels, logits, weight=None): if not self.logit_reg: return logits, weight if "init_bias" in self.logit_reg: logits += self.init_bias if "neg_scale" in self.logit_reg: logits = logits * (1 - labels) * self.neg_scale + logits * labels if weight is not None: weight = ( weight / self.neg_scale * (1 - labels) + weight * labels ) return logits, weight def rebalance_weight(self, gt_labels): repeat_rate = torch.sum( gt_labels.float() * self.freq_inv, dim=1, keepdim=True ) pos_weight = ( self.freq_inv.clone().detach().unsqueeze(0) / repeat_rate ) # pos and neg are equally treated weight = ( torch.sigmoid(self.map_beta * (pos_weight - self.map_gamma)) + self.map_alpha ) return weight def CB_weight(self, gt_labels): if "by_class" in self.CB_mode: weight = ( torch.tensor((1 - self.CB_beta)).cuda() / (1 - torch.pow(self.CB_beta, self.class_freq)).cuda() ) elif "average_n" in self.CB_mode: avg_n = torch.sum( gt_labels * self.class_freq, dim=1, keepdim=True ) / torch.sum(gt_labels, dim=1, keepdim=True) weight = ( torch.tensor((1 - self.CB_beta)).cuda() / (1 - torch.pow(self.CB_beta, avg_n)).cuda() ) elif "average_w" in self.CB_mode: weight_ = ( torch.tensor((1 - self.CB_beta)).cuda() / (1 - torch.pow(self.CB_beta, self.class_freq)).cuda() ) weight = torch.sum( gt_labels * weight_, dim=1, keepdim=True ) / torch.sum(gt_labels, dim=1, keepdim=True) elif "min_n" in self.CB_mode: min_n, _ = torch.min( gt_labels * self.class_freq + (1 - gt_labels) * 100000, dim=1, keepdim=True, ) weight = ( torch.tensor((1 - self.CB_beta)).cuda() / (1 - torch.pow(self.CB_beta, min_n)).cuda() ) else: raise NameError return weight def RW_weight(self, gt_labels, by_class=True): if "sqrt" in self.reweight_func: weight = torch.sqrt(self.propotion_inv) else: weight = self.propotion_inv if not by_class: sum_ = torch.sum(weight * gt_labels, dim=1, keepdim=True) weight = sum_ / torch.sum(gt_labels, dim=1, keepdim=True) return weight def reduce_loss(loss, reduction): """Reduce loss as specified. Args: loss (Tensor): Elementwise loss tensor. reduction (str): Options are "none", "mean" and "sum". Return: Tensor: Reduced loss tensor. """ reduction_enum = F._Reduction.get_enum(reduction) # none: 0, elementwise_mean:1, sum: 2 if reduction_enum == 0: return loss elif reduction_enum == 1: return loss.mean() elif reduction_enum == 2: return loss.sum() def weight_reduce_loss(loss, weight=None, reduction="mean", avg_factor=None): """Apply element-wise weight and reduce loss. Args: loss (Tensor): Element-wise loss. weight (Tensor): Element-wise weights. reduction (str): Same as built-in losses of PyTorch. avg_factor (float): Avarage factor when computing the mean of losses. Returns: Tensor: Processed loss values. """ # if weight is specified, apply element-wise weight if weight is not None: loss = loss * weight # if avg_factor is not specified, just reduce the loss if avg_factor is None: loss = reduce_loss(loss, reduction) else: # if reduction is mean, then average the loss by avg_factor if reduction == "mean": loss = loss.sum() / avg_factor # if reduction is 'none', then do nothing, otherwise raise an error elif reduction != "none": raise ValueError( 'avg_factor can not be used with reduction="sum"' ) return loss def binary_cross_entropy( pred, label, weight=None, reduction="mean", avg_factor=None
): # weighted element-wise losses if weight is not None: weight = weight.float() loss = F.binary_cross_entropy_with_logits( pred, label.float(), weight, reduction="none" ) loss = weight_reduce_loss( loss, reduction=reduction, avg_factor=avg_factor ) return loss

DBLoss
 

loss_func = ResampleLoss( reweight_func="rebalance", loss_weight=1.0, focal=dict(focal=True, alpha=0.5, gamma=2), logit_reg=dict(init_bias=0.05, neg_scale=2.0), map_param=dict(alpha=0.1, beta=10.0, gamma=0.405), class_freq=class_freq, train_num=train_num,
) """
class_freq - list of frequencies for each class,
train_num - size of train dataset """

 

من خلال التحقيق عن كثب في مجموعة البيانات ، توصلنا إلى أن المعلمة معادلة

معادلة = 0.405.

ضبط العتبة

كانت الخطوة الأخرى في تحسين نموذجنا هي عملية ضبط العتبة ، سواء في مرحلة التدريب أو في مرحلتي التحقق من الصحة والاختبار. قمنا بحساب تبعيات المقاييس مثل الدرجة f1 والدقة والاستدعاء على مستوى العتبة ، واخترنا العتبة بناءً على أعلى درجة للمقياس. أدناه يمكنك رؤية تنفيذ الوظيفة لهذه العملية.

تحسين درجة F1 عن طريق ضبط العتبة:

def optimise_f1_score(true_labels: np.ndarray, pred_labels: np.ndarray): best_med_th = 0.5 true_bools = [tl == 1 for tl in true_labels] micro_thresholds = (np.array(range(-45, 15)) / 100) + best_med_th f1_results, pre_results, recall_results = [], [], [] for th in micro_thresholds: pred_bools = [pl > th for pl in pred_labels] test_f1 = f1_score(true_bools, pred_bools, average="micro", zero_division=0) test_precision = precision_score( true_bools, pred_bools, average="micro", zero_division=0 ) test_recall = recall_score( true_bools, pred_bools, average="micro", zero_division=0 ) f1_results.append(test_f1) prec_results.append(test_precision) recall_results.append(test_recall) best_f1_idx = np.argmax(f1_results) return micro_thresholds[best_f1_idx]

التقييم والمقارنة مع خط الأساس

سمحت لنا هذه الأساليب بتدريب نموذج جديد والحصول على النتيجة التالية ، والتي تتم مقارنتها بخط الأساس: BERT في الشكل 3 أدناه.

 

البرمجة اللغوية العصبية المتعددة التسمية: تحليل لنهج عدم توازن الفئة وفقدان الوظيفة
الشكل 3. مقاييس المقارنة حسب النهج الأساسي والأحدث.
 

بمقارنة المقاييس ذات الصلة بالتصنيف ، نرى زيادة ملحوظة في مقاييس الأداء تقريبًا بحوالي 5-6 مرات:

زادت درجة F1 من 12٪ - 55٪ ، بينما زادت الدقة من 9٪ - 59٪ وزادت درجة الاستدعاء من 15٪ - 51٪.

من خلال التغييرات الموضحة في الرسم البياني الأيمن في الشكل 3 ، يمكننا الآن توقع 80٪ من الفئات.

شرائح من الفصول

قمنا بتقسيم ملصقاتنا إلى أربع مجموعات: HEAD و MEDIUM و TAIL و ZERO. تحتوي كل مجموعة على ملصقات تحتوي على قدر مماثل من ملاحظات البيانات الداعمة.

كما هو موضح في الشكل 4 ، توزيعات المجموعات متميزة. يحتوي صندوق الورود (HEAD) على توزيع منحرف سلبيًا ، بينما يحتوي المربع الأوسط (MEDIUM) على توزيع منحرف إيجابيًا ، ويبدو أن المربع الأخضر (TAIL) له توزيع طبيعي.

تحتوي جميع المجموعات أيضًا على قيم متطرفة ، وهي نقاط خارج الشعيرات في مخطط الصندوق. مجموعة HEAD لها تأثير كبير على فئة رئيسية.

بالإضافة إلى ذلك ، حددنا مجموعة منفصلة تسمى "صفر" والتي تحتوي على تسميات لم يتمكن النموذج من التعرف عليها ولا يمكن التعرف عليها بسبب الحد الأدنى لعدد مرات الحدوث في مجموعة البيانات (أقل من 3٪ من جميع الملاحظات).

 

البرمجة اللغوية العصبية المتعددة التسمية: تحليل لنهج عدم توازن الفئة وفقدان الوظيفة
الشكل 4. تسمية التهم مقابل المجموعات
 

يوفر الجدول 2 معلومات حول المقاييس لكل مجموعة تسميات لمجموعة فرعية من البيانات.

 

البرمجة اللغوية العصبية المتعددة التسمية: تحليل لنهج عدم توازن الفئة وفقدان الوظيفة
الجدول 2. المقاييس لكل مجموعة.
 

  1. تحتوي مجموعة HEAD على 21 تسمية بمتوسط ​​112 ملاحظة دعم لكل ملصق. تتأثر هذه المجموعة بالقيم المتطرفة ، وبسبب تمثيلها العالي في مجموعة البيانات ، فإن مقاييسها عالية: F1 - 73٪ ، الدقة - 71٪ ، Recall - 75٪.
  2. تتكون مجموعة MEDIUM من 44 تسمية مع دعم متوسط ​​لـ 67 ملاحظة ، وهو ما يقرب من مرتين أقل من مجموعة HEAD. من المتوقع أن تنخفض المقاييس الخاصة بهذه المجموعة بنسبة 50٪: F1 - 52٪ ، الدقة - 56٪ ، Recall - 51٪.
  3. تحتوي مجموعة TAIL على أكبر عدد من الفئات ، ولكن جميعها ممثلة بشكل ضعيف في مجموعة البيانات ، بمتوسط ​​40 ملاحظة دعم لكل ملصق. نتيجة لذلك ، تنخفض المقاييس بشكل ملحوظ: F1 - 21٪ ، الدقة - 32٪ ، Recall - 16٪.
  4. تشتمل المجموعة ZERO على فئات لا يستطيع النموذج التعرف عليها على الإطلاق ، ويرجع ذلك على الأرجح إلى قلة حدوثها في مجموعة البيانات. كل تصنيف من 24 تصنيفًا في هذه المجموعة لديه 7 ملاحظات دعم في المتوسط.

يصور الشكل 5 المعلومات الواردة في الجدول 2 ، مما يوفر تمثيلًا مرئيًا للمقاييس لكل مجموعة من الملصقات.

 

البرمجة اللغوية العصبية المتعددة التسمية: تحليل لنهج عدم توازن الفئة وفقدان الوظيفة
الشكل 5. المقاييس مقابل مجموعات التسمية. جميع القيم الصفرية = 0.

في هذه المقالة الشاملة ، أوضحنا أن مهمة بسيطة على ما يبدو لتصنيف النص متعدد التسميات يمكن أن تكون صعبة عند تطبيق الطرق التقليدية. لقد اقترحنا استخدام وظائف خسارة موازنة التوزيع لمعالجة مشكلة عدم التوازن الطبقي.

لقد قارنا أداء نهجنا المقترح بالطريقة الكلاسيكية ، وقمنا بتقييمه باستخدام مقاييس الأعمال الواقعية. توضح النتائج أن استخدام وظائف الخسارة لمعالجة اختلالات الفئة وتكرار التكرار يوفر حلاً قابلاً للتطبيق لتصنيف النص متعدد التسميات.

تسلط حالة الاستخدام المقترحة الضوء على أهمية النظر في الأساليب والتقنيات المختلفة عند التعامل مع تصنيف النص متعدد العلامات ، والفوائد المحتملة لوظائف خسارة موازنة التوزيع في معالجة اختلالات الفئات.

إذا كنت تواجه مشكلة مماثلة وتسعى إلى تبسيط عمليات معالجة المستندات داخل مؤسستك ، يرجى الاتصال بي أو بفريق Provectus. يسعدنا مساعدتك في إيجاد طرق أكثر كفاءة لأتمتة عملياتك.

 
 
أولكسي بيبيش هو مهندس تعلم الآلة في Provectus. مع خلفية في الفيزياء ، يمتلك مهارات تحليلية ورياضية ممتازة ، واكتسب خبرة قيمة من خلال البحث العلمي وعروض المؤتمرات الدولية ، بما في ذلك SPIE Photonics West. تتخصص Oleksii في إنشاء حلول AI / ML شاملة وواسعة النطاق للرعاية الصحية وصناعات التكنولوجيا المالية. يشارك في كل مرحلة من مراحل دورة حياة تطوير ML ، من تحديد مشاكل العمل إلى نشر وتشغيل نماذج ML للإنتاج.
 

رينات أحمدوف هو مهندس حلول ML في Provectus. مع خلفية عملية قوية في التعلم الآلي (خاصة في رؤية الكمبيوتر) ، فإن Rinat هو الطالب الذي يذاكر كثيرا ، والمتحمسين للبيانات ، ومهندس البرمجيات ، ومدمن العمل ولديه ثاني أكبر شغفه هو البرمجة. في Provectus ، يكون Rinat مسؤولاً عن اكتشاف وإثبات مراحل المفهوم ، ويقود تنفيذ مشاريع الذكاء الاصطناعي المعقدة.
 

الطابع الزمني:

اكثر من KD nuggets