All Products
Search
Document Center

:Feature generation

Last Updated:May 16, 2026

FeatureGenerator (FG) adalah proses transformasi data yang mengonversi input mentah menjadi fitur siap pakai untuk model. Proses ini dirancang untuk memastikan konsistensi antara pembuatan sampel offline dan online, serta dikenal pula sebagai transformasi fitur—yaitu transformasi satu atau beberapa fitur. Berbagai jenis operator fitur tersedia untuk menjalankan operasi tersebut.

Feature generation hanya mencakup transformasi yang diperlukan baik untuk pembuatan sampel offline maupun online. Jika suatu transformasi hanya dibutuhkan pada tahap offline, jangan mendefinisikannya sebagai operasi FG. Diagram berikut menunjukkan posisi modul FG dalam arsitektur sistem rekomendasi.

Proses feature generation terdiri atas serangkaian operator fitur (operator FG) yang dieksekusi secara paralel sesuai urutan topologis grafik asiklik terarah (DAG) yang didefinisikan dalam file konfigurasi.

Contoh file konfigurasi

Konfigurasikan operator fitur dalam daftar features. Setiap operator fitur harus menyertakan parameter feature_name dan feature_type. Untuk parameter konfigurasi lainnya, lihat Built-in feature operators.

Parameter reserves menentukan bidang-bidang yang dilewatkan dari task offline dan dioutput apa adanya tanpa transformasi fitur.

{
  "features": [
    {
      "feature_name": "goods_id",
      "feature_type": "id_feature",
      "value_type": "string",
      "expression": "item:goods_id",
      "default_value": "-1024",
      "need_prefix": false
    },
    {
      "feature_name": "color_pair",
      "feature_type": "combo_feature",
      "value_type": "string",
      "expression": ["user:query_color", "item:color"],
      "default_value": "",
      "need_prefix": false
    },
    {
      "feature_name": "current_price",
      "feature_type": "raw_feature",
      "value_type": "double",
      "expression": "item:current_price",
      "default_value": "0",
      "need_prefix": false
    }, 
    {
      "feature_name": "usr_cate1_clk_cnt_1d",
      "feature_type": "lookup_feature",
      "map": "user:usr_cate1_clk_cnt_1d",
      "key": "item:cate1",
      "need_discrete": false,
      "need_key": false,
      "default_value": "0",
      "combiner": "max",
      "need_prefix": false,
      "value_type": "double"
    },
    {
      "feature_name": "recommend_match",
      "feature_type": "overlap_feature",
      "method": "is_contain",
      "query": "user:query_recommend",
      "title": "item:recommend",
      "default_value": "0"
    },
    {
      "feature_name": "norm_title",
      "feature_type": "text_normalizer",
      "expression": "item:title",
      "max_length": 512,
      "parameter": 0,
      "remove_space": false,
      "is_gbk_input": false,
      "is_gbk_output": false
    },
    {
      "feature_name": "title_terms",
      "feature_type": "tokenize_feature",
      "expression": "feature:norm_title",
      "default_value": "",
      "vocab_file": "tokenizer.json",
      "output_type": "word_id",
      "output_delim": ","
    },
    {
      "feature_name": "query_title_match_ratio",
      "feature_type": "overlap_feature",
      "method": "query_common_ratio",
      "query": "user:query_terms",
      "title": "feature:title_terms",
      "default_value": "0"
    },
    {
      "feature_name": "title_term_match_ratio",
      "feature_type": "overlap_feature",
      "method": "title_common_ratio",
      "query": "user:query_terms",
      "title": "feature:title_terms",
      "default_value": "0"
    },
    {
      "feature_name": "term_proximity_min_cover",
      "feature_type": "overlap_feature",
      "method": "proximity_min_cover",
      "query": "user:query_terms",
      "title": "feature:title_terms",
      "default_value": "0"
    }
  ],
  "input_alias": {
    "non_exist_field1": "exist_field1",
    "non_exist_field2": "exist_field2"
  },
  "reserves": [
    "request_id",
    "user_id",
    "is_click",
    "is_pay",
    "sample_weight",
    "event_unix_time"
  ]
}

Item konfigurasi khusus input_alias: kamus yang memetakan nama bidang input yang mungkin tidak ada ke nama bidang aktual. (Konfigurasi input_alias didukung mulai versi 1.0.0 dan seterusnya. Anda biasanya dapat melewatkan konfigurasi ini.)

  • Kasus penggunaan 1: Tetapkan alias yang lebih pendek untuk nama bidang yang panjang.

  • Kasus penggunaan 2: Tetapkan alias untuk parameter kedua ketika operator fitur kustom menggunakan input yang sama untuk dua parameter berbeda.

Bidang input yang sama dapat digunakan ulang di berbagai fitur, tetapi tidak dapat digunakan ulang dalam satu transformasi fitur. Anda dapat mengonfigurasi input_alias untuk menghindari batasan ini.

  • Misalnya, jika operator fitur kustom memiliki dua parameter input yang keduanya memerlukan bidang yang sama A, Anda dapat mengonfigurasi dua input, A dan B, serta input_alias untuk memetakan "B": "A". Saat waktu proses, parameter untuk operator fitur kustom diubah dari (A, B) menjadi (A, A).

Domain Masukan

Domain input menunjukkan entitas tempat input berasal. Empat jenis berikut didukung:

  • user: Fitur sisi pengguna, termasuk profil pengguna dan fitur statistik tingkat pengguna.

  • context: Fitur kontekstual yang berubah pada setiap permintaan, seperti waktu, lokasi, dan cuaca.

  • item: Fitur sisi item, termasuk fitur konten statis dan fitur statistik tingkat item.

  • feature: Output dari operator fitur lain.

Domain input fitur bersifat khusus; ini mengonfigurasi dependensi antar operator fitur. Secara keseluruhan, semua operator fitur membentuk grafik asiklik terarah (DAG). Framework mengeksekusi operasi transformasi fitur ini secara paralel sesuai urutan topologis. Topologi ditunjukkan pada gambar berikut.

Secara default, output dari node perantara dalam DAG tidak digunakan sebagai output FG. Anda dapat menggunakan parameter konfigurasi fitur stub_type untuk mengubah perilaku ini.

Tipe multi-nilai dan pemisah

FG mendukung tipe input kompleks, seperti Array dan Map, yang konsisten dengan tipe kompleks di MaxCompute.

Fitur multi-nilai bertipe string dapat menggunakan chr(29) sebagai pemisah.

Misalnya, dalam v1^]v2^]v3, ^] adalah pemisah multi-nilai. Ini merupakan satu karakter dengan kode ASCII "\x1D", bukan dua karakter. Untuk memasukkan karakter ini, tekan C-q C-5 di emacs atau C-v C-5 di vi.

Pengelompokan fitur (diskretisasi)

Framework mendukung enam jenis operasi pengelompokan berikut:

  • hash_bucket_size: Melakukan penghashan terhadap hasil transformasi fitur dan menerapkan operasi modulo.

  • vocab_list: Memetakan hasil transformasi fitur ke indeks dalam daftar.

  • vocab_dict: Memetakan hasil transformasi fitur ke nilai dalam kamus. Nilainya harus dapat dikonversi ke tipe int64.

  • vocab_file: Membaca vocab_list atau vocab_dict dari file.

  • boundaries: Mengonversi hasil transformasi fitur ke ID bucket yang sesuai berdasarkan batas yang ditentukan.

  • num_buckets: Menggunakan hasil transformasi fitur langsung sebagai ID bucket.

hash_bucket_size

Menjalankan penghashan terhadap hasil transformasi dan menerapkan operasi modulo. Metode ini berlaku untuk semua tipe nilai fitur.

  • Rentang hasil: [0,hash_bucket_size)

  • Hasil pengelompokan fitur untuk nilai kosong adalah hash(default_value)%hash_bucket_size.

{
  "hash_bucket_size": 128000,
  "default_value": "default_value"
}

vocab_list

Mengelompokkan input dengan memetakan nilai fitur ke indeks yang sesuai dalam array vocab_list.

  • Tipe elemen array vocab_list harus sama dengan konfigurasi value_type.

  • num_oov_bucket: Bilangan bulat non-negatif, jumlah bucket out-of-vocabulary.

    • Semua input out-of-vocabulary akan diberi ID dalam rentang [vocabulary_size, vocabulary_size+num_oov_buckets) berdasarkan hash dari nilai input.

    • num_oov_buckets positif tidak dapat ditentukan bersamaan dengan default_bucketize_value.

  • default_bucketize_value: Nilai ID integer yang dikembalikan untuk nilai fitur out-of-vocabulary.

    • Anda tidak dapat menentukan ini saat num_oov_buckets bernilai positif.

    • Nilai default-nya adalah vocab_list.size().

{
  "vocab_list": [
    "",
    "<OOV>",
    "token1",
    "token2",
    "token3",
    "token4"
  ],
  "num_oov_bucket": 0,
  "default_bucketize_value": 1
}

vocab_dict

Hasil pengelompokan adalah nilai dalam kamus vocab_dict yang sesuai dengan nilai fitur. Ini mendukung pemetaan nilai fitur berbeda ke hasil pengelompokan yang sama.

  • Tipe data kunci dalam kamus vocab_dict harus sama dengan konfigurasi value_type.

  • Nilai vocab_dict harus dapat dikonversi ke tipe int64.

  • num_oov_bucket: Bilangan bulat non-negatif, jumlah bucket out-of-vocabulary.

    • Semua input out-of-vocabulary akan diberi ID dalam rentang [vocabulary_size, vocabulary_size+num_oov_buckets) berdasarkan hash dari nilai input.

    • num_oov_buckets positif tidak dapat ditentukan bersamaan dengan default_bucketize_value.

  • default_bucketize_value: Nilai ID integer yang dikembalikan untuk nilai fitur out-of-vocabulary.

    • Ini tidak dapat ditentukan bersamaan dengan num_oov_buckets positif.

    • Nilai default-nya adalah vocab_dict.size().

{
  "vocab_dict": {
    "token1": 1,
    "token2": 2,
    "token3": 3,
    "token4": 1
  },
  "num_oov_bucket": 0,
  "default_bucketize_value": 4
}

vocab_file

Memuat vocab_list atau vocab_dict dari file.

{
  "vocab_file": "vocab.txt",
  "num_oov_bucket": 0,
  "default_bucketize_value": 4
}
  • vocab_file: Jalur ke file kosakata. File berisi kosakata, satu istilah per baris. Anda dapat secara opsional menentukan nilai pemetaan.

    • Jalur relatif didukung. Saat Anda men-deploy layanan online, file tersebut harus ditempatkan di direktori yang sama dengan fg.json.

    • Jika hanya token yang ada, token tersebut dipetakan ke nomor baris (dimulai dari 0). Jika nilai disediakan, token dan nilai dipisahkan oleh karakter whitespace (spasi atau tab). Nilainya harus bertipe int64.

  • num_oov_bucket dan default_bucketize_value memiliki makna yang sama seperti yang dijelaskan di atas.

boundaries

Mengelompokkan fitur numerik berdasarkan batas bin yang ditentukan.

  • Tipe elemen array boundaries harus sama dengan konfigurasi value_type.

  • Bucket mencakup batas kiri dan mengecualikan batas kanan.

  • Misalnya, boundaries=[0., 1., 2.] menghasilkan bucket (-inf, 0.), [0., 1.), [1., 2.), dan [2., +inf).

{
  "boundaries": [0.0, 1.0, 2.0],
  "default_value": -1
}

num_buckets

Menggunakan hasil transformasi fitur langsung sebagai ID bucket. Metode ini cocok untuk nilai fitur yang dapat dikonversi ke bilangan bulat.

  • Rentang hasil: [0,num_buckets)

  • Jika nilai fitur berada di luar rentang yang dikonfigurasi, nilai tersebut diberi default_bucketize_value.

{
  "num_buckets": 128000,
  "default_bucketize_value": 127999
}

Operator fitur bawaan

Metode konfigurasi bervariasi antar operator fitur. Semua operator fitur yang dapat menjadi node daun dalam DAG mendukung pengelompokan fitur.

Untuk informasi lebih lanjut, lihat Built-in feature operators.

Type

Description

id_feature

categorical feature

raw_feature

numerical feature

expr_feature

expression feature

combo_feature

combination feature

combine_feature

combination feature (aggregated to a single value)

lookup_feature

dictionary lookup feature

match_feature

primary-secondary key dictionary lookup feature

overlap_feature

overlap feature

sequence_feature

sequence feature

text_normalizer

text normalization

tokenize_feature

text tokenization feature

bm25_feature

BM25 text relevance feature

kv_dot_product

KV vector dot product

str_replace_feature

String replacement

regex_replace_feature

Regular expression replacement

slice_feature

Array slicing

Kombinasi operator

Dengan mengonfigurasi DAG, Anda dapat menggabungkan berbagai operator bawaan untuk melakukan transformasi fitur yang kuat.

Contoh 1: Rata-ratakan 4 elemen pertama dari sequence

{
  "features": [
    {
      "feature_name": "top_n_prices",
      "feature_type": "sequence_raw_feature",
      "expression": "user:clk_prices",
      "separator": ",",
      "sequence_length": 4,
      "stub_type": true
    },
    {
      "feature_name": "top_n_avg_price",
      "feature_type": "expr_feature",
      "expression":"reduce_mean(top_n_prices)",
      "default_value": "-1",
      "variables":["feature:top_n_prices"]
    }
  ]
}

Contoh 2: Rata-ratakan elemen sequence dengan kondisi

{
  "features": [
    {
      "feature_name": "valid_list",
      "feature_type": "expr_feature",
      "expression":"clk_times < 10",
      "variables":["user:clk_times"],
      "value_dimension": 5
    },
    {
      "feature_name": "top_n_prices",
      "feature_type": "bool_mask_feature",
      "expression": ["user:clk_prices", "feature:valid_list"],
      "value_type": "float",
      "separator": ","
    },
    {
      "feature_name": "top_n_avg_price",
      "feature_type": "expr_feature",
      "expression":"reduce_mean(top_n_prices)",
      "default_value": "-1",
      "variables":["feature:top_n_prices"]
    }
  ]
}

Catatan: Pada contoh sebelumnya, clk_prices dan clk_times adalah dua sequence paralel.

Operator fitur kustom

Operator fitur kustom dapat dimuat dan dieksekusi secara dinamis oleh framework sebagai plugin.

Untuk informasi lebih lanjut, lihat Custom feature operators.

Optimasi performa

Performa modul FG sangat bergantung pada konfigurasinya. Prinsip umumnya adalah meminimalkan transformasi data (fitur) yang tidak perlu.

Jika Anda dapat memproses dan mentransformasi data pada tahap offline atau near-line, jangan melakukannya pada tahap FG (layanan skoring online).

Ikuti panduan berikut untuk performa yang lebih baik:

  • Untuk data input terstruktur, utamakan penggunaan tipe kompleks dari tabel MaxCompute (misalnya, Map dan Array) daripada tipe STRING untuk mengurangi overhead parsing string.

    • Pada layanan skoring online (seperti EasyRec Processor atau TorchEasyRec Processor), gunakan FeatureStore dan FeatureDB sebagai penyimpanan online untuk mengaktifkan dukungan terhadap tipe kompleks.

    • Untuk lookup_feature, sangat disarankan menggunakan tipe Map untuk bidang map.

    • Untuk sequence_feature, overlap_feature, dan bm25_feature, sangat disarankan menggunakan input bertipe Array.

    • Hindari penggunaan match_feature karena tidak mendukung tipe kompleks. Gunakan lookup_feature sebagai gantinya dengan menggabungkan pkey dan skey.

  • Hindari overhead konversi tipe data.

    • value_type dari raw_feature sebaiknya tidak diatur ke tipe selain float tanpa alasan khusus.

    • Untuk lookup_feature, pastikan tipe kunci dari input Map<Key, Value> sesuai dengan tipe bidang kueri.

    • Jika Anda mengonfigurasi pengelompokan fitur bertipe num_buckets, value_type harus diatur ke int64.

    • Jika tipe optimal untuk kolom data berbeda-beda di berbagai skenario, pertimbangkan untuk menambahkan salinan kolom dengan tipe berbeda.

      • Misalnya, sebuah bidang harus bertipe BIGINT saat digunakan sebagai bidang lookup untuk lookup_feature, tetapi bertipe STRING saat digunakan sebagai bagian dari combo_feature.

      • Dalam kasus ini, tambahkan salinan kolom untuk setiap tipe yang diperlukan: satu BIGINT dan satu STRING. Berikut adalah contoh kode SQL:

        • SELECT int_data, int_data as str_data FROM ....

  • Gunakan kembali logika dan komputasi bersama sedapat mungkin dengan memanfaatkan dependensi fitur (mode DAG).

Konfigurasi global

Parameter

Type

Default

Description

USE_CITY_HASH_TO_BUCKETIZE

string

'false'

Menentukan apakah akan menggunakan CityHash sebagai fungsi hash untuk pengelompokan fitur.

USE_MULTIPLICATIVE_HASH

string

'false'

Menentukan apakah akan menggunakan penghashan multiplikatif alih-alih operasi modulo untuk penghashan fitur. Opsi ini direkomendasikan.

DISABLE_FG_PRECISION

string

'true'

Atur ke 'false' untuk membatasi fitur floating-point hingga enam tempat desimal. Default-nya adalah 'true', yang menonaktifkan batasan ini.

DISABLE_STRING_TRIM

string

'false'

Menentukan apakah akan menonaktifkan pemangkasan spasi awal dan akhir setelah memisahkan fitur string multi-nilai.

MONITOR_CUSTOM_OP_EVERY_N_SECONDS

string

'0'

Menentukan interval dalam detik untuk memantau performa operator kustom dan mencetak data performa. Nilai '0' menonaktifkan pemantauan.

Catatan: Konfigurasi di atas harus konsisten di semua lingkungan eksekusi, termasuk offline dan online, serta untuk pelatihan dan inferensi. Jika tidak, ketidakkonsistenan dapat terjadi antara skoring online dan offline.

Laju tabrakan hash

Berikut menunjukkan hasil pengujian pada dataset dengan 26 fitur dengan kardinalitas berbeda, di mana hash_bucket_size untuk setiap fitur diatur ke 10 × kardinalitasnya:

Hash type

Total feature cardinality

Total bins

Hash collision rate

std::hash

882.774.549

840.065.238

4,8381%

cityhash

882.774.549

840.072.446

4,8373%

std+cityhash

882.774.549

840.075.948

4,8369%

cityhash+multiplicative

882.774.549

840.072.195

4,8373%

std+multiplicative

882.774.549

840.077.306

4,8367%

Secara ringkas, kami merekomendasikan penggunaan std::hash + MultiplicativeHash sebagai pendekatan gabungan untuk mengoptimalkan performa model. std::hash diaktifkan secara default. MultiplicativeHash dinonaktifkan secara default demi kompatibilitas mundur, dan Anda harus mengaktifkannya secara manual mengikuti instruksi di bawah.

Selain itu, CityHash adalah metode yang secara teoretis menawarkan keseragaman lebih baik, tetapi tidak menunjukkan keunggulan signifikan pada dataset ini. Anda dapat mengujinya lebih lanjut pada dataset Anda sendiri.

Konfigurasi layanan skoring online

Konfigurasikan pengaturan ini dengan menggunakan variabel lingkungan sisi server. Secara khusus, Anda dapat mengaturnya dalam konfigurasi layanan EasyRec Processor atau TorchEasyRec Processor.

{
  "processor_envs": [
    {
      "name": "USE_MULTIPLICATIVE_HASH",
      "value": "true"
    }
  ]
}

Konfigurasi job offline

Untuk menjalankan task offline untuk FG di lingkungan MaxCompute, lihat Use FG in offline tasks.

Khususnya, rujuk kode berikut:

from pyfg105 import run_on_odps

fg_task = run_on_odps.FgTask(...)
fg_task.add_fg_setting('USE_CITY_HASH_TO_BUCKETIZE', 'false')
fg_task.add_fg_setting('USE_MULTIPLICATIVE_HASH', 'true')
fg_task.run(o)

Konfigurasi API pyfg

Saat menggunakan pyfg API, misalnya untuk melakukan feature generation selama pelatihan, Anda dapat mengonfigurasinya dengan metode berikut.

import pyfg
pyfg.set_env('USE_MULTIPLICATIVE_HASH', 'true')
pyfg.set_env('USE_CITY_HASH_TO_BUCKETIZE', 'false')