Umum
Apakah EvalSavedModel masih diperlukan?
Sebelumnya TFMA mengharuskan semua metrik disimpan dalam grafik tensorflow menggunakan EvalSavedModel
khusus. Sekarang, metrik dapat dihitung di luar grafik TF menggunakan implementasi beam.CombineFn
.
Beberapa perbedaan utama adalah:
-
EvalSavedModel
memerlukan ekspor khusus dari pelatih sedangkan model penyajian dapat digunakan tanpa perubahan apa pun yang diperlukan pada kode pelatihan. - Saat
EvalSavedModel
digunakan, metrik apa pun yang ditambahkan pada waktu pelatihan tersedia secara otomatis pada waktu evaluasi. TanpaEvalSavedModel
, metrik ini harus ditambahkan kembali.- Pengecualian untuk aturan ini adalah jika model keras digunakan, metrik juga dapat ditambahkan secara otomatis karena keras menyimpan informasi metrik di samping model yang disimpan.
Bisakah TFMA bekerja dengan metrik dalam grafik dan metrik eksternal?
TFMA memungkinkan pendekatan hibrida untuk digunakan di mana beberapa metrik dapat dihitung dalam grafik sedangkan yang lain dapat dihitung di luar. Jika saat ini Anda memiliki EvalSavedModel
maka Anda dapat terus menggunakannya.
Ada dua kasus:
- Gunakan TFMA
EvalSavedModel
untuk ekstraksi fitur dan perhitungan metrik tetapi juga menambahkan metrik berbasis penggabung tambahan. Dalam hal ini, Anda akan mendapatkan semua metrik dalam grafik dariEvalSavedModel
bersama dengan metrik tambahan apa pun dari berbasis penggabung yang mungkin sebelumnya tidak didukung. - Gunakan TFMA
EvalSavedModel
untuk ekstraksi fitur/prediksi tetapi gunakan metrik berbasis penggabung untuk semua perhitungan metrik. Mode ini berguna jika ada transformasi fitur yang ada diEvalSavedModel
yang ingin Anda gunakan untuk mengiris, tetapi lebih suka melakukan semua perhitungan metrik di luar grafik.
Mempersiapkan
Jenis model apa yang didukung?
TFMA mendukung model keras, model berdasarkan API tanda tangan TF2 generik, serta model berbasis TF estimator (walaupun tergantung pada kasus penggunaan, model berbasis estimator mungkin memerlukan EvalSavedModel
untuk digunakan).
Lihat panduan get_started untuk daftar lengkap jenis model yang didukung dan batasan apa pun.
Bagaimana cara saya mengatur TFMA untuk bekerja dengan model berbasis keras asli?
Berikut ini adalah contoh konfigurasi untuk model keras berdasarkan asumsi berikut:
- Model yang disimpan adalah untuk penyajian dan menggunakan nama signature
serving_default
(ini dapat diubah menggunakanmodel_specs[0].signature_name
). - Metrik bawaan dari
model.compile(...)
harus dievaluasi (ini dapat dinonaktifkan melaluioptions.include_default_metric
dalam tfma.EvalConfig ).
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
label_key: "<label-key>"
example_weight_key: "<example-weight-key>"
}
metrics_specs {
# Add metrics here. For example:
# metrics { class_name: "ConfusionMatrixPlot" }
# metrics { class_name: "CalibrationPlot" }
}
slicing_specs {}
""", tfma.EvalConfig())
Lihat metrik untuk informasi selengkapnya tentang jenis metrik lain yang dapat dikonfigurasi.
Bagaimana cara mengatur TFMA agar berfungsi dengan model berbasis tanda tangan TF2 generik?
Berikut ini adalah contoh konfigurasi untuk model TF2 generik. Di bawah, signature_name
adalah nama dari signature tertentu yang harus digunakan untuk evaluasi.
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
signature_name: "<signature-name>"
label_key: "<label-key>"
example_weight_key: "<example-weight-key>"
}
metrics_specs {
# Add metrics here. For example:
# metrics { class_name: "BinaryCrossentropy" }
# metrics { class_name: "ConfusionMatrixPlot" }
# metrics { class_name: "CalibrationPlot" }
}
slicing_specs {}
""", tfma.EvalConfig())
Lihat metrik untuk informasi selengkapnya tentang jenis metrik lain yang dapat dikonfigurasi.
Bagaimana cara mengatur TFMA agar berfungsi dengan model berbasis estimator?
Dalam hal ini ada tiga pilihan.
Opsi1: Gunakan Model Penyajian
Jika opsi ini digunakan, maka metrik apa pun yang ditambahkan selama pelatihan TIDAK akan disertakan dalam evaluasi.
Berikut ini adalah contoh konfigurasi dengan asumsi serving_default
adalah nama tanda tangan yang digunakan:
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
label_key: "<label-key>"
example_weight_key: "<example-weight-key>"
}
metrics_specs {
# Add metrics here.
}
slicing_specs {}
""", tfma.EvalConfig())
Lihat metrik untuk informasi selengkapnya tentang jenis metrik lain yang dapat dikonfigurasi.
Opsi2: Gunakan EvalSavedModel bersama dengan metrik berbasis penggabung tambahan
Dalam hal ini, gunakan EvalSavedModel
untuk ekstraksi dan evaluasi fitur / prediksi dan juga menambahkan metrik berbasis penggabung tambahan.
Berikut ini adalah contoh konfigurasi:
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
signature_name: "eval"
}
metrics_specs {
# Add metrics here.
}
slicing_specs {}
""", tfma.EvalConfig())
Lihat metrik untuk informasi selengkapnya tentang jenis metrik lain yang dapat dikonfigurasi dan EvalSavedModel untuk informasi selengkapnya tentang menyiapkan EvalSavedModel.
Opsi3: Gunakan Model EvalSavedModel hanya untuk Ekstraksi Fitur / Prediksi
Mirip dengan opsi (2), tetapi hanya gunakan EvalSavedModel
untuk ekstraksi fitur / prediksi. Opsi ini berguna jika hanya metrik eksternal yang diinginkan, tetapi ada transformasi fitur yang ingin Anda potong. Mirip dengan opsi (1) metrik apa pun yang ditambahkan selama pelatihan TIDAK akan disertakan dalam evaluasi.
Dalam hal ini konfigurasinya sama seperti di atas hanya include_default_metrics
yang dinonaktifkan.
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
signature_name: "eval"
}
metrics_specs {
# Add metrics here.
}
slicing_specs {}
options {
include_default_metrics { value: false }
}
""", tfma.EvalConfig())
Lihat metrik untuk informasi selengkapnya tentang jenis metrik lain yang dapat dikonfigurasi dan EvalSavedModel untuk informasi selengkapnya tentang menyiapkan EvalSavedModel.
Bagaimana cara saya mengatur TFMA untuk bekerja dengan model berbasis model-ke-estimator yang keras?
Pengaturan keras model_to_estimator
mirip dengan konfigurasi estimator. Namun ada beberapa perbedaan khusus untuk cara kerja model ke estimator. Secara khusus, model-to-esimtator mengembalikan outputnya dalam bentuk dict di mana kunci dict adalah nama layer output terakhir dalam model keras terkait (jika tidak ada nama yang diberikan, keras akan memilih nama default untuk Anda seperti dense_1
atau output_1
). Dari perspektif TFMA, perilaku ini mirip dengan apa yang akan menjadi output untuk model multi-output meskipun model ke estimator mungkin hanya untuk satu model. Untuk memperhitungkan perbedaan ini, langkah tambahan diperlukan untuk mengatur nama keluaran. Namun, tiga opsi yang sama berlaku sebagai penaksir.
Berikut ini adalah contoh perubahan yang diperlukan untuk konfigurasi berbasis estimator:
from google.protobuf import text_format
config = text_format.Parse("""
... as for estimator ...
metrics_specs {
output_names: ["<keras-output-layer>"]
# Add metrics here.
}
... as for estimator ...
""", tfma.EvalConfig())
Bagaimana cara mengatur TFMA agar berfungsi dengan prediksi yang telah dihitung sebelumnya (yaitu model-agnostik)? ( TFRecord
dan tf.Example
)
Untuk mengonfigurasi TFMA agar berfungsi dengan prediksi yang telah dihitung sebelumnya, tfma.PredictExtractor
default harus dinonaktifkan dan tfma.InputExtractor
harus dikonfigurasi untuk mengurai prediksi bersama dengan fitur input lainnya. Ini dilakukan dengan mengonfigurasi tfma.ModelSpec
dengan nama kunci fitur yang digunakan untuk prediksi di samping label dan bobot.
Berikut ini adalah contoh pengaturan:
from google.protobuf import text_format
config = text_format.Parse("""
model_specs {
prediction_key: "<prediction-key>"
label_key: "<label-key>"
example_weight_key: "<example-weight-key>"
}
metrics_specs {
# Add metrics here.
}
slicing_specs {}
""", tfma.EvalConfig())
Lihat metrik untuk informasi selengkapnya tentang metrik yang dapat dikonfigurasi.
Perhatikan bahwa meskipun tfma.ModelSpec
sedang dikonfigurasi, model sebenarnya tidak digunakan (yaitu tidak ada tfma.EvalSharedModel
). Panggilan untuk menjalankan analisis model mungkin terlihat sebagai berikut:
eval_result = tfma.run_model_analysis(
eval_config=eval_config,
# This assumes your data is a TFRecords file containing records in the
# tf.train.Example format.
data_location="/path/to/file/containing/tfrecords",
output_path="/path/for/metrics_for_slice_proto")
Bagaimana cara mengatur TFMA agar berfungsi dengan prediksi yang telah dihitung sebelumnya (yaitu model-agnostik)? ( pd.DataFrame
)
Untuk kumpulan data kecil yang dapat masuk ke dalam memori, alternatif untuk TFRecord
adalah pandas.DataFrame
s. TFMA dapat beroperasi pada pandas.DataFrame
s menggunakan tfma.analyze_raw_data
API. Untuk penjelasan tentang tfma.MetricsSpec
dan tfma.SlicingSpec
, lihat panduan penyiapan . Lihat metrik untuk informasi selengkapnya tentang metrik yang dapat dikonfigurasi.
Berikut ini adalah contoh pengaturan:
# Run in a Jupyter Notebook.
df_data = ... # your pd.DataFrame
eval_config = text_format.Parse("""
model_specs {
label_key: 'label'
prediction_key: 'prediction'
}
metrics_specs {
metrics { class_name: "AUC" }
metrics { class_name: "ConfusionMatrixPlot" }
}
slicing_specs {}
slicing_specs {
feature_keys: 'language'
}
""", config.EvalConfig())
eval_result = tfma.analyze_raw_data(df_data, eval_config)
tfma.view.render_slicing_metrics(eval_result)
Metrik
Jenis metrik apa yang didukung?
TFMA mendukung berbagai metrik termasuk:
- metrik regresi
- metrik klasifikasi biner
- metrik klasifikasi multi-kelas/multi-label
- metrik rata-rata mikro / rata-rata makro
- metrik berbasis kueri / peringkat
Apakah metrik dari model multi-output didukung?
Ya. Lihat panduan metrik untuk detail selengkapnya.
Apakah metrik dari beberapa model didukung?
Ya. Lihat panduan metrik untuk detail selengkapnya.
Dapatkah pengaturan metrik (nama, dll) disesuaikan?
Ya. Pengaturan metrik dapat disesuaikan (misalnya menetapkan ambang batas tertentu, dll) dengan menambahkan pengaturan config
ke konfigurasi metrik. Lihat panduan metrik memiliki detail lebih lanjut.
Apakah metrik khusus didukung?
Ya. Baik dengan menulis implementasi tf.keras.metrics.Metric
kustom atau dengan menulis implementasi beam.CombineFn
kustom. Panduan metrik memiliki detail lebih lanjut.
Jenis metrik apa yang tidak didukung?
Selama metrik Anda dapat dihitung menggunakan beam.CombineFn
, tidak ada batasan pada jenis metrik yang dapat dihitung berdasarkan tfma.metrics.Metric
. Jika bekerja dengan metrik yang berasal dari tf.keras.metrics.Metric
maka kriteria berikut harus dipenuhi:
- Seharusnya dimungkinkan untuk menghitung statistik yang memadai untuk metrik pada setiap contoh secara independen, kemudian menggabungkan statistik yang cukup ini dengan menambahkannya di semua contoh, dan menentukan nilai metrik hanya dari statistik yang cukup ini.
- Misalnya, untuk akurasi statistik yang cukup adalah "total benar" dan "total contoh". Dimungkinkan untuk menghitung dua angka ini untuk contoh individu, dan menambahkannya untuk sekelompok contoh untuk mendapatkan nilai yang tepat untuk contoh tersebut. Akurasi akhir dapat dihitung menggunakan "total benar / contoh total".
Add-on
Dapatkah saya menggunakan TFMA untuk mengevaluasi keadilan atau bias dalam model saya?
TFMA menyertakan add-on FairnessIndicators yang menyediakan metrik pasca-ekspor untuk mengevaluasi efek bias yang tidak diinginkan dalam model klasifikasi.
Kustomisasi
Bagaimana jika saya membutuhkan lebih banyak penyesuaian?
TFMA sangat fleksibel dan memungkinkan Anda untuk menyesuaikan hampir semua bagian dari pipeline menggunakan Extractors
, Evaluators
, dan/atau Writers
kustom. Abstraksi ini dibahas secara lebih rinci dalam dokumen arsitektur .
Pemecahan masalah, debugging, dan mendapatkan bantuan
Mengapa metrik MultiClassConfusionMatrix tidak cocok dengan metrik ConfusionMatrix biner
Ini sebenarnya perhitungan yang berbeda. Binarisasi melakukan perbandingan untuk setiap ID kelas secara independen (yaitu prediksi untuk setiap kelas dibandingkan secara terpisah terhadap ambang batas yang disediakan). Dalam hal ini ada kemungkinan dua kelas atau lebih untuk semuanya menunjukkan bahwa mereka cocok dengan prediksi karena nilai prediksi mereka lebih besar dari ambang batas (ini akan lebih terlihat di ambang batas yang lebih rendah). Dalam kasus matriks konfusi multikelas, masih ada hanya satu nilai prediksi yang benar dan itu cocok dengan nilai sebenarnya atau tidak. Ambang hanya digunakan untuk memaksa prediksi agar tidak cocok dengan tidak ada kelas jika kurang dari ambang batas. Semakin tinggi ambang batas, semakin sulit untuk mencocokkan prediksi kelas biner. Demikian juga, semakin rendah ambang batas, semakin mudah untuk mencocokkan prediksi kelas biner. Artinya pada threshold > 0.5 nilai binerisasi dan nilai matriks multiclass akan lebih rapat dan pada threshold < 0.5 akan semakin berjauhan.
Sebagai contoh, katakanlah kita memiliki 10 kelas di mana kelas 2 diprediksi dengan probabilitas 0,8, tetapi kelas sebenarnya adalah kelas 1 yang memiliki probabilitas 0,15. Jika Anda melakukan binerisasi pada kelas 1 dan menggunakan ambang batas 0,1, maka kelas 1 akan dianggap benar (0,15 > 0,1) sehingga akan dihitung sebagai TP, Namun untuk kasus multikelas, kelas 2 akan dianggap benar (0,8 > 0.1) dan karena kelas 1 adalah yang sebenarnya, ini akan dihitung sebagai FN. Karena pada ambang batas yang lebih rendah, lebih banyak nilai akan dianggap positif, secara umum akan ada jumlah TP dan FP yang lebih tinggi untuk matriks kebingungan biner daripada matriks kebingungan multikelas, dan juga TN dan FN yang lebih rendah.
Berikut ini adalah contoh perbedaan yang diamati antara MultiClassConfusionMatrixAtThresholds dan jumlah yang sesuai dari binarisasi salah satu kelas.
Mengapa metrik precision@1 dan recall@1 saya memiliki nilai yang sama?
Pada nilai k teratas dari 1 presisi dan daya ingat adalah hal yang sama. Presisi sama dengan TP / (TP + FP)
dan recall sama dengan TP / (TP + FN)
. Prediksi teratas selalu positif dan akan cocok atau tidak cocok dengan label. Dengan kata lain, dengan N
contoh, TP + FP = N
. Namun, jika label tidak cocok dengan prediksi teratas, maka ini juga menyiratkan prediksi k non-atas cocok dan dengan k teratas disetel ke 1, semua prediksi non-top 1 akan menjadi 0. Ini menyiratkan FN harus (N - TP)
atau N = TP + FN
. Hasil akhirnya adalah precision@1 = TP / N = recall@1
. Perhatikan bahwa ini hanya berlaku bila ada satu label per contoh, bukan untuk multi-label.
Mengapa metrik mean_label dan mean_prediction saya selalu 0,5?
Ini kemungkinan besar disebabkan karena metrik dikonfigurasi untuk masalah klasifikasi biner, tetapi model mengeluarkan probabilitas untuk kedua kelas, bukan hanya satu. Ini umum terjadi saat API klasifikasi tensorflow digunakan. Solusinya adalah memilih kelas yang Anda inginkan untuk dijadikan dasar prediksi dan kemudian melakukan binerisasi pada kelas tersebut. Sebagai contoh:
eval_config = text_format.Parse("""
...
metrics_specs {
binarize { class_ids: { values: [0] } }
metrics { class_name: "MeanLabel" }
metrics { class_name: "MeanPrediction" }
...
}
...
""", config.EvalConfig())
Bagaimana cara menginterpretasikan MultiLabelConfusionMatrixPlot?
Diberi label tertentu, MultiLabelConfusionMatrixPlot
(dan MultiLabelConfusionMatrix
terkait) dapat digunakan untuk membandingkan hasil label lain dan prediksi mereka ketika label yang dipilih benar-benar benar. Sebagai contoh, katakanlah kita memiliki tiga kelas bird
, plane
, dan superman
dan kita mengklasifikasikan gambar untuk menunjukkan apakah mereka mengandung satu atau lebih dari salah satu kelas ini. MultiLabelConfusionMatrix
akan menghitung produk kartesius dari setiap kelas aktual terhadap satu sama lain kelas (disebut kelas yang diprediksi). Perhatikan bahwa sementara pasangan adalah (actual, predicted)
, kelas predicted
tidak selalu menyiratkan prediksi positif, itu hanya mewakili kolom diprediksi dalam matriks aktual vs diprediksi. Sebagai contoh, katakanlah kita telah menghitung matriks berikut:
(bird, bird) -> { tp: 6, fp: 0, fn: 2, tn: 0}
(bird, plane) -> { tp: 2, fp: 2, fn: 2, tn: 2}
(bird, superman) -> { tp: 1, fp: 1, fn: 4, tn: 2}
(plane, bird) -> { tp: 3, fp: 1, fn: 1, tn: 3}
(plane, plane) -> { tp: 4, fp: 0, fn: 4, tn: 0}
(plane, superman) -> { tp: 1, fp: 3, fn: 3, tn: 1}
(superman, bird) -> { tp: 3, fp: 2, fn: 2, tn: 2}
(superman, plane) -> { tp: 2, fp: 3, fn: 2, tn: 2}
(superman, superman) -> { tp: 4, fp: 0, fn: 5, tn: 0}
num_examples: 20
MultiLabelConfusionMatrixPlot
memiliki tiga cara untuk menampilkan data ini. Dalam semua kasus, cara membaca tabel adalah baris demi baris dari perspektif kelas yang sebenarnya.
1) Jumlah Prediksi Total
Dalam hal ini, untuk baris tertentu (yaitu kelas sebenarnya) berapa jumlah TP + FP
untuk kelas lainnya. Untuk hitungan di atas, tampilan kita akan menjadi sebagai berikut:
Burung yang diprediksi | Pesawat yang diprediksi | Superman yang diprediksi | |
---|---|---|---|
Burung sebenarnya | 6 | 4 | 2 |
Pesawat sebenarnya | 4 | 4 | 4 |
Superman sebenarnya | 5 | 5 | 4 |
Ketika gambar-gambar itu benar-benar berisi seekor bird
, kami memprediksi dengan benar 6 di antaranya. Pada saat yang sama kami juga memprediksi plane
(baik benar atau salah) 4 kali dan superman
(benar atau salah) 2 kali.
2) Hitungan Prediksi Salah
Dalam hal ini, untuk baris tertentu (yaitu kelas sebenarnya) berapa jumlah FP
untuk kelas lainnya. Untuk hitungan di atas, tampilan kita akan menjadi sebagai berikut:
Burung yang diprediksi | Pesawat yang diprediksi | Superman yang diprediksi | |
---|---|---|---|
Burung sebenarnya | 0 | 2 | 1 |
Pesawat sebenarnya | 1 | 0 | 3 |
Superman sebenarnya | 2 | 3 | 0 |
Ketika gambar-gambar itu benar-benar berisi seekor bird
, kami salah memprediksi plane
2 kali dan superman
1 kali.
3) Hitungan Negatif Palsu
Dalam hal ini, untuk baris tertentu (yaitu kelas aktual) berapa jumlah FN
untuk kelas lainnya. Untuk hitungan di atas, tampilan kita akan menjadi sebagai berikut:
Burung yang diprediksi | Pesawat yang diprediksi | Superman yang diprediksi | |
---|---|---|---|
Burung sebenarnya | 2 | 2 | 4 |
Pesawat sebenarnya | 1 | 4 | 3 |
Superman sebenarnya | 2 | 2 | 5 |
Ketika gambar-gambar itu benar-benar berisi seekor bird
, kami gagal memprediksinya 2 kali. Pada saat yang sama, kami gagal memprediksi plane
2 kali dan superman
4 kali.
Mengapa saya mendapatkan kesalahan tentang kunci prediksi tidak ditemukan?
Beberapa model mengeluarkan prediksinya dalam bentuk kamus. Misalnya, penaksir TF untuk masalah klasifikasi biner mengeluarkan kamus yang berisi probabilities
, class_ids
, dll. Dalam kebanyakan kasus TFMA memiliki default untuk menemukan nama kunci yang umum digunakan seperti predictions
, probabilities
, dll. Namun, jika model Anda sangat disesuaikan, mungkin kunci keluaran dengan nama yang tidak diketahui oleh TFMA. Dalam kasus ini, pengaturan prediciton_key
harus ditambahkan ke tfma.ModelSpec
untuk mengidentifikasi nama kunci tempat output disimpan.