Analisis menggunakan pengelompokan lowongan

Artikel ini memberikan metode untuk menganalisis lowongan untuk kueri penelusuran "Python" menggunakan model pengelompokan Gaussian Mixture Model (GMM). Untuk setiap cluster yang disorot, keterampilan dan kisaran gaji yang paling banyak diminta akan ditampilkan.



Apa tujuan dari penelitian ini? Saya ingin tahu:



  • Dalam aplikasi apa Python digunakan
  • Pengetahuan apa yang dibutuhkan: database, perpustakaan, kerangka kerja
  • Berapa banyak spesialis di setiap arah yang dibutuhkan
  • Gaji apa yang ditawarkan






Memuat data



Pekerjaan download dari situs hh.ru , menggunakan API: dev.hh.ru . Atas permintaan "Python", lowongan 1994 diunggah (wilayah Moskow), yang dibagi menjadi rangkaian pelatihan dan pengujian, dalam proporsi 80% dan 20% . Ukuran set pelatihan adalah 1595 , ukuran set pengujian adalah 399 . Set pengujian hanya akan digunakan di bagian Skill Top / Antitop dan klasifikasi Job.



Tanda-tanda



Menurut teks lowongan yang diunggah, dua kelompok kata yang paling umum n-gram terbentuk :



  • 2 gram dalam bahasa Sirilik dan Latin
  • 1 gram dalam bahasa Latin


Dalam lowongan TI, keterampilan dan teknologi utama biasanya ditulis dalam bahasa Inggris, sehingga kelompok kedua hanya memasukkan kata-kata dalam bahasa Latin.



Setelah dilakukan seleksi n-gram, kelompok pertama berisi 81 2-gram dan kelompok kedua 98 1-gram:

Tidak. n n-gram Bobot Lowongan
1 2 dengan python delapan 258
2 2 ci cd delapan 230
3 2 pemahaman prinsip delapan 221
4 2 pengetahuan tentang sql delapan 178
lima 2 pengembangan dan sembilan 174
... ... ... ... ...
82 1 sql lima 490
83 1 linux 6 462
84 1 postgresql.dll lima 362
85 1 buruh pelabuhan 7 358
86 1 Jawa sembilan 297
... ... ... ... ...


Diputuskan untuk membagi lowongan menjadi beberapa cluster sesuai dengan kriteria berikut dalam urutan prioritas:

Sebuah prioritas Kriteria Bobot
1 Bidang (arah terapan), posisi, pengalaman

n-gram: "pembelajaran mesin", "administrasi linux", "pengetahuan luar biasa"
7-9
2 Alat, teknologi, perangkat lunak.

n-gram: "sql", "linux os", "pytest"
4-6
3 Keterampilan

n-gram lainnya: "pendidikan teknis", "Bahasa Inggris", "tugas menarik"
1-3


Penentuan kelompok kriteria mana yang termasuk dalam n-gram, dan bobot apa yang akan diberikan padanya, terjadi pada tingkat intuitif. Berikut ini beberapa contohnya:

  1. Pada pandangan pertama, "Docker" dapat dikaitkan dengan kelompok kriteria kedua dengan bobot 4 hingga 6. Tetapi penyebutan "Docker" dalam lowongan kemungkinan besar berarti bahwa lowongan tersebut akan untuk posisi "insinyur DevOps". Oleh karena itu, "Docker" masuk ke dalam kelompok pertama dan mendapat bobot 7.

  2. «Java» , .. «Java» Java- « Python». «-». , , , «Java» 9.



n- — .





Untuk perhitungan, setiap kekosongan diubah menjadi vektor dengan dimensi 179 (jumlah fitur yang dipilih) bilangan bulat dari 0 hingga 9, di mana 0 berarti bahwa ke-i n-gram tidak ada dalam lowongan, dan angka dari 1 hingga 9 berarti adanya ke-i n - gram dan beratnya. Selanjutnya dalam teks, titik dipahami sebagai kekosongan yang direpresentasikan oleh vektor tersebut.

Contoh:

Misalkan daftar n-gram hanya berisi tiga nilai:

Tidak. n n-gram Bobot Lowongan
1 2 dengan python delapan 258
2 2 pemahaman prinsip delapan 221
3 1 sql lima 490


Kemudian untuk lowongan dengan teks.



Persyaratan:



  • Pengalaman 3+ tahun dalam pengembangan python .
  • Pengetahuan yang baik tentang sql


vektornya adalah [8, 0, 5].



Metrik



Untuk bekerja dengan data, Anda harus memiliki pemahaman tentangnya. Dalam kasus kami, saya ingin melihat apakah ada cluster poin, yang akan kami anggap sebagai cluster. Untuk ini, saya menggunakan algoritma t-SNE untuk menerjemahkan semua vektor ke dalam ruang 2D. 



Inti dari metode ini adalah untuk mengurangi dimensi data, sambil menjaga proporsi jarak antara titik-titik himpunan sebanyak mungkin. Cukup sulit untuk memahami cara kerja t-SNE dari rumus. Tetapi saya menyukai satu contoh yang ditemukan di suatu tempat di Internet: katakanlah kita memiliki bola di ruang tiga dimensi. Kami menghubungkan setiap bola dengan semua bola lainnya dengan pegas tak terlihat, yang tidak berpotongan dengan cara apa pun dan tidak saling mengganggu saat menyilang. Pegas bertindak dalam dua arah, yaitu mereka menahan jarak dan pendekatan bola satu sama lain. Sistem dalam keadaan stabil, bola tidak bergerak. Jika kita mengambil salah satu bola dan menariknya kembali, lalu melepaskannya, ia akan kembali ke keadaan semula karena gaya pegas. Selanjutnya, kami mengambil dua piring besar, dan meremas bola menjadi lapisan tipis,sementara tidak mengganggu bola untuk bergerak di bidang antara dua pelat. Kekuatan pegas mulai bekerja, bola bergerak dan akhirnya berhenti ketika kekuatan semua pegas menjadi seimbang. Pegas akan bertindak sehingga bola yang berdekatan tetap relatif dekat dan rata. Juga dengan bola yang dilepas - mereka akan dikeluarkan dari satu sama lain. Dengan bantuan pegas dan pelat, kami mengubah ruang tiga dimensi menjadi dua dimensi, menjaga jarak antar titik dalam beberapa bentuk!Juga dengan bola yang dilepas - mereka akan dikeluarkan dari satu sama lain. Dengan bantuan pegas dan pelat, kami mengubah ruang tiga dimensi menjadi dua dimensi, menjaga jarak antar titik dalam beberapa bentuk!Juga dengan bola yang dilepas - mereka akan dikeluarkan dari satu sama lain. Dengan bantuan pegas dan pelat, kami mengubah ruang tiga dimensi menjadi dua dimensi, menjaga jarak antar titik dalam beberapa bentuk!



Algoritme t-SNE digunakan oleh saya hanya untuk memvisualisasikan sekumpulan poin. Dia membantu memilih metrik, serta memilih bobot untuk fitur.



Jika kita menggunakan metrik Euclidean yang kita gunakan dalam kehidupan sehari-hari, maka lokasi lowongan akan terlihat seperti ini:





Gambar tersebut menunjukkan bahwa sebagian besar titik terkonsentrasi di tengah, dan ada cabang kecil di sampingnya. Dengan pendekatan ini, algoritma pengelompokan yang menggunakan jarak antar titik tidak akan menghasilkan sesuatu yang baik.



Ada banyak metrik (cara untuk menentukan jarak antara dua titik) yang akan berfungsi dengan baik pada data yang Anda jelajahi. Saya memilih jarak Jaccard sebagai ukuran , dengan mempertimbangkan bobot n-gram. Ukuran Jaccard mudah dipahami, tetapi berfungsi dengan baik untuk memecahkan masalah yang sedang dipertimbangkan.

:

1 n-: « python», «sql», «docker»

2 n-: « python», «sql», «php»

:

« python» — 8

«sql» — 5

«docker» — 7

«php» — 9

(n- 1- 2- ):  « python», «sql» = 8 + 5 = 13

( n- 1- 2- ):  « python», «sql», «docker», «php» = 8 + 5 + 7 + 9 = 29

=1 — ( / ) = 1 — (13 / 29) = 0.55


Matriks jarak antara semua pasangan titik dihitung, ukuran matriksnya adalah 1595 x 1595. Totalnya, 1.271.215 jarak antar pasangan unik. Jarak rata-rata ternyata 0,96, antara 619659 jaraknya adalah 1 (yaitu tidak ada kesamaan sama sekali). Bagan berikut menunjukkan bahwa secara keseluruhan, ada sedikit kesamaan antara pekerjaan:





Menggunakan metrik Jaccard, ruang kita sekarang terlihat seperti ini:





Empat area kepadatan yang berbeda muncul, dan dua kelompok kecil dengan kepadatan rendah. Setidaknya begitulah mataku melihat!



Kekelompokan



Gaussian Mixture Model (GMM) dipilih sebagai algoritma clustering . Algoritma menerima data dalam bentuk vektor sebagai input, dan parameter n_components adalah jumlah cluster yang himpunannya harus dipecah. Anda dapat melihat cara kerja algoritme di sini (dalam bahasa Inggris). Saya menggunakan implementasi GMM yang sudah jadi dari pustaka scikit-learn: sklearn.mixture.GaussianMixture .



Perhatikan bahwa GMM tidak menggunakan metrik, tetapi memisahkan data hanya dengan sekumpulan fitur dan bobotnya. Dalam artikel, jarak Jaccard digunakan untuk memvisualisasikan data, menghitung kepadatan cluster (saya mengambil jarak rata-rata antara titik cluster untuk kepadatan), dan menentukantitik pusat cluster (kekosongan khas) - titik dengan jarak rata-rata terkecil ke titik lain dari cluster. Banyak algoritma pengelompokan menggunakan jarak antar titik dengan tepat. Bagian Metode Lain akan membahas jenis pengelompokan lain yang berbasis metrik dan juga memberikan hasil yang baik.



Pada bagian sebelumnya, ditentukan oleh mata bahwa kemungkinan besar akan ada enam kelompok. Beginilah tampilan hasil clustering dengan n_components = 6:







Pada gambar dengan output cluster terpisah, cluster disusun dalam urutan menurun dari jumlah titik dari kiri ke kanan, dari atas ke bawah: cluster 4 adalah yang terbesar, cluster 5 adalah yang terkecil. Kekompakan setiap cluster ditunjukkan dalam tanda kurung.



Secara tampilan, pengelompokannya ternyata tidak terlalu bagus, meskipun kami menganggap bahwa algoritme t-SNE tidak sempurna. Saat menganalisis cluster, hasilnya juga tidak menggembirakan.



Untuk menemukan jumlah cluster n_components yang optimal, kita akan menggunakan kriteria AIC dan BIC, yang dapat Anda baca di sini . Perhitungan kriteria ini dibangun ke dalam metode sklearn.mixture.GaussianMixture . Seperti inilah tampilan grafik kriteria:





Jika n_components = 12, kriteria BIC memiliki nilai terendah (terbaik), kriteria AIC juga memiliki nilai yang mendekati minimum (minimum jika n_components = 23). Kami melakukan pembagian pekerjaan menjadi 12 cluster:







Cluster sekarang lebih kompak, baik secara tampilan maupun numerik. Selama analisis manual, lowongan dibagi menjadi kelompok karakteristik untuk memahami seseorang. Gambar tersebut menunjukkan nama cluster. Cluster bernomor 11 dan 4 ditandai sebagai <Sampah 2>:



  1. Dalam cluster 11, semua fitur memiliki bobot total yang kira-kira sama.
  2. Cluster 4 didedikasikan untuk Java. Namun demikian, ada sedikit lowongan untuk posisi Java Developer di cluster, pengetahuan tentang Java sering kali diperlukan karena "akan menjadi nilai tambah tambahan".


Kluster



Setelah menghapus dua cluster yang tidak informatif bernomor 11 dan 4, hasilnya adalah 10 cluster:





Untuk setiap cluster, terdapat tabel fitur dan 2-gram yang paling sering ditemukan di lowongan cluster.



Legenda:



S - proporsi kekosongan tempat sifat ditemukan, dikalikan dengan bobot sifat

% - persentase kekosongan tempat sifat / 2 gram ditemukan Kekosongan

klaster tipikal - kekosongan, dengan jarak rata-rata terkecil ke titik lain dari klaster



Analis data



Jumlah Pekerjaan: 299 Pekerjaan Umum



: 35.805.914

Tidak. Masuk dengan berat S Tanda % 2 gram %
1 unggul 3.13 sql 64.55 pengetahuan tentang sql 18.39
2 r 2.59 unggul 34.78 dalam mengembangkan 14.05
3 sql 2.44 r 28.76 python r 14.05
4 pengetahuan tentang sql 1.47 dua 19.40 dengan besar 13.38
lima analisis data 1.17 tablo 15.38 pengembangan dan 13.38
6 tablo 1.08 google 14.38 analisis data 13.04
7 dengan besar 1.07 vba 13.04 pengetahuan tentang python 12.71
delapan pengembangan dan 1.07 ilmu 9.70 gudang analitik 11.71
sembilan vba 1.04 dwh 6.35 pengalaman pengembangan 11.71
sepuluh pengetahuan tentang python 1.02 peramal 6.35 database 11.37


Pengembang C ++



Jumlah Pekerjaan: 139 Pekerjaan Umum

: 39.955.360

Tidak. Masuk dengan berat S Tanda % 2 gram %
1 c ++ 9.00 c ++ 100.00 pengalaman pengembangan 44.60
2 Jawa 3.30 linux 44.60 c c ++ 27.34
3 linux 2.55 Jawa 36.69 c ++ python 17.99
4 c # 1.88 sql 23.02 di c ++ 16.55
lima Pergilah 1.75 c # 20.86 pengembangan pada 15.83
6 pengembangan pada 1.27 Pergilah 19.42 struktur data 15.11
7 pengetahuan yang baik 1.15 unix 12.23 pengalaman menulis 14.39
delapan struktur data 1.06 tensorflow 11.51 pemrograman 13.67
sembilan tensorflow 1.04 pesta 10.07 dalam mengembangkan 13.67
sepuluh pengalaman pemrograman 0.98 postgresql.dll 9.35 bahasa pemrograman 12.95


Teknisi Linux / DevOps



Jumlah Lowongan Kerja: 126

Jenis Pekerjaan : 39.533.926

Tidak. Masuk dengan berat S Tanda % 2 gram %
1 mungkin 5.33 linux 84.92 ci cd 58.73
2 buruh pelabuhan 4.78 mungkin 76.19 pengalaman administrasi 42.06
3 pesta 4.78 buruh pelabuhan 74.60 bash python 33.33
4 ci cd 4.70 pesta 68.25 tcp ip 39.37
lima linux 4.43 prometheus 58.73 pengalaman kustomisasi 28.57
6 prometheus 4.11 zabbix 54.76 pemantauan dan 26.98
7 nginx 3.67 nginx 52.38 prometheus grafana 23.81
delapan pengalaman administrasi 3.37 grafana 52.38 sistem pemantauan 22.22
sembilan zabbix 3.29 postgresql.dll 51.59 dengan buruh pelabuhan 16.67
sepuluh rusa besar 3.22 kubernetes 51.59 manajemen konfigurasi 16.67


Pengembang Python



Jumlah pekerjaan: 104

Lowongan umum: 39705484

Tidak. Masuk dengan berat S Tanda % 2 gram %
1 dengan python 6.00 buruh pelabuhan 65.38 dengan python 75.00
2 django 5.62 django 62.50 pengembangan pada 51.92
3 labu 4.59 postgresql.dll 58.65 pengalaman pengembangan 43.27
4 buruh pelabuhan 4.24 labu 50.96 labu django 04.24
lima pengembangan pada 4.15 redis 38.46 api istirahat 23.08
6 postgresql.dll 2.93 linux 35.58 python dari 21.15
7 aiohttp 1.99 kelincimq 33.65 database 18.27
delapan redis 1.92 sql 30.77 pengalaman menulis 18.27
sembilan linux 1.73 mongodb 25.00 dengan buruh pelabuhan 17.31
sepuluh kelincimq 1.68 aiohttp 22.12 dengan postgresql 16.35


Ilmuwan data



Jumlah lowongan: 98

Lowongan umum: 38071218

Tidak. Masuk dengan berat S Tanda % 2 gram %
1 panda 7.35 panda 81.63 pembelajaran mesin 63.27
2 numpy 6.04 numpy 75.51 panda numpy 43.88
3 pembelajaran mesin 5.69 sql 62.24 analisis data 29.59
4 pytorch.dll 3.77 pytorch.dll 41.84 ilmu data 26.53
lima ml 3.49 ml 38.78 pengetahuan tentang python 25.51
6 tensorflow 3.31 tensorflow 36.73 scipy numpy 24.49
7 analisis data 2.66 percikan 32.65 panda python 23.47
delapan scikitlearn 2.57 scikitlearn 28.57 dengan python 21.43
sembilan ilmu data 2.39 buruh pelabuhan 27.55 statistik matematika 20.41
sepuluh percikan 2.29 hadoop 27.55 algoritma mesin 20.41


Pengembang Frontend



Jumlah Pekerjaan: 97 Pekerjaan Umum

: 39.681.044

Tidak. Masuk dengan berat S Tanda % 2 gram %
1 javascript 9.00 javascript 100 html css 27.84
2 django 2.60 html 42.27 pengalaman pengembangan 25.77
3 reaksi 2.32 postgresql.dll 38.14 dalam mengembangkan 17.53
4 nodejs 2.13 buruh pelabuhan 37.11 pengetahuan tentang javascript 15.46
lima paling depan 2.13 css 37.11 dan dukungan 15.46
6 buruh pelabuhan 2.09 linux 32.99 python dan 14.43
7 postgresql.dll 1.91 sql 31.96 css javascript 13.40
delapan linux 1.79 django 28.87 database 12.37
sembilan html css 1.67 reaksi 25.77 dengan python 12.37
sepuluh php 1.58 nodejs 23.71 desain dan 11.34


Pengembang Backend



Jumlah Pekerjaan: 93 Pekerjaan Umum

: 40.226.808

Tidak. Masuk dengan berat S Tanda % 2 gram %
1 django 5.90 django 65.59 python django 26.88
2 js 4.74 js 52.69 pengalaman pengembangan 25.81
3 reaksi 2.52 postgresql.dll 40.86 pengetahuan tentang python 20.43
4 buruh pelabuhan 2.26 buruh pelabuhan 35.48 dalam mengembangkan 18.28
lima postgresql.dll 2.04 reaksi 27.96 ci cd 17.20
6 pemahaman prinsip 1.89 linux 27.96 pengetahuan percaya diri 16.13
7 pengetahuan tentang python 1.63 backend 22.58 api istirahat 15.05
delapan backend 1.58 redis 22.58 html css 13.98
sembilan ci cd 1.38 sql 20.43 kemampuan untuk memahami 10.75
sepuluh paling depan 1.35 mysql.dll 19.35 pada orang asing 10.75


Insinyur DevOps



Jumlah Pekerjaan: 78 Pekerjaan Umum

: 39634258

Tidak. Masuk dengan berat S Tanda % 2 gram %
1 devops 8.54 devops 94.87 ci cd 51.28
2 mungkin 5.38 mungkin 76.92 bash python 30.77
3 pesta 4.76 linux 74.36 pengalaman administrasi 24.36
4 jenkins 4.49 pesta 67.95 dan dukungan 23.08
lima ci cd 4.10 jenkins 64.10 buruh pelabuhan kubernetes 20.51
6 linux 3.54 buruh pelabuhan 50.00 pengembangan dan 17.95
7 buruh pelabuhan 2.60 kubernetes 41.03 pengalaman menulis 17.95
delapan Jawa 2.08 sql 29.49 dan kustomisasi 17.95
sembilan pengalaman administrasi 1.95 peramal 25.64 pengembangan dan 16.67
sepuluh dan dukungan 1.85 openshift 24.36 pembuatan skrip 14.10


Insinyur Data



Jumlah Pekerjaan: 77 Pekerjaan Umum

: 40.008.757

Tidak. Masuk dengan berat S Tanda % 2 gram %
1 percikan 6.00 hadoop 89.61 pengolahan data 38.96
2 hadoop 5.38 percikan 85.71 data besar 37.66
3 Jawa 4.68 sql 68.83 pengalaman pengembangan 23.38
4 sarang lebah 4.27 sarang lebah 61.04 pengetahuan tentang sql 22.08
lima skala 3.64 Jawa 51.95 pengembangan dan 19.48
6 data besar 3.39 skala 51.95 percikan hadoop 19.48
7 etl 3.36 etl 48.05 java scala 19.48
delapan sql 2.79 aliran udara 44.16 kualitas data 18.18
sembilan pengolahan data 2.73 kafka 42.86 dan pemrosesan 18.18
sepuluh kafka 2.57 peramal 35.06 sarang hadoop 18.18


Insinyur QA



Jumlah Pekerjaan: 56 Pekerjaan Umum

: 39630489

Tidak. Masuk dengan berat S Tanda % 2 gram %
1 otomatisasi uji 5.46 sql 46.43 otomatisasi uji 60.71
2 pengalaman pengujian 4.29 qa 42.86 pengalaman pengujian 53.57
3 qa 3.86 linux 35.71 dengan python 41.07
4 dengan python 3.29 selenium 32.14 pengalaman otomatisasi 35.71
lima pengembangan dan 2.57 web 32.14 pengembangan dan 32.14
6 sql 2.05 buruh pelabuhan 30.36 pengalaman pengujian 30.36
7 linux 2.04 jenkins 26.79 pengalaman menulis 28.57
delapan selenium 1.93 backend 26.79 menguji 23.21
sembilan web 1.93 pesta 21.43 pengujian otomatis 21.43
sepuluh backend 1.88 ui 19.64 ci cd 21.43




Gaji



Gaji ditunjukkan hanya di 261 (22%) lowongan dari 1.167 di cluster.



Saat menghitung gaji:



  1. Jika rentang "dari ... hingga ..." ditentukan, maka nilai rata-rata digunakan
  2. Jika hanya "dari ..." atau hanya "ke ..." yang diindikasikan, maka nilai ini diambil
  3. Perhitungan digunakan (atau diberikan) gaji setelah pajak (NET)


Di grafik:



  1. Cluster diberi peringkat dalam urutan menurun dari gaji median
  2. Bilah vertikal dalam kotak - median
  3. Kotak - rentang [Q1, Q3], di mana Q1 (25%) dan Q3 (75%) adalah persentil. Itu. 50% dari gaji jatuh ke dalam kotak
  4. "Kumis" termasuk gaji dari kisaran [Q1 - 1,5 * IQR, Q3 + 1,5 * IQR], di mana IQR = Q3 - Q1 - kisaran interkuartil
  5. Poin individu adalah anomali yang tidak jatuh ke kumis. (Ada anomali yang tidak termasuk dalam diagram)




Keterampilan Top / Antitop



Grafik dibuat untuk semua lowongan yang diupload tahun 1994. Gaji ditunjukkan dalam 443 (22%) lowongan. Untuk kalkulasi untuk setiap fitur, lowongan dipilih di mana fitur ini ada, dan berdasarkan gaji rata-rata dihitung.







Klasifikasi pekerjaan



Pengelompokan dapat dibuat lebih mudah tanpa menggunakan model matematika yang rumit: untuk mengumpulkan nama-nama teratas dari lowongan, dan membaginya menjadi beberapa kelompok. Selanjutnya, analisis setiap kelompok untuk n-gram teratas dan gaji rata-rata. Tidak perlu menyoroti fitur dan menetapkan bobot padanya.



Pendekatan ini akan bekerja dengan baik (sampai batas tertentu) untuk kueri "Python". Tetapi untuk permintaan "1C Programmer" pendekatan ini tidak akan berhasil, karena untuk programmer 1C, nama lowongan jarang menunjukkan konfigurasi 1C atau area terapan. Dan ada banyak area di mana 1C digunakan: akuntansi, penghitungan gaji, penghitungan pajak, penghitungan biaya di perusahaan industri, akuntansi gudang, penganggaran, sistem ERP, ritel, akuntansi manajemen, dll.



Bagi saya sendiri, saya melihat dua tugas untuk menganalisis lowongan:



  1. Pahami di mana bahasa pemrograman yang saya tahu sedikit tentang digunakan (seperti dalam artikel ini).
  2. Filter pekerjaan baru yang diposting.


Pengelompokan cocok untuk memecahkan masalah pertama, untuk memecahkan masalah kedua - berbagai pengklasifikasi, hutan acak, pohon keputusan, jaringan saraf. Namun demikian, saya ingin mengevaluasi kesesuaian model yang dipilih untuk masalah klasifikasi pekerjaan.



Jika Anda menggunakan metode predict () yang ada di sklearn.mixture.GaussianMixture , maka tidak ada hal baik yang terjadi. Dia mengaitkan sebagian besar lowongan dengan cluster besar, dan dua dari tiga cluster pertama tidak informatif. Saya menggunakan pendekatan yang berbeda: 



  1. Kami mengambil lowongan yang ingin kami klasifikasikan. Kami memvektorkannya dan mendapatkan titik di ruang kami.
  2. Kami menghitung jarak dari titik ini ke semua cluster. Di bawah jarak antara titik dan cluster, saya mengambil jarak rata-rata dari titik ini ke semua titik di cluster.
  3. Cluster dengan jarak terkecil merupakan kelas prediksi untuk lowongan yang dipilih. Jarak ke cluster menunjukkan keandalan prediksi semacam itu.
  4. Untuk meningkatkan akurasi model, saya memilih 0,87 sebagai jarak ambang, yaitu. Jika jarak ke cluster terdekat lebih dari 0.87, maka model tidak mengklasifikasikan kekosongan tersebut.


Untuk mengevaluasi model, 30 lowongan dipilih secara acak dari set pengujian. Pada kolom putusan:



T / a: model tidak mengklasifikasikan pekerjaan (jarak> 0.87)

+: klasifikasi benar

-: klasifikasi salah  

Lowongan Kluster terdekat Jarak Putusan
37637989 Teknisi Linux / DevOps 0,9464 T / a
37833719 Pengembang C ++ 0.8772 T / a
38324558 Insinyur Data 0.8056 +
38517047 Pengembang C ++ 0.8652 +
39053305 Sampah 0,9914 T / a
39210270 Insinyur Data 0.8530 +
39349530 Pengembang Frontend 0.8593 +
39402677 Insinyur Data 0.8396 +
39415267 Pengembang C ++ 0.8701 T / a
39734664 Insinyur Data 0.8492 +
39770444 Pengembang Backend 0.8960 T / a
39770752 Ilmuwan data 0.7826 +
39795880 Analis data 0,9202 T / a
39947735 Pengembang Python 0.8657 +
39954279 Teknisi Linux / DevOps 0.8398 -
40008770 Insinyur DevOps 0.8634 -
40015219 Pengembang C ++ 0.8405 +
40031023 Pengembang Python 0.7794 +
40072052 Analis data 0,9302 T / a
40112637 Teknisi Linux / DevOps 0.8285 +
40164815 Insinyur Data 0.8019 +
40186145 Pengembang Python 0.7865 +
40201231 Ilmuwan data 0.7589 +
40211477 Insinyur DevOps 0.8680 +
40224552 Ilmuwan data 0,9473 T / a
40230011 Teknisi Linux / DevOps 0,9298 T / a
40241704 Sampah 2 0,9093 T / a
40245997 Analis data 0,9800 T / a
40246898 Ilmuwan data 0,9584 T / a
40267920 Pengembang Frontend 0.8664 +


Total: 12 lowongan tidak ada hasil, 2 lowongan - klasifikasi salah, 16 lowongan - klasifikasi benar. Kelengkapan model - 60%, akurasi model - 89%.



Sisi lemah



Masalah pertama - mari kita ambil dua lowongan:

Lowongan 1 - "Lead C ++ Programmer"

"Persyaratan:



  • 5+ tahun pengalaman pengembangan C ++.
  • Pengetahuan tentang Python akan menjadi nilai tambah tambahan. "


Lowongan 2 - "Lead Python Programmer"

"Persyaratan:

  • 5+ tahun pengalaman pengembangan Python.
  • Pengetahuan tentang C ++ akan menjadi nilai tambah tambahan "
Dari sudut pandang model, lowongan ini identik. Saya mencoba menyesuaikan bobot fitur dengan urutan kemunculannya dalam teks. Ini tidak menghasilkan sesuatu yang baik.



Masalah kedua adalah GMM mengelompokkan semua titik dalam satu set, seperti banyak algoritme pengelompokan. Cluster non-informatif tidak menjadi masalah dengan sendirinya. Tetapi cluster informatif juga mengandung pencilan. Namun, hal ini dapat dengan mudah diselesaikan dengan membersihkan cluster, misalnya, dengan menghapus titik paling atipikal yang memiliki jarak rata-rata terbesar ke titik cluster lainnya.



Metode lain



Halaman perbandingan cluster mendemonstrasikan berbagai algoritma clustering dengan baik. GMM satu-satunya yang memberikan hasil bagus.

Algoritme lainnya tidak berfungsi atau memberikan hasil yang sangat sederhana.



Dari yang saya terapkan, hasil yang baik ada dalam dua kasus:



  1. Titik dengan kepadatan tinggi dipilih di beberapa lingkungan, terletak pada jarak yang jauh satu sama lain. Poin menjadi pusat cluster. Kemudian, berdasarkan pusat-pusat tersebut, proses pembentukan cluster dimulai - penggabungan titik-titik tetangga.
  2. Pengelompokan aglomeratif adalah penggabungan titik dan cluster berulang-ulang. Library scikit-learn menyajikan pengelompokan semacam ini, tetapi tidak berfungsi dengan baik. Dalam implementasinya, saya mengubah matriks gabungan setelah setiap iterasi penggabungan. Proses berhenti ketika beberapa parameter batas tercapai - pada kenyataannya, dendrogram tidak membantu untuk memahami proses penggabungan jika 1500 elemen dikelompokkan.


Kesimpulan



Riset yang saya lakukan memberi saya jawaban atas semua pertanyaan di awal artikel. Saya mendapat pengalaman langsung dengan pengelompokan sambil menerapkan variasi algoritme yang dikenal. Saya sangat berharap artikel ini akan memotivasi pembaca untuk melakukan penelitian analitisnya, dan entah bagaimana akan membantu dalam pelajaran yang menarik ini.



All Articles