مخازن الميزات وهندسة الميزات

الغوص العميق في Feast

4 دقيقة للقراءة

Feast (مخزن الميزات) هو أشهر مخزن ميزات مفتوح المصدر. يوفر طريقة متسقة لتعريف وتخزين وتقديم الميزات للتدريب والاستدلال.

التثبيت

# ثبّت Feast
pip install feast

# تحقق من التثبيت
feast version

هيكل المشروع

# ابدأ مشروع Feast جديد
feast init my_feature_store
cd my_feature_store

هذا يُنشئ:

my_feature_store/
├── feature_store.yaml    # تكوين المشروع
├── feature_repo/
│   ├── __init__.py
│   ├── entities.py       # تعريفات الكيانات
│   ├── features.py       # تعريفات عروض الميزات
│   └── data/             # بيانات نموذجية
└── README.md

المفاهيم الأساسية

1. الكيان

الكيانات هي الكائنات التي تحسب الميزات لها:

from feast import Entity

# عرّف كيان العميل
customer = Entity(
    name="customer_id",
    description="معرف العميل الفريد"
)

# عرّف كيان المنتج
product = Entity(
    name="product_id",
    description="معرف المنتج الفريد"
)

2. عرض الميزات

عروض الميزات تُعرف كيف تُحسب وتُخزن الميزات:

from feast import FeatureView, Field, FileSource
from feast.types import Float32, Int64, String
from datetime import timedelta

# مصدر البيانات
customer_source = FileSource(
    path="data/customer_features.parquet",
    timestamp_field="event_timestamp"
)

# تعريف عرض الميزات
customer_features = FeatureView(
    name="customer_features",
    entities=[customer],
    ttl=timedelta(days=365),
    schema=[
        Field(name="total_purchases", dtype=Int64),
        Field(name="avg_order_value", dtype=Float32),
        Field(name="days_since_last_order", dtype=Int64),
        Field(name="customer_segment", dtype=String),
    ],
    source=customer_source,
)

3. خدمة الميزات

اجمع الميزات معاً للتقديم:

from feast import FeatureService

# خدمة ميزات للتنبؤ بالانسحاب
churn_prediction_service = FeatureService(
    name="churn_prediction",
    features=[
        customer_features[["total_purchases", "avg_order_value"]],
        transaction_features[["transaction_count_30d"]],
    ],
)

التكوين

feature_store.yaml

project: my_feature_store
registry: data/registry.db
provider: local

online_store:
  type: sqlite
  path: data/online_store.db

offline_store:
  type: file

entity_key_serialization_version: 2

تكوين الإنتاج (AWS)

project: my_feature_store
registry: s3://my-bucket/registry.db
provider: aws

online_store:
  type: dynamodb
  region: us-east-1

offline_store:
  type: redshift
  cluster_id: my-redshift-cluster
  region: us-east-1
  database: ml_features
  user: feast_user
  s3_staging_location: s3://my-bucket/feast-staging/

مثال كامل

تعريف الميزات

# feature_repo/features.py
from feast import Entity, FeatureView, Field, FileSource, FeatureService
from feast.types import Float32, Int64
from datetime import timedelta

# الكيانات
customer = Entity(
    name="customer_id",
    description="معرف العميل"
)

# مصادر البيانات
customer_source = FileSource(
    path="data/customer_stats.parquet",
    timestamp_field="event_timestamp"
)

transaction_source = FileSource(
    path="data/transaction_stats.parquet",
    timestamp_field="event_timestamp"
)

# عروض الميزات
customer_stats = FeatureView(
    name="customer_stats",
    entities=[customer],
    ttl=timedelta(days=365),
    schema=[
        Field(name="lifetime_value", dtype=Float32),
        Field(name="total_orders", dtype=Int64),
        Field(name="avg_order_value", dtype=Float32),
    ],
    source=customer_source,
)

transaction_stats = FeatureView(
    name="transaction_stats",
    entities=[customer],
    ttl=timedelta(days=30),
    schema=[
        Field(name="transactions_7d", dtype=Int64),
        Field(name="transactions_30d", dtype=Int64),
        Field(name="amount_7d", dtype=Float32),
    ],
    source=transaction_source,
)

# خدمة الميزات
prediction_service = FeatureService(
    name="prediction_features",
    features=[
        customer_stats,
        transaction_stats[["transactions_30d", "amount_7d"]],
    ],
)

تطبيق تعريفات الميزات

# سجّل الميزات مع Feast
feast apply

التجسيد للمخزن الفوري

# جسّد الميزات للتقديم الفوري
feast materialize 2024-01-01 2025-01-01

استخدام الميزات

التدريب (المخزن غير الفوري)

from feast import FeatureStore
import pandas as pd

# ابدأ مخزن الميزات
store = FeatureStore(repo_path=".")

# إطار بيانات الكيانات مع الطوابع الزمنية
entity_df = pd.DataFrame({
    "customer_id": [1001, 1002, 1003, 1004],
    "event_timestamp": pd.to_datetime([
        "2025-01-01", "2025-01-02", "2025-01-03", "2025-01-04"
    ])
})

# احصل على الميزات التاريخية للتدريب
training_df = store.get_historical_features(
    entity_df=entity_df,
    features=[
        "customer_stats:lifetime_value",
        "customer_stats:total_orders",
        "transaction_stats:transactions_30d",
    ],
).to_df()

print(training_df)
# الناتج:
#    customer_id  event_timestamp  lifetime_value  total_orders  transactions_30d
# 0         1001       2025-01-01          1500.0            25                 5
# 1         1002       2025-01-02           800.0            12                 3
# ...

الاستدلال (المخزن الفوري)

from feast import FeatureStore

store = FeatureStore(repo_path=".")

# احصل على الميزات للاستدلال الفوري
features = store.get_online_features(
    features=[
        "customer_stats:lifetime_value",
        "customer_stats:total_orders",
        "transaction_stats:transactions_30d",
    ],
    entity_rows=[
        {"customer_id": 1001},
        {"customer_id": 1002},
    ],
).to_dict()

print(features)
# الناتج:
# {
#     "customer_id": [1001, 1002],
#     "lifetime_value": [1500.0, 800.0],
#     "total_orders": [25, 12],
#     "transactions_30d": [5, 3]
# }

استخدام خدمات الميزات

# استخدام خدمة ميزات لمجموعات ميزات متسقة
features = store.get_online_features(
    feature_service=store.get_feature_service("prediction_features"),
    entity_rows=[{"customer_id": 1001}],
).to_dict()

أوامر Feast CLI

الأمر الغرض
feast init إنشاء مشروع جديد
feast apply تسجيل/تحديث الميزات
feast materialize ملء المخزن الفوري
feast materialize-incremental تجسيد تدريجي
feast ui تشغيل واجهة الويب
feast teardown إزالة جميع الموارد

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

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

الرؤية الرئيسية: Feast يسد الفجوة بين مستودع البيانات (غير فوري) وخدمة الاستدلال (فوري)، يضمن استخدام نفس منطق الميزات في كل مكان.

التالي، سنستكشف خطوط أنابيب هندسة الميزات وأفضل الممارسات. :::

اختبار

الوحدة 4: مخازن الميزات وهندسة الميزات

خذ الاختبار