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,AdanB, sertainput_aliasuntuk 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_listatauvocab_dictdari 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_listharus sama dengan konfigurasivalue_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_bucketsbernilai 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_dictharus sama dengan konfigurasivalue_type.Nilai
vocab_dictharus dapat dikonversi ke tipeint64.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_bucketspositif.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_bucketdandefault_bucketize_valuememiliki makna yang sama seperti yang dijelaskan di atas.
boundaries
Mengelompokkan fitur numerik berdasarkan batas bin yang ditentukan.
Tipe elemen array
boundariesharus sama dengan konfigurasivalue_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 bidangmap.Untuk
sequence_feature,overlap_feature, danbm25_feature, sangat disarankan menggunakan input bertipe Array.Hindari penggunaan
match_featurekarena tidak mendukung tipe kompleks. Gunakanlookup_featuresebagai gantinya dengan menggabungkanpkeydanskey.
Hindari overhead konversi tipe data.
value_typedariraw_featuresebaiknya tidak diatur ke tipe selain float tanpa alasan khusus.Untuk
lookup_feature, pastikan tipe kunci dari inputMap<Key, Value>sesuai dengan tipe bidang kueri.Jika Anda mengonfigurasi pengelompokan fitur bertipe
num_buckets,value_typeharus diatur keint64.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 daricombo_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')