Cari insiden dan klaim serupa. Metrik dan Optimasi

Dalam artikel sebelumnya, saya berbicara tentang mesin pencari kami untuk aplikasi serupa . Setelah diluncurkan, kami mulai menerima ulasan pertama. Analis menyukai dan merekomendasikan beberapa rekomendasi, beberapa tidak.


Untuk melanjutkan dan menemukan model yang lebih baik, pertama-tama perlu untuk mengevaluasi kinerja model saat ini. Itu juga perlu untuk memilih kriteria dimana dua model dapat dibandingkan satu sama lain.


Di bawah potongan, saya akan berbicara tentang:


  • mengumpulkan umpan balik tentang rekomendasi
  • pengembangan metrik untuk menilai kualitas rekomendasi
  • membangun siklus optimisasi model
  • menerima wawasan dan model baru

Koleksi umpan balik


Akan ideal untuk mengumpulkan umpan balik eksplisit dari analis: seberapa relevan rekomendasi dari masing-masing insiden yang diusulkan. Ini akan memungkinkan kita untuk memahami situasi saat ini dan terus meningkatkan sistem berdasarkan indikator kuantitatif.


Diputuskan untuk mengumpulkan ulasan dalam format yang sangat sederhana:


  • jumlah insiden yang kami analisis
  • nomor insiden yang direkomendasikan
  • review rekomendasi: baik / buruk

"Suara" (proyek kecil yang menerima permintaan GET dengan parameter, dan memasukkan informasi ke dalam file) ditempatkan langsung di blok rekomendasi sehingga analis dapat segera meninggalkan umpan balik mereka dengan hanya mengklik salah satu tautan: "baik" atau "buruk".


Selain itu, untuk tinjauan retrospektif rekomendasi, solusi yang sangat sederhana dibuat:


  • untuk sejumlah besar data historis, sebuah model diluncurkan;
  • Rekomendasi yang terkumpul disajikan dalam bentuk beberapa file HTML mandiri, di mana "voting" yang sama digunakan;
  • file yang disiapkan diserahkan kepada analis untuk melihat hasilnya selama 50-100 insiden.

Jadi dimungkinkan untuk mengumpulkan data sekitar 4000+ pasang insiden-rekomendasi.


Analisis tinjauan awal


Metrik awal adalah "biasa saja" - bagian dari rekomendasi "baik", menurut rekan, hanya sekitar 25%.


Masalah utama dari model pertama:


  1. insiden pada masalah "baru" menerima rekomendasi yang tidak relevan dari sistem; Ternyata dengan tidak adanya kebetulan dalam isi banding, sistem memilih insiden yang dekat dengan departemen karyawan yang menghubungi.
  2. rekomendasi untuk insiden pada satu sistem mengenai insiden dari sistem lain. Kata-kata yang digunakan dalam permohonan serupa, tetapi menggambarkan masalah sistem lain dan berbeda.

Cara-cara yang mungkin untuk meningkatkan kualitas rekomendasi dipilih:


  • penyesuaian komposisi dan bobot atribut perawatan yang termasuk dalam vektor akhir
  • pemilihan pengaturan vektorisasi TfidfVectorizer
  • pemilihan jarak "cutoff" dari rekomendasi

Pengembangan kriteria kualitas dan metode penilaian


Untuk mencari versi model yang lebih baik, perlu untuk menentukan prinsip menilai kualitas hasil model. Ini akan memungkinkan Anda untuk membandingkan kedua model secara kuantitatif dan memilih yang terbaik.


Apa yang bisa diperoleh dari ulasan yang dikumpulkan


Kami memiliki banyak bentuk: "Insiden", "Insiden yang Direkomendasikan", "Penilaian Rekomendasi".


  • "Rating rekomendasi" ( v ) - disetel biner: "Bagus" | Buruk (1 / -1);
  • "Insiden" dan "Insiden yang Direkomendasikan" hanyalah angka insiden. Pada mereka, Anda dapat menemukan insiden di database.

Memiliki data seperti itu, Anda dapat menghitung:


  • n_inc_total - Jumlah total insiden yang ada rekomendasi
  • n_inc_good - Jumlah insiden yang ada rekomendasi "baik"
  • avg_inc_good - Jumlah rata-rata rekomendasi "baik" untuk insiden
  • n_rec_total - Jumlah total rekomendasi
  • n_rec_good - Jumlah total rekomendasi "baik"
  • pct_inc_good - bagian insiden yang ada rekomendasi "baik"
    pct_inc_good = n_inc_good / n_inc_total
  • pct_rec_good - total bagian dari rekomendasi "baik"
    pct_rec_good = n_rec_good / n_rec_total

Indikator-indikator ini, dihitung berdasarkan estimasi dari pengguna, dapat dianggap sebagai "indikator dasar" dari model asli. Dengan itu kita akan membandingkan indikator serupa dari versi model yang baru.


Ambil semua "insiden" unik dari m , dan arahkan melalui model baru.


Akibatnya, kami mendapatkan banyak m * tupel: "Insiden", "Insiden yang Direkomendasikan", "Jarak".
Di sini, "jarak" adalah metrik yang didefinisikan di NearestNeighbor. Dalam model kami, ini adalah jarak cosinus. Nilai "0" sesuai dengan kebetulan vektor yang lengkap.


Pemilihan "jarak cutoff"


Melengkapi serangkaian rekomendasi m * dengan informasi tentang estimasi sebenarnya dari v dari set awal estimasi m , kami memperoleh korespondensi antara jarak d dan estimasi sebenarnya dari v untuk model ini.


Memiliki set ( d , v ), dimungkinkan untuk memilih level cutoff optimal t , yang untuk d <= t rekomendasi akan menjadi "baik", dan untuk d> t - "buruk". Pemilihan t dapat dilakukan dengan mengoptimalkan penggolong biner paling sederhana v = -1 if d>t else 1 selain v = -1 if d>t else 1 berkenaan dengan t hiperparameter, dan menggunakan, misalnya, AUC ROC sebagai metrik.


 #     class BinarizerClassifier(Binarizer): def transform(self, x): return np.array([-1 if _x > self.threshold else 1 for _x in np.array(x, dtype=float)]).reshape(-1, 1) def predict_proba(self, x): z = self.transform(x) return np.array([[0 if _x > 0 else 1, 1 if _x > 0 else 0] for _x in z.ravel()]) def predict(self, x): return self.transform(x) # #   : # -  , # -    m* # -   (d,v)  z_data_for_t # #   t b = BinarizerClassifier() z_x = z_data_for_t[['distance']] z_y = z_data_for_t['TYPE'] cv = GridSearchCV(b, param_grid={'threshold': np.arange(0.1, 0.7, 0.01)}, scoring='roc_auc', cv=5, iid=False, n_jobs=-1) cv.fit(z_x, z_y) score = cv.best_score_ t = cv.best_params_['threshold'] best_b = cv.best_estimator_ 

Nilai t yang diperoleh dapat digunakan untuk memfilter rekomendasi.


Tentu saja, pendekatan ini masih bisa mengabaikan rekomendasi "buruk" dan memotong yang "baik". Oleh karena itu, pada tahap ini kami selalu menunjukkan rekomendasi "Top 5", tetapi kami secara khusus menandai rekomendasi yang dianggap "baik", dengan mempertimbangkan t yang ditemukan.
Alternatif: jika setidaknya satu rekomendasi "baik" ditemukan, maka tunjukkan hanya "baik". Jika tidak, tunjukkan semua yang tersedia (juga - "N Top").


Asumsi untuk membandingkan model


Untuk model pelatihan, kasus insiden yang sama digunakan.
Misalkan jika rekomendasi "baik" sebelumnya ditemukan, maka model baru juga harus menemukan rekomendasi "baik" untuk kejadian yang sama. Secara khusus, model baru dapat menemukan rekomendasi "baik" yang sama dengan yang lama. Namun, dengan model baru, kami berharap bahwa jumlah rekomendasi "buruk" akan menjadi lebih sedikit.


Kemudian, dengan mempertimbangkan indikator yang sama untuk rekomendasi m * dari model baru, mereka dapat dibandingkan dengan indikator yang sesuai untuk m . Berdasarkan perbandingan, Anda dapat memilih model terbaik.


Ada dua cara untuk memperhitungkan rekomendasi "baik" untuk perangkat m * :


  1. berdasarkan t ditemukan: pertimbangkan bahwa semua rekomendasi dari m * dengan d < t adalah "baik" dan memperhitungkannya untuk menghitung metrik
  2. berdasarkan estimasi sebenarnya yang sesuai dari himpunan m : dari rekomendasi m *, pilih hanya mereka yang ada estimasi benar dalam m , dan buang sisanya.

Dalam kasus pertama, indikator "absolut" ( n_inc_good , n_rec_good ) dari model baru harus lebih besar daripada untuk model dasar. Dalam kasus kedua, indikator harus mendekati indikator model dasar.
Masalah metode kedua: jika model baru lebih baik dari yang asli, dan ia menemukan sesuatu yang sebelumnya tidak diketahui, rekomendasi seperti itu tidak akan diperhitungkan dalam perhitungan.


Pilih opsi perbandingan model


Saat memilih model baru, saya ingin indikator meningkat dibandingkan dengan model yang ada:


  • jumlah rata-rata rekomendasi "baik" per insiden ( avg_inc_good )
  • jumlah insiden yang ada rekomendasi "baik" ( n_inc_good ).

Untuk perbandingan dengan model asli, kami akan menggunakan hubungan parameter ini dari model baru dan asli. Jadi, jika rasio parameter model baru dan lama lebih dari 1, model baru lebih baik.


 benchmark_agv_inc_good = avg_inc_good* / avg_inc_good benchmark_n_inc_good = n_inc_good* / n_inc_good 

Untuk menyederhanakan pemilihan, lebih baik menggunakan parameter tunggal. Kami mengambil rata-rata harmonik dari masing-masing indikator relatif dan menggunakannya sebagai satu-satunya kriteria kualitas komposit untuk model baru.


 composite = 2 / ( 1/benchmark_agv_inc_good + 1/benchmark_n_inc_good) 

Model baru dan pengoptimalannya


Untuk model baru, dalam vektor akhir yang mewakili insiden, tambahkan komponen yang bertanggung jawab untuk "area kejadian" (salah satu dari beberapa sistem yang dilayani oleh tim kami).
Informasi tentang unit dan lokasi karyawan yang menciptakan insiden juga ditempatkan dalam komponen vektor yang terpisah. Semua komponen memiliki bobotnya dalam vektor akhir.


 p = Pipeline( steps=[ ('grp', ColumnTransformer( transformers=[ ('text', Pipeline(steps=[ ('pp', CommentsTextTransformer(n_jobs=-1)), ("tfidf", TfidfVectorizer(stop_words=get_stop_words(), ngram_range=(1, 3), max_features=10000, min_df=0)) ]), ['short_description', 'comments'] ), ('area', OneHotEncoder(handle_unknown='ignore'), ['area'] ), ('dept', OneHotEncoder(handle_unknown='ignore'), ['u_impacted_department'] ), ('loc', OneHotEncoder(handle_unknown='ignore'), ['u_impacted_location'] ) ], transformer_weights={'text': 1, 'area': 0.5, 'dept': 0.1, 'loc': 0.1}, n_jobs=-1 )), ('norm', Normalizer()), ("nn", NearestNeighborsTransformer(n_neighbors=10, metric='cosine')) ], memory=None) 

Model hiperparameter diharapkan mempengaruhi target model. Dalam arsitektur model yang dipilih, kami akan mempertimbangkan sebagai hiperparameter:


  • Parameter vektorisasi TF-IDF - digunakan n-gram (ngram_range), ukuran kamus (max_features), mengemudi istilah minimum (min_df)
  • kontribusi komponen pada vektor akhir - transformer_weights.

Nilai-nilai awal dari hyperparameters vektorisasi teks diambil dari model sebelumnya. Bobot komponen awal dipilih berdasarkan penilaian ahli.


Siklus pemilihan parameter


Cara membandingkan, memilih level misfire dan membandingkan model di antara mereka sendiri telah ditentukan. Sekarang kita dapat melanjutkan ke optimasi melalui pemilihan hyperparameters.


Siklus optimisasi


 param_grid = { 'grp__text__tfidf__ngram_range': [(1, 1), (1, 2), (1, 3), (2, 2)], 'grp__text__tfidf__max_features': [5000, 10000, 20000], 'grp__text__tfidf__min_df': [0, 0.0001, 0.0005, 0.001], 'grp__transformer_weights': [{'text': 1, 'area': 0.5, 'dept': 0.1, 'loc': 0.1}, {'text': 1, 'area': 0.75, 'dept': 0.1, 'loc': 0.1}, {'text': 1, 'area': 0.5, 'dept': 0.3, 'loc': 0.3}, {'text': 1, 'area': 0.75, 'dept': 0.3, 'loc': 0.3}, {'text': 1, 'area': 1, 'dept': 0.1, 'loc': 0.1}, {'text': 1, 'area': 1, 'dept': 0.3, 'loc': 0.3}, {'text': 1, 'area': 1, 'dept': 0.5, 'loc': 0.5}], } for param in ParameterGrid(param_grid=param_grid): p.set_params(**param) p.fit(x) ... 

Hasil Optimasi


Tabel tersebut menunjukkan hasil percobaan di mana hasil yang menarik dicapai - 5 nilai terbaik dan terburuk untuk indikator yang dikendalikan.



Sel-sel dengan indikator dalam tabel ditandai sebagai:


  • hijau tua adalah indikator terbaik di antara semua eksperimen
  • hijau pucat - nilai indikator di atas-5
  • merah gelap - indikator terburuk di antara semua percobaan
  • merah pucat - indikatornya ada di terburuk-5

Indikator komposit terbaik diperoleh untuk model dengan parameter:


 ngram_range = (1,2) min_df = 0.0001 max_features = 20000 transformer_weights = {'text': 1, 'area': 1, 'dept': 0.1, 'loc': 0.1} 

Model dengan parameter ini menunjukkan peningkatan indikator komposit dibandingkan dengan model asli 24%


Beberapa pengamatan dan kesimpulan


Menurut hasil optimasi:


  1. Menggunakan trigram ( ngram_range = (1,3) ) tampaknya tidak dibenarkan. Mereka mengembang kamus dan sedikit meningkatkan akurasi dibandingkan dengan bigRAM.


  2. Perilaku yang menarik ketika membangun kamus hanya menggunakan bigrams ( ngram_range = (2,2) ): "akurasi" rekomendasi meningkat, dan jumlah rekomendasi yang ditemukan berkurang. Sama seperti keseimbangan presisi / recall dalam pengklasifikasi. Perilaku serupa diamati dalam pemilihan tingkat batas t - untuk bigrams β€œkerucut” yang lebih sempit dan pemisahan yang lebih baik dari rekomendasi "baik" dan "buruk" adalah karakteristik.


  3. Parameter nol_ min_df, bersama dengan bigrams, meningkatkan akurasi rekomendasi. Mereka mulai didasarkan pada istilah yang muncul setidaknya beberapa kali. Ketika parameter meningkat, kamus mulai menyusut dengan cepat. Untuk sampel kecil, seperti dalam kasus kami, mungkin akan lebih dimengerti untuk beroperasi dengan jumlah dokumen (nilai integer min_df) daripada fraksi dokumen (nilai fraksional min_df) yang mengandung istilah tersebut.


  4. Hasil yang baik diperoleh ketika atribut insiden yang bertanggung jawab untuk "wilayah" termasuk dalam vektor akhir dengan bobot sama dengan atau dekat dengan komponen teks. Nilai yang rendah menyebabkan peningkatan proporsi rekomendasi "buruk" karena menemukan kata-kata serupa dalam dokumen dari bidang lain. Tetapi tanda-tanda lokasi pelanggan tidak mempengaruhi hasil rekomendasi dengan baik dalam kasus kami.



Beberapa ide baru telah muncul:


  • tambahkan komponen "waktu" sehingga insiden terkini lebih diutamakan daripada insiden serupa.
  • lihat bagaimana pengantar parameter max_df akan mempengaruhi - walaupun dengan tf-idf kata-kata yang terlalu umum untuk corpus seharusnya tidak memiliki bobot yang signifikan, menurut definisi.
  • akhirnya mencoba cara lain untuk membuat vektor konten, misalnya, berdasarkan kata-ke-vektor, atau berdasarkan konvolusi pandangan tf-idf menggunakan jaringan.

Source: https://habr.com/ru/post/id472772/


All Articles