Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

دوال تعلّم الآلة

evalMLMethod

لإجراء التنبؤ باستخدام نماذج الانحدار المُقدَّرة، تُستخدَم الدالة evalMLMethod. راجع الرابط ضمن linearRegression.

stochasticLinearRegression

تُنفِّذ دالة التجميع stochasticLinearRegression أسلوب الانحدار المتدرّج العشوائي باستخدام نموذج خطي ودالة خسارة MSE. وتستخدم evalMLMethod للتنبؤ بالبيانات الجديدة.

stochasticLogisticRegression

تُنفِّذ دالة التجميع stochasticLogisticRegression أسلوب الهبوط التدريجي العشوائي لمشكلة التصنيف الثنائي. وتستخدم evalMLMethod للتنبؤ بالبيانات الجديدة.

naiveBayesClassifier

يُصنّف النص المُدخل باستخدام نموذج Naive Bayes مع n-grams وتنعيم لابلاس. يجب تهيئة النموذج في ClickHouse قبل استخدامه.

البنية

naiveBayesClassifier(model_name, input_text);

الوسائط

  • model_name — اسم النموذج المُعَدّ مسبقًا. String يجب أن يكون النموذج معرّفًا في ملفات تكوين ClickHouse (انظر أدناه).
  • input_text — النص المراد تصنيفه. String تُعالَج المدخلات تمامًا كما أُدخِلت (مع الحفاظ على حالة الأحرف وعلامات الترقيم).

القيمة المعادة

  • معرّف الفئة المتوقعة على هيئة عدد صحيح غير موقّع. UInt32 تتوافق معرّفات الفئات مع التصنيفات المحددة أثناء إنشاء النموذج.

مثال

صنّف نصًا باستخدام نموذج لاكتشاف اللغة:

SELECT naiveBayesClassifier('language', 'How are you?');
┌─naiveBayesClassifier('language', 'How are you?')─┐
│ 0                                                │
└──────────────────────────────────────────────────┘

قد تمثل النتيجة 0 اللغة الإنجليزية، بينما قد تشير 1 إلى الفرنسية — إذ تعتمد دلالات الفئات على بيانات التدريب لديك.


تفاصيل التنفيذ

الخوارزمية تستخدم خوارزمية التصنيف Naive Bayes مع تنعيم لابلاس للتعامل مع تسلسلات n-gram غير المرصودة، وذلك بالاستناد إلى احتمالات n-gram كما هو موضح هنا.

الميزات الرئيسية

  • تدعم تسلسلات n-gram بأي طول
  • ثلاثة أوضاع للتقسيم إلى رموز:
    • byte: يعمل على البايتات الخام. كل بايت يُعد رمزًا واحدًا.
    • codepoint: يعمل على القيم القياسية في Unicode المفككة من UTF‑8. كل نقطة ترميز تُعد رمزًا واحدًا.
    • token: يُقسِّم عند تتابعات المسافات البيضاء في Unicode (regex \s+). تكون الرموز سلاسل فرعية غير بيضاء؛ وتُعد علامات الترقيم جزءًا من الرمز إذا كانت ملاصقة له (على سبيل المثال، "you?" يُعد رمزًا واحدًا).

إعداد النموذج

يمكنك العثور على شيفرة مصدرية نموذجية لإنشاء نموذج Naive Bayes لاكتشاف اللغة هنا.

بالإضافة إلى ذلك، تتوفر نماذج نموذجية وملفات التكوين المرتبطة بها هنا.

فيما يلي مثال على إعداد نموذج Naive Bayes في ClickHouse:

<clickhouse>
    <nb_models>
        <model>
            <name>sentiment</name>
            <path>/etc/clickhouse-server/config.d/sentiment.bin</path>
            <n>2</n>
            <mode>token</mode>
            <alpha>1.0</alpha>
            <priors>
                <prior>
                    <class>0</class>
                    <value>0.6</value>
                </prior>
                <prior>
                    <class>1</class>
                    <value>0.4</value>
                </prior>
            </priors>
        </model>
    </nb_models>
</clickhouse>

معلمات الإعداد

المعلمة الوصف مثال الافتراضي
name معرّف فريد للنموذج language_detection مطلوب
path المسار الكامل للملف التنفيذي الخاص بالنموذج /etc/clickhouse-server/config.d/language_detection.bin مطلوب
mode طريقة تجزئة النص:
- byte: تسلسلات بايت
- codepoint: نقاط ترميز Unicode
- token: رموز الكلمات
token مطلوب
n حجم n-gram (في وضع token):
- 1=كلمة واحدة
- 2=أزواج كلمات
- 3=ثلاثيات كلمات
2 مطلوب
alpha معامل تنعيم لابلاس المستخدم أثناء التصنيف لمعالجة سلاسل n-grams التي لا تظهر في النموذج 0.5 1.0
priors احتمالات الفئات (% من المستندات التي تنتمي إلى فئة) 60% للفئة 0، 40% للفئة 1 توزيع متساوٍ

دليل تدريب النموذج

تنسيق الملف بتنسيق مقروء بشريًا، بالنسبة إلى n=1 ووضع token، قد يبدو النموذج كما يلي:

<class_id> <n-gram> <count>
0 excellent 15
1 refund 28

بالنسبة إلى n=3 ونمط codepoint، فقد يبدو الأمر كما يلي:

<class_id> <n-gram> <count>
0 exc 15
1 ref 28

لا يستخدم ClickHouse التنسيق المقروء للبشر مباشرةً؛ إذ يجب تحويله إلى التنسيق الثنائي الموضّح أدناه.

تفاصيل التنسيق الثنائي يُخزَّن كل n-gram كما يلي:

  1. class_id بحجم 4 بايت (UInt، little-endian)
  2. طول بايتات n-gram بحجم 4 بايت (UInt، little-endian)
  3. بايتات n-gram الخام
  4. count بحجم 4 بايت (UInt، little-endian)

متطلبات المعالجة المسبقة قبل إنشاء النموذج من مجموعة المستندات، يجب إجراء معالجة مسبقة للمستندات لاستخراج n-grams وفقًا للقيمتين المحددتين mode وn. توضّح الخطوات التالية هذه المعالجة المسبقة:

  1. أضف علامات الحدود في بداية كل مستند ونهايته استنادًا إلى وضع تقطيع الرموز:

    • Byte: 0x01 (البداية)، 0xFF (النهاية)
    • نقطة ترميز: U+10FFFE (البداية)، U+10FFFF (النهاية)
    • Token: <s> (البداية)، </s> (النهاية)

    ملاحظة: تُضاف (n - 1) من الرموز في كلٍّ من بداية المستند ونهايته.

  2. Example على n=3 في وضع token:

    • المستند: "ClickHouse is fast"
    • تتم معالجته على النحو التالي: <s> <s> ClickHouse is fast </s> </s>
    • مقاطع trigram المُولَّدة:
      • <s> <s> ClickHouse
      • <s> ClickHouse is
      • ClickHouse is fast
      • is fast </s>
      • fast </s> </s>

لتبسيط إنشاء النموذج لوضعي byte ونقطة ترميز، قد يكون من المناسب أولًا تقسيم المستند إلى رموز (قائمة من قيم byte في وضع byte، وقائمة من قيم نقطة ترميز في وضع نقطة ترميز). بعد ذلك، أضِف n - 1 من رموز البداية في أول المستند وn - 1 من رموز النهاية في آخره. وأخيرًا، أنشئ n-grams واكتبها في الملف المُسلسَل.


evalMLMethod

أُضيفت في: v20.1.0

تُطبِّق نموذج تعلّم آلي مُدرَّبًا على سمات الإدخال لتوليد تنبؤات.

بنية

evalMLMethod(model, x1[, x2, ...])

وسيطات الدالة

القيمة المُعادة

تُرجِع القيمة المتوقعة استنادًا إلى النموذج المُدرَّب. Float64

أمثلة

مثال على الاستخدام

CREATE TABLE trips (pickup_datetime DateTime('UTC'), trip_distance Float64, total_amount Float64) ENGINE = Memory;

-- A fare of 3, plus 2.5 for every unit of distance.
INSERT INTO trips
SELECT toDateTime('2020-01-01 00:00:00', 'UTC') + number * 60, number % 10 + 1, 2.5 * (number % 10 + 1) + 3
FROM numbers(1000);

-- One model per year of the data.
CREATE TABLE models ENGINE = Memory AS
SELECT
    toYear(pickup_datetime) AS year,
    stochasticLinearRegressionState(0.01, 0.0, 10, 'SGD')(total_amount, trip_distance) AS model
FROM trips
GROUP BY year;

SELECT
    trip_distance,
    round(evalMLMethod(model, trip_distance), 2) AS predicted,
    total_amount
FROM trips
LEFT JOIN models ON year = toYear(pickup_datetime)
ORDER BY pickup_datetime
LIMIT 5
┌─trip_distance─┬─predicted─┬─total_amount─┐
│             1 │      4.05 │          5.5 │
│             2 │      6.79 │            8 │
│             3 │      9.53 │         10.5 │
│             4 │     12.28 │           13 │
│             5 │     15.02 │         15.5 │
└───────────────┴───────────┴──────────────┘

naiveBayesClassifier

أُضيف في: v25.11.0

يُصنّف النص المُدخل باستخدام قاموس NAIVE_BAYES. ويُرجع قيمة الفئة المتوقعة نفسها التي تُرجعها dictGet(dictionary_name, class_attribute, input_text)، حيث إن class_attribute هو اسم سمة تصنيف الفئة المُهيأة في التخطيط الخاصة بالقاموس. وعلى عكس dictGet، يكون نوع النتيجة دائمًا UInt32 بدلًا من النوع المُعلن لسمة الفئة، ويجب أن يكون input_text من النوع String (ولا يُطبَّق أي تحويل لنوع المفتاح).

الصياغة

naiveBayesClassifier(dictionary_name, input_text)

وسيطات الدالة

  • dictionary_name — اسم قاموس يستخدم التخطيط NAIVE_BAYES. String
  • input_text — النص المراد تصنيفه. String

القيمة المعادة

معرّف الفئة المتوقعة. UInt32

أمثلة

تصنيف النص

-- A dictionary built from the token counts of two classes: 0 for a positive review, 1 for a negative one.
CREATE TABLE review_tokens (ngram String, class_id UInt32, count UInt64) ENGINE = Memory;
INSERT INTO review_tokens VALUES ('good', 0, 5), ('great', 0, 4), ('excellent', 0, 3), ('bad', 1, 5), ('awful', 1, 4), ('terrible', 1, 3);

CREATE DICTIONARY sentiment (ngram String, class_id UInt32 DEFAULT 0, count UInt64 DEFAULT 0)
PRIMARY KEY ngram
SOURCE(CLICKHOUSE(TABLE 'review_tokens'))
LAYOUT(NAIVE_BAYES(class_attribute 'class_id' n 1 mode 'token'))
LIFETIME(0);

SELECT naiveBayesClassifier('sentiment', 'a good and great film') AS class_id;
┌─class_id─┐
│        0 │
└──────────┘

naiveBayesClassifierWithAllProbs

أُضيفت في: v26.7.0

تُصنِّف نص مُدخل باستخدام قاموس NAIVE_BAYES وتُرجِع جميع الفئات مع احتمالاتها، مرتبة من الأكثر احتمالًا إلى الأقل.

بنية

naiveBayesClassifierWithAllProbs(dictionary_name, input_text)

وسيطات الدالة

  • dictionary_name — اسم قاموس ذي تخطيط NAIVE_BAYES. String
  • input_text — النص المراد تصنيفه. String

القيمة المُعادة

مصفوفة من عناصر Tuple بالتنسيق (معرّف_الفئة، الاحتمال)، مرتبة من الأعلى احتمالًا إلى الأقل. Array(Tuple(UInt32, Float64))

أمثلة

كل احتمالات الفئات

-- A dictionary built from the token counts of two classes: 0 for a positive review, 1 for a negative one.
CREATE TABLE review_tokens (ngram String, class_id UInt32, count UInt64) ENGINE = Memory;
INSERT INTO review_tokens VALUES ('good', 0, 5), ('great', 0, 4), ('excellent', 0, 3), ('bad', 1, 5), ('awful', 1, 4), ('terrible', 1, 3);

CREATE DICTIONARY sentiment (ngram String, class_id UInt32 DEFAULT 0, count UInt64 DEFAULT 0)
PRIMARY KEY ngram
SOURCE(CLICKHOUSE(TABLE 'review_tokens'))
LAYOUT(NAIVE_BAYES(class_attribute 'class_id' n 1 mode 'token'))
LIFETIME(0);

SELECT arrayMap(p -> (p.1, round(p.2, 4)), naiveBayesClassifierWithAllProbs('sentiment', 'a good and great film')) AS predictions;
┌─predictions─────────────┐
│ [(0,0.9677),(1,0.0323)] │
└─────────────────────────┘

naiveBayesClassifierWithProb

أُضيف في: v26.7.0

يُصنّف النص المُدخل باستخدام قاموس NAIVE_BAYES ويُرجع الفئة المتوقعة مع احتمالها.

البنية

naiveBayesClassifierWithProb(dictionary_name, input_text)

وسيطات الدالة

  • dictionary_name — اسم قاموس بتخطيط NAIVE_BAYES. String
  • input_text — النص المراد تصنيفه. String

القيمة المُعادة

Tuple يتكوّن من (class_id, probability). Tuple(UInt32, Float64)

أمثلة

التصنيف مع الاحتمال

-- A dictionary built from the token counts of two classes: 0 for a positive review, 1 for a negative one.
CREATE TABLE review_tokens (ngram String, class_id UInt32, count UInt64) ENGINE = Memory;
INSERT INTO review_tokens VALUES ('good', 0, 5), ('great', 0, 4), ('excellent', 0, 3), ('bad', 1, 5), ('awful', 1, 4), ('terrible', 1, 3);

CREATE DICTIONARY sentiment (ngram String, class_id UInt32 DEFAULT 0, count UInt64 DEFAULT 0)
PRIMARY KEY ngram
SOURCE(CLICKHOUSE(TABLE 'review_tokens'))
LAYOUT(NAIVE_BAYES(class_attribute 'class_id' n 1 mode 'token'))
LIFETIME(0);

WITH naiveBayesClassifierWithProb('sentiment', 'a good and great film') AS p
SELECT (p.1, round(p.2, 4)) AS prediction;
┌─prediction─┐
│ (0,0.9677) │
└────────────┘
Navigation