وضع نماذج الانحدار في Ads Data Hub

الانحدار الخطّي واللوجستي هما نماذج تعلُّم الآلة التي تتيح لك إنشاء توقّعات مفيدة من البيانات الإعلانية.

  • ينشئ الانحدار الخطي دالة لتتناسب مع أحد الخطوط مع البيانات بحيث تقل المسافة بين نقاط البيانات وخطها. يمكن بعد ذلك استخدام هذا النموذج للتنبؤ بالقيمة الرقمية بناءً على المدخلات، مثل توقع القيمة الدائمة للمستخدم بناءً على عمليات الشراء والتفاعلات السابقة وما إلى ذلك.
  • يُستخدم الانحدار اللوجستي في مشاكل التصنيف التنبؤي. يمكن أن يكون النموذج أحد نوعَين بناءً على عدد المتغيّرات التي تقدِّمها:
    • يجيب الانحدار اللوجستي الثنائي بـ "نعم/لا" مثل مدى احتمالية وقوع حدث إحالة ناجحة.
    • يُستخدَم الانحدار اللوجستي متعدد الفئات للتنبؤ بقيم متعددة محتملة، مثل تحديد ما إذا كان العميل "منخفض القيمة" أو "متوسطة" أو "عالي القيمة".

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

الخصوصية التفاضلية

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

الحدّ من طلبات البحث

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

آلية العمل

ويتبع سير العمل الخطوات الأساسية التالية:

  1. إعداد بيانات التدريب.
  2. أنشئ نموذجًا.
  3. اجمع الأفكار من النموذج.

إعداد بيانات التدريب

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

بشكل تلقائي، تختار Ads Data Hub بشكلٍ عشوائي% 18 من بيانات التدريب لاستخدامها في عملية التحقّق. يمكن التحكّم في النسبة المئوية للبيانات المستخدمة للتحقّق من الصحة من خلال الخيار data_split_eval_fraction.

إنشاء نموذج

تحديد المعاملات وإدخال البيانات لتدريب النموذج.

أفضل الممارسات

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

  • لقد لاحظنا الدقة > 0.70 لنماذج الانحدار اللوجستي التي تم إنشاؤها من مجموعات تدريب تضم 100,000 مستخدم على الأقل.
  • لقد رأينا معامل التحديد > 0.70 لنماذج الانحدار الخطي التي تم إنشاؤها من مجموعات تدريب تضم 800,000 مستخدم على الأقل.

وهناك عوامل أخرى يمكن أن تقلل من جودة النموذج.

  • نماذج لوجستية يكون فيها تمثيل فئة ما أعلى بكثير من الفئات الأخرى. على وجه التحديد، إذا كان أحد التصنيفات يتضمّن عددًا قليلاً من مستخدمي مجموعة التدريب، فإنّ توفُّر الكثير من مجموعات التدريب للمستخدمين الذين لديهم تصنيفات أخرى قد لا يؤثر بشكل كبير في دقة النموذج على التصنيف الصغير. على سبيل المثال، 20,000 1000 مستخدم لمجموعة التدريب في تصنيفين أسوأ من 10000 2000.
  • بيانات ميزة لا توفّر إشارة قوية للتصنيفات.
  • البيانات الأولية التي تحتاج إلى هندسة ميزات أكثر شمولاً. على سبيل المثال، قد تحتوي بعض الحقول على عدد كبير جدًا من القيم المحتملة. تتمثل إحدى طرق تحسين البيانات من هذا النوع في تحويل القيم إلى ميزة ذات عدد أقل من الفئات، أو المجموعات.

جمع الإحصاءات

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

جملة CREATE MODEL

تنشئ عبارة CREATE MODEL نموذجًا بالاسم ومجموعة البيانات التي تحددها. إذا كان اسم النموذج متوفّرًا من قبل، سيحلّ CREATE MODEL محلّ النموذج الحالي.

بناء جملة CREATE MODEL

CREATE MODEL
model_name
OPTIONS
(
  // model_option_list:
  // Required parameter.
  MODEL_TYPE = { 'ADH_LINEAR_REGRESSION' | 'ADH_LOGISTIC_REGRESSION'}

  // Optional tuning parameters.
  [, L1_REG = float64_value ]
  [, L2_REG = float64_value ]
  [, DATA_SPLIT_EVAL_FRACTION = float64_value ]
  [, OPTIMIZE_STRATEGY = { 'AUTO_STRATEGY' | 'BATCH_GRADIENT_DESCENT' |
                           'NORMAL_EQUATION' } ]
  [, MAX_ITERATIONS = int64_value ]
  [, LEARN_RATE_STRATEGY = { 'LINE_SEARCH' | 'CONSTANT' } ]
  [, LEARN_RATE = float64_value ]
  [, EARLY_STOP = { TRUE | FALSE } ]
  [, MIN_REL_PROGRESS = float64_value ]
  [, LS_INIT_LEARN_RATE = float64_value ]
  [, EPSILON_PER_MODEL = float64_value ]
  [, AUTOMATIC_IMPUT_SCALING = bool_value ]
  [, MIN_MAX_SCALED_COLS = [string_value, string_value... ] ]
  [, STANDARD_SCALED_COLS = [string_value, string_value... ] ]
  [, QUANTILE_BUCKETIZED_COLS = [
        STRUCT(string_value AS col_name, int64_value AS num_buckets), 
       STRUCT(string_value AS col_name, int64_value AS num_buckets)... ] ]
)
AS query_statement

model_name

اسم أبجدي رقمي، بما في ذلك الشرطات السفلية والشرطات. لا يمكن تضمين نقاط. إذا كان اسم النموذج الذي قدمته موجودًا من قبل، فسيتم استبدال النموذج القديم.

query_statement

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

model_option_list

model_type

(مطلوب) الخيار الوحيد المطلوب. يمكن أن تكون "adh_linear_regression" أو "adh_logistic_regression"

l1_reg

(اختياري) مقدار تسوية المستوى الأول المطبَّق. تؤدّي تسوية المستوى 1 إلى فرض عقوبات على الترجيحات بما يتناسب مع مجموع القيم المطلقة لها. ويمكن أن يكون أي رقم غير سالب، ويتم ضبطه تلقائيًا على صفر.

l2_reg

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

data_split_eval_fraction

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

كسر التحقق من الصحة طلبات البحث المسموح بها
0.01 7
0.1 8
0.15 8
0.18 9
0.2 9
0.3 10
0.5 14
0.9 50

optimize_strategy

(اختياري) استراتيجية تدريب نماذج الانحدار الخطي.

الوسيطات

"AUTO_STRATEGY" استراتيجية التدريب على النحو التالي:

  • إذا تم تحديد l1_reg أو warm_start، يتم استخدام الاستراتيجية batch_gradient_descent.
  • إذا كان إجمالي عدد القيم الفريدة لميزات التدريب أكثر من 10,000، يتم استخدام استراتيجية batch_gradient_descent.
  • إذا حدثت مشكلة في فرط التخصيص (كان عدد أمثلة التدريب أقل من 10 • إجمالي عدد العناصر في الحقل)، يتم استخدام استراتيجية batch_gradient_descent.
  • يتم استخدام استراتيجية NORMAL_EQUATION في جميع الحالات الأخرى.

"BATCH_GRADIENT_DESCENT" (الخدمات اللوجستية فقط) تطبق النموذج باستخدام طريقة انحدار التدرج المجمعة، والتي تعمل على تحسين دالة الخسارة باستخدام دالة التدرج.

"NORMAL_EQUATION" (الخطي فقط) تحسب مباشرةً الحل التربيعي الأقل لمشكلة الانحدار الخطي باستخدام المعادلة التحليلية. لا يمكن استخدام المعادلة العادية في الحالات التالية:

  • تم تحديد l1_reg.
  • تم تحديد warm_start.
  • إجمالي عدد العناصر في الحقل لميزات التدريب أكثر من 10,000.
  • القيمة التلقائية هي "AUTO_STRATEGY".

max_iterations

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

learn_rate_strategy

(اختياري، لوجستي فقط) استراتيجية تحديد معدل التعلم أثناء التدريب.

الوسيطات

"LINE_SEARCH" طريقة البحث الخطي لحساب معدل التعلم. معدل التعلم الأولي للبحث الخطي هو القيمة المحددة لـ LS_INIT_LEARN_RATE .

  • يعمل البحث الخطي على إبطاء التدريب وزيادة عدد وحدات البايت التي تتم معالجتها، ولكنه يتقارب بشكل عام حتى مع معدل تعلُّم مبدئي محدد أكبر.

"CONSTANT" لضبط معدل التعلّم على القيمة المحدّدة لـ LEARN_RATE.

القيمة التلقائية هي "LINE_SEARCH".

learn_rate

(اختياري، لوجستي فقط) معدّل التعلّم لخورازمية انحدار التدرج عند ضبط LEARN_RATE_STRATEGY على CONSTANT إذا تم ضبط LEARN_RATE_STRATEGY على "LINE_SEARCH"، سيظهر خطأ.

الوسيطات

يمكن أن يكون float64_value أي رقم نقطة عائمة 64 بت. القيمة التلقائية هي 0.1 (10%).

early_stop

(اختياري) ما إذا كان يجب إيقاف التدريب بعد التكرار الأول الذي يكون فيه التحسُّن النسبي أقل من القيمة المحدّدة للسمة MIN_REL_PROGRESS

الوسيطات

TRUE مقابل "نعم"، وFALSE للتعبير عن "لا". وتكون القيمة التلقائية هي TRUE.

min_rel_progress

(اختياري) الحدّ الأدنى للتحسين من الخسارة النسبية اللازم لمواصلة التدريب عند ضبط EARLY_STOP على "صحيح". على سبيل المثال، تحدد القيمة 0.01 أن كل تكرار يجب أن يقلل الخسارة بنسبة 1٪ حتى يستمر التدريب.

الوسيطات

يمكن أن يكون float64_value أي رقم نقطة عائمة 64 بت. القيمة التلقائية هي 0.1 (10%).

ls_init_learn_rate

(اختياري) تضبط هذه السياسة معدّل التعلّم الأولي الذي يستخدمه LEARN_RATE_STRATEGY='LINE_SEARCH'. لا يمكن استخدام هذا الخيار إلا إذا تم تحديد LINE_SEARCH.

إذا تضاعفت قيمة LEARN_RATE للنموذج كل تكرار كما هو موضّح في ML.TRAINING_INFO، جرِّب ضبط LS_INIT_LEARN_RATE على آخر معدّل تعلُّم تم مضاعفته. يختلف معدّل التعلّم الأولي الأمثل لكل نموذج. قد لا يكون معدّل التعلّم الأولي الجيد لأحد النماذج معدّل تعلم أوّليًا جيدًا لنموذج آخر.

الوسيطات

يمكن أن يكون float64_value أي رقم نقطة عائمة 64 بت.

epsilon_per_model

(اختياري) تحدّد مبلغ ميزانية الخصوصية الذي سيتم استخدامه لتدريب هذا النموذج. يُمنح كل عميل بيانات في "إعلانات Google" ميزانية خصوصية قدرها 10.0 لكل يوم بيانات في اليوم. سينفق النموذج المدرَّب بنجاح EPSILON_PER_MODEL من الميزانية لكل يوم بيانات في النطاق الزمني المحدد عند تشغيل الاستعلام. سيتيح استخدام القيمة الافتراضية ln(3)/10 إنشاء حوالي 100 نموذج. إذا استخدمت قيمة أعلى، ستتمكن من إنشاء عدد أقل من النماذج، ولكنها ستكون ذات جودة أعلى. وإذا استخدمت قيمة أصغر، ستتمكّن من إنشاء المزيد من النماذج ذات الجودة الأقل.

الوسيطات

يمكن أن يكون float64_value أي رقم نقطة عائمة 64 بت أقل من ln(3)، أي حوالي 1.0986. الإعداد التلقائي هو ln(3)/10.

automatic_input_scaling

(اختياري) عند استخدام TRUE، سيتم تلقائيًا تطبيق min_max_scaling على جميع أعمدة العناصر الرقمية، كما لو كان قد تم استدعاء أسماء الأعمدة بشكلٍ صريح في الخيار min_max_scaled_cols، باستثناء أي أعمدة تم استدعاؤها صراحةً في الخيارَين standard_scaled_cols أو quantile_bucketized_cols.

الوسيطات

قيمة bool_value هي BOOL، والقيمة التلقائية هي TRUE.

min_max_scaled_cols

(اختياري) تعمل على ضبط كل عمود من أعمدة ميزة "التعبير الرقمي" المحدّدة في النطاق من 0 إلى 1، مع وضع حد أقصى للسمتَين MIN وMAX في جميع الصفوف. يتم استخدام قيمتَي MIN وMAX نفسيهما تلقائيًا في التوقّع. إذا كانت بيانات التوقّع خارج نطاق MIN أو MAX، يكون الحد الأقصى هو 0 أو 1.

الوسيطات

مصفوفة string_value، حيث يكون كل string_value عبارة عن سلسلة تمثل اسم العمود المطلوب تحويله.

standard_scaled_cols

(اختياري) توحيد أعمدة ميزات numerical_expression المحددة في جميع الصفوف. يتم تلقائيًا استخدام قيمتَي STDDEV وMEAN اللتين تم حسابهما لتوحيد التعبير في التوقّع.

الوسيطات

مصفوفة string_value، حيث تمثل كل string_value STRING يمثل اسم العمود المطلوب تحويله.

quantile_bucketized_cols

تجمِّع أعمدة الميزات الرقمية المستمرة المحددة في STRING مع استخدام اسم الحزمة كقيمة استنادًا إلى نقاط الكمية. ويتم استخدام نفس الأجزاء تلقائيًا في التنبؤ.

الوسيطات

مصفوفة STRUCT(string_value AS col_name, int64_value AS num_buckets)، حيث تكون كلstring_value هي STRING، وتمثّل اسم العمود الرقمي المستمر المطلوب تحويله، وint64_value هي عدد المجموعات المطلوب تقسيم القيم الرقمية إليها.

التحقّق من الصحة

  • يجب أن تتوفر ميزانية خصوصية كافية لكل يوم بيانات في النطاق الزمني المحدد لطلب البحث هذا، أي أكثر من EPSILON_PER_MODEL، وإلا سيتعذّر تنفيذ الطلب.
  • في حالة تحديد معلمات التوليف الاختيارية، سيتم التحقق من النطاقات الموضحة أعلاه.
  • يجب تحديد المعلمة model_type المطلوبة فقط بشكل صريح.
  • يجب تسمية عمود واحد في مجموعة التدريب باسم "label". التصنيفات المتعددة غير متاحة حاليًا.
  • لا يمكن أن يحتوي عمود التصنيف على قيم فارغة (NULL). إذا كان عمود التصنيف يحتوي على قيم فارغة (NULL)، فسيفشل الاستعلام.
  • قد لا يتم اشتقاق أي من أعمدة الميزات من user_id.
  • يجب أن يمثّل كل صف مستخدمًا فريدًا واحدًا بالضبط. لا يمكن أن يمثّل صف واحد بيانات من أكثر من مستخدم واحد. يمكن أن يحدث ذلك مع عمليات دمج معيّنة، مثلاً: لـ CROSS JOIN.
  • لا يمكن لأي مستخدم أن يكون في صفين منفصلين.
  • لأسباب تتعلق بالخصوصية، لا يمكن استخدام سوى الخيارات الموضحة في قسم البنية. لا تتوفّر حاليًا الخيارات الأخرى التي قد تتوفّر في مستندات طلب البحث BQML CREATE MODEL.

دوال التقييم

ML.EVALUATE

استخدِم الدالة ML.EVALUATE لتقييم مقاييس النماذج. يمكن استخدام الدالة ML.EVALUATE مع نماذج الانحدار الخطي أو الانحدار اللوجستي.

SELECT
  *
FROM ML.EVALUATE(MODEL `linear_model_test`);

ML.ROC_CURVE

يمكنك استخدام الدالة ML.ROC_CURVE لتقييم المقاييس الخاصة بالانحدار اللوجستي. لا تقيّم ML.ROC_CURVE سوى نماذج الانحدار اللوجستي.

SELECT
  *
FROM ML.ROC_CURVE(MODEL `logistic_model_test`);

دوال التوقّع

ML.PREDICT

يمكن استخدام الدالة ML.PREDICT للتنبؤ بالناتج باستخدام النموذج. تخضع النتائج التي يتم الحصول عليها باستخدام ML.PREDICT لعمليات فحص الخصوصية نفسها التي تخضع لها النتائج الأخرى في Ads Data Hub. مزيد من المعلومات حول عمليات التحقّق من الخصوصية

الانحدار الخطي

/* This example outputs the average value for labels that the model predicted */
SELECT
  AVG(predicted_label) AS average_predicted_label
FROM
  ML.PREDICT(MODEL `linear_model_test`, TABLE tmp.linear_training_set);

الانحدار اللوجستي

/* This example outputs the model's prediction and probabilities for said prediction over individual users. It groups by label and prediction, counting the number of users in each prediction */
SELECT
  label,
  predicted_label, /* one of the two input labels, depending on which label has the higher predicted probability */
  COUNT(*) AS num /* a tally of users */
FROM
  ML.PREDICT(MODEL `logistic_model_test`, TABLE tmp.logistic_training_set)
GROUP BY 1, 2;

وظائف فحص النماذج والميزات

ML.TRAINING_INFO

تسمح لك الدالة ML.TRAINING_INFO بالاطّلاع على معلومات حول التكرارات التطبيقية لنموذج ما.

SELECT
  *
FROM ML.TRAINING_INFO(MODEL `logistic_model_test`);

ML.FEATURE_INFO

تسمح لك الدالة ML.FEATURE_INFO بالاطّلاع على معلومات حول ميزات الإدخال المستخدمة لتدريب نموذج.

SELECT
  *
FROM ML.FEATURE_INFO(MODEL `logistic_model_test`);

ML.WEIGHTS

تسمح لك الدالة ML.WEIGHTS بعرض الأوزان الأساسية التي يستخدمها أحد النماذج أثناء التنبؤ.

SELECT
  *
FROM ML.WEIGHTS(MODEL `linear_model_test`);

أمثلة

إنشاء نموذج

تستخدم جميع الأمثلة التالية جدول نماذج natality لتوضيح كيفية إنشاء نموذج.

بيانات التدريب في العناصر الداخلية (الخطية)

يستخدم المثال التالي الوزن عند الولادة، والجنس، وأسابيع الحمل، وعمر الأم، والعرق الأم للتنبؤ بوزن المولود.

CREATE MODEL `natality_model`
OPTIONS
  (model_type='adh_linear_regression') AS
SELECT
  weight_pounds as label,
  is_male,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL

بيانات التدريب في الخيارات الداخلية (الخدمات اللوجستية)

يستخدم المثال التالي وزن الولادة، والجنس، وأسابيع الحمل، وعمر الأم، وعرق الأم للتنبؤ بنوع الجنين.

CREATE MODEL `natality_model`
OPTIONS
  (model_type='adh_logistic_regression') AS
SELECT
  weight_pounds,
  is_male as label,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL

تفعيل شرائح الجمهور

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