Makine Öğrenmesi ile İnsanların Çalışma Süresini Tahmin Etme

Onur Sercan Yılmaz
Kariyer.net Tech
Published in
9 min readSep 30, 2021

Bu makale Onur Sercan Yılmaz tarafından 29.09.2021 tarihinde arge.kariyer.net için yazılmıştır.

Merhaba 🖐 1 aylık Kariyer.net TechKariyer Staj Programı kapsamında hazırlamış olduğum staj projemde, bir işte çalışan veya bir işe başvuruda bulunan bireylerin çalışma sürelerini, makine öğrenmesi yöntemleri ile tahmin etmeye yönelik modeller geliştirdik.

  1. Literatür Taraması
  2. Veri Ön İşleme (Data Preprocessing)
  3. Modeller
    a) Model 1
    b) Model 2
    c) Model 3
    d) Diğer Modeller ve İşlemler
  4. Sonuç
  5. Teşekkür
  6. Kaynaklar

1. Literatür Taraması

İlk olarak literatür taraması ile başlamış olduğumuz bu serüvende, yapılan çalışmaların; bir şirketteki işten ayrılma, çalışan memnuniyeti ve yıpranma oranları üzerine olduğunu gözlemlemiş olduk. Kullanılan verilerin ise anketlere dayandığını veya şirketlerin çalışanlarından topladığı kişisel verilerden oluştuğunu söyleyebiliriz. Edindiğimiz araştırmalar, işte çalışma süresi etkileyen faktörlerden oluşsa da, direkt olarak çalışma süresini tahmin etmeye yönelik parametreler değiller. Bizler ise bir şirketin değil, bireylerin özgeçmişlerinde bulunan parametrelere göre bir proje inşa edeceğimiz için literatür taraması anlamında umduğumuz kaynaklarla karşılaşamadığımızı söyleyebiliriz.

Böylece, elimizdeki verilerle nereye varabiliriz, çalışan bireyin ne zaman işten ayrılabileceğini veya işe başvuran bireyin ne kadar süreyle o işte çalışacağını tahmin etmeye yönelik modeller geliştirip, deneme yanılma aşamasına adım atmış olduk.

2. Veri Ön İşleme (Data Preprocessing)

Öncelikle, son 6 ay içerisinde özgeçmişini güncelleyen, IT sektöründeki bireylerin verileriyle işe koyulup bir model oluşturmayı amaçladık. Hedeflerimize ulaşabilirsek, diğer sektörler için de modeli uygulayabileceğimizi düşündük. Elimizde bireyin eğitim bilgileri, bireyi temsil eden ‘AdayNo’, önceki işlerine ait sektörel bilgileri, pozisyonlarından ve kaç ay çalıştığına dair bilgilerden, askerlik durumundan, ürettiği projelerden ve niteliklerinden oluşan değişik veri setleri bulunuyordu. Elimizdeki veri setlerini, önce kendi aralarında düzenleyip ardından bir bütün haline getirdik.

Kullanılan featurelar : [‘AdayNo’, ‘SonEgitim’, ‘EgitimDurumu’, ‘AskerlikDurumu’, ‘SehirAdi’, ‘SehirKodu’, ‘SemtKodu’, ‘AdayinUniversiteKodu’,‘uniDepartmanKodu’, ‘AdayinDiplomaNotu’, ‘diplomaNotuMax’, ‘unibaslamaTarihi’, ‘unibitisTarihi’, ‘ogrenimTipi’,‘uniTur’, ‘diplomaOranı’, ‘CalismaBitis’, ‘IsCalismaSekli’, ‘IsSektoruKodu’, ‘AdayPozisyonKodu’,‘IsSehirKodu’, ‘OrtCalismaSuresi’, ‘StdCalismaSuresi’, ‘Nitelikleri’, ‘toplamNitelikSayisi’, ‘toplamProjeSayisi’, ‘CalismaSuresi’]

Düzenleme aşamasında; veri temizleme, eksik verileri doldurma gibi aşamaları gerçekleştirip, veriler arasında sınıflandırılmış olan string değerleri LabelEncoding metodu ile encode ettik. Sadece işten ayrılan bireylerin verilerini kullanmak adına, işten çıkış tarihleri bulunan verilerle devam ettik. Veriler bir bireyin, birden fazla işte çalıştığı ve birden fazla üniversitede eğitim gördüğü satırlar içeriyordu. Bu nedenle veriyi, -aşağıdaki kod ile- her bireyi tek satırda temsil edebileceğimiz şekilde gruplamış olduk.

Eğitim bilgilerine dayanarak kendi üretmiş olduğumuz üniversite sayısı sütununu, iş bilgilerine dayanarak sektörlerde ve pozisyonlarda ortalama, medyan ve mod cinsinden yapmış olduğumuz hesaplamaları da verilere dahil ettikten sonra, her veriyi ‘AdayNo’ sütununa göre merge ettik ve böylece elimizde eksiksiz, temiz ve bütün bir veri seti oluştu.

İş verilerini içeren örnek sütunlar

Örnek verilerden de görüleceği üzere, bireyler farklı sayıda iş tecrübesine sahip. Bu listeleri sütun haline getirdiğimiz zaman, her birey için maksimum iş sayısına sahip bireyin, iş sayısı kadar sütun oluşacağı görülmekte. Yani örnekle açıklamak gerekirse; X kişisi 5 işte çalıştıysa, Y kişisi 2 işte çalışmış olsa dahi, her bireyin 5 tane iş tecrübesi sütunu oluşacak. Bu oluşan boş sütunlar NaN değerleriyle dolacaksa da, bizler bunu 0 ile doldurup model geliştirmeye devam edebilirdik ki bu şekilde denediğimiz bir modele Diğer Modeller başlığı altında değineceğiz.

Burada proje için büyük bir yol ayrımına giderek, son işlerdeki verilerin daha önemli olduğuna karar verdik. Son iş verilerini alt alta gelecek şekilde düzenledik.

Listeleri genişletme ve 0'ları listenin başına gönderme işlemi

Bu durum karşısında, her sütundaki maksimum uzunluğa sahip listeyi bulduk. Aynı sütundaki diğer listelerin uzunluğunu da, 0 ile doldurarak, maksimum listenin uzunluğuna eşitledik. Yine örnek vermem gerekirse; X kişisi 5 işte ve Y kişisi 2 işte çalıştıysa X’in 5. iş bilgileri Y’nin 2., X’in 4. iş verileri Y’nin 1. iş bilgileri ile alt alta gelecek ve X’in 3,2 ve 1. iş bilgilerinin olduğu sütunlarda Y’nin iş bilgilerinde 0 yazacaktır. Yani özetle yaptığımız şey; aynı sütundaki listelerin boyutlarını eşitleyip, listedeki 0'ları listelerin başına göndermek oldu.

Bu işlemler, üniversite bilgileri için de gerçekleştirildi ve en son eğitim görülen üniversiteler alt alta gelecek şekilde düzenlendi. Sağa yaslanmış bilgileri içeren veri seti, listelerdeki her bir veriyi sütuna çeviren bir fonksiyon ile düzenlendikten sonra, modellerde kullanılacak hale gelmiş oldu.

Son işe ait (sağa yaslı) çalışma sürelerine göre düzenlenmiş örnek veri

3. Modeller

Olabildiğince çeşitli ve farklı algoritmalarla geliştirmeye çalıştığımız ve amacımızın, bireylerin son işlerinin süresini tahmin etmek olduğu modellerden, temellerinin sağlam olduğuna inandığımız 3 farklı modeli, ayrıca deneyip istenilen sonuçları alamadığımız bir kaç yöntemi de sizlerle paylaşmak istiyoruz.

a) Model 1

Model 1, devamında gelecek olan Model 2 ve Model 3 için ön ayak olacak iskelet bir yapıya sahip. Manuel olarak belirlediğimiz 0–6, 6–18, 18–36, 36–60, 60–120 ve 120+ ay olacak şekilde sütunlardan oluşan intervals adında boş bir veri seti oluşturuyoruz.

Son verilerin al alta geldiği (sağa yaslı) veri setinde bulunan son sütun, bireyin son çalıştığı işin kaç ay olduğunu gösteriyor. Verimizi X ve Y olarak ikiye ayırırken X son iş verisi hariç tüm veriyi, Y ise son iş verisini temsil ediyor.

Y sütunundaki son iş verileri, manuel olarak belirlediğimiz aralıklardan hangisine denk geliyorsa, intervals veri setimizde o sütunu 1, diğer sütunları 0 ile etiketleyerek her satırda sadece bir tane 1 olacak şekilde veri setini binary hale getiriyoruz.

Solda Y, sağda intervals veri setleri bulunuyor.

Bu aşamada Y’den yararlanarak intervals veri setini elde etmiş oluyoruz. Devamında X ve intervals verilerini %75 train, %25 test verisi olmak üzere split ediyoruz. Split işleminin ardından elimizdeki X_train, X_test, Y_train ve Y_test verilerinden X_train ve X_test için StandardScaling uyguluyoruz.

Devamında çeşitli algoritmalardan bizler için test verilerinin hangi aralıklara düştüğünü tahmin etmesini istiyoruz.

Model 1 Sonuçları

Algoritmalardan en iyi performansı Desicion Tree’nin verdiğini gözlemliyoruz. Burada LogisticRegression, SVC, KNN, Voting Ensemble, algoritmalarını ve yaklaşımlarını kullandıysak da sonuçlar tablodakilerden farklı veya daha yüksek gelmedi. XGBoost ve LGBM algoritmalarının çoklu sütun sonucu (multioutput) vermemeleri nedeniyle MultiOutputClassifier algoritmasından yararlandık. Ayrıca OneVsRestClassifier, Classifier Chains gibi multiclass veya multilabel classification yaklaşımları da beklediğimiz sonuçları vermeyen yöntemler arasında.

b) Model 2

Model 2, aynı Model 1’deki yapıyı kullanarak geliştirdiğimiz, bu sefer algoritmalardan multioutput olarak değil de, sütun sütun tahmin etmelerini istediğimiz bir model.

Model 1'de elde ettiğimiz intervals adındaki veri setinde bulunan sütunları kendi arasında bölerek, A,B,C,D,E,F harfleriyle adlandırdığımız 6 farklı veri seti elde ediyoruz. 6 veri setini de kendi arasında X_trainA, X_testA vb. şekilde split edip StandardScaling ile scale ettikten sonra, her algoritmayı bu 6 sütun için çalıştırıp, tahminde bulunmasını istiyoruz.

Bu aşamada sonuçlar aşırı iyi geliyor ve dengesiz veri (imbalanced data) problemiyle karşılaşıyoruz. Bu sorunu resampling yöntemleri olan RandomUnderSampling, RandomOverSampling ve SMOTE algoritmaları ile aşmaya çalışıyoruz ve en iyi sonucu veren RandomOverSampling metodu ile train verilerini resample ediyoruz. Bu yöntem ile sütunlarda dengesiz olarak bulunan 0 ve 1 sayıları üst seviyede eşitlenmiş oluyor.

Ardından resample edilmiş veri ile algoritmalardan aldığımız sonuçları gözlemliyoruz. Yine değişik algoritmalar denediğimiz Model 2 için en iyi sonuçları veren LGBM algoritmasının sonuçları şu şekilde:

Model 2 Sonuçları
Model 2 Sonuçları

Model 2 için accuracy_score ve f1_score’larının yanında Cohen’s Kappa Score ve ROC Curve yöntemleri ile de gözlem yapıyoruz. Bu modelde elde ettiğimiz sonuçlar sütun bazında güzel gözükse de, 6 farklı sonuç elde ediyoruz. Ayrıca aynı satırda, aynı anda farklı sütunlardaki 1 değerleri ile karşılaşabiliyoruz. Yani örnek verirsek; 0_6 aralığında 1 olarak etiketlenen kısım, 6_18 aralığında da 1 ile etiketlenmiş olabiliyor. Hatta 3 aralıkta dahi etiketlenen veriyle karşılaşabiliyoruz. Bu 6 farklı sütundan doğan sonucu, tek sonuca düşürme aşamasında, farklı sütunlarda 1 ile etiketlenen verinin, en yüksek aralığa dahil olduğunu kabul edecek olursak, doğruluk oranı oldukça düşüyor.

Confusion Matrix değerlerine de bakacak olursak, modelimiz True Positive (0–0) değerlerini yüksek doğruluk oranıyla bilirken, aralıklar arttıkça False Positive (0–1) değerlerindeki performansı, modelimizin doğruluk oranını negatif yönde etkiliyor.

Özetle bireyselde iyi sonuç veren Model 2'de, tek sonuca ulaşma aşamasında sıkıntı yaşıyoruz. Modelin sonuçlarını yorumlayabilmek adına örnek verirsek; 0_6, 6_18 ve 18_36 aralıklarında 1 etiketine sahip olan durum için, bireyin, minimum 0–6 ay, maksimum 3 yıl çalışabileceği kanaatine varabiliriz.

c) Model 3

Model 3'te de ilk modelimizdeki iskelet yapıyı kullanıyoruz ama tek farkla. Bu sefer binary değil, multilabel bir yapı ile, sadece bir sütundan oluşan veri seti oluşturuyoruz.

X ve Y olarak böldüğümüz verimizde, Y’den (son iş süresi) yararlanarak manuel olarak belirlediğimiz 0–6'dan 120+’a kadar olan aralıklarımızı, 0–5 ile etiketliyoruz. Örneğin, 0–6 için 0, 6–18 için 1 gibi. Y sütununda bulunan çalışma süreleri, hangi aralığa denk geliyorsa, algoritmalarla o aralığın etiketinin tahminini yapmak istiyoruz.

Verimizi test ve train verisi olarak split edip StandardScaling uyguladıktan sonra, etiketlerin dengeli dağıldığına kanaat getiriyoruz ve değişik algoritmalarda tahminleri gözlemliyoruz.

Model 3 Sonuçları

Denediğimiz algoritmalardan en iyi sonucu verenler XGBoost ve LGBM algoritmaları oluyor. Model 1 ile kıyaslandığında; daha iyi bir sonuç elde etsek de, %53 doğruluk oranı, varmak istediğimiz noktaya yakın bir konumda yer almıyor.

d) Diğer Modeller ve İşlemler

i) Veri Ön İşleme bölümünde atıfta bulunduğumuz üzere, sütunlardaki listelerde bulunan verileri, listenin sonuna göndermeden yani sağa yaslamadan, bir diğer ifadeyle ilk işten itibaren alt alta gelecek şekilde bir veri seti oluşturup devam edecek olursak; bireylerin son işlerinde ne kadar çalışacağını tahmin etmemiz olasılıksız hale geliyor. Bunun nedeni bireylerin farklı sayıda işte çalışmış olmaları. Bireylerin 8.işinde ne kadar çalışacağını tahmin edecek olursak, o sütunda 8.işi olmayan ve bu nedenle 0 ile doldurulmuş veriler de bulunuyor. Bu 0'lar algoritmaları yanıltacaktır.

ii) Veri Ön İşleme aşamasında belirtildiği üzere, veri setinde sadece işten ayrılanların verisiyle devam ettiğimizden bahsettik. Karma veri ile devam edip işten ayrılanları 1, işe devam edenleri 0 ile etiketleyecek olursak; binary halde ‘Status’ adında bir sütun oluşturuyoruz. Amacımız bireyin işten ayrılıp ayrılmadığını yani ‘Status’ sütununu tahmin etmek oluyor. Burada yine 0 ve 1 dağılımının dengesiz olduğunu görüyor ve RandomOverSampling uyguluyoruz. Ardından algoritmadan ‘Status’ı tahmin etmesini isteyip, confusion matrix değerlerini yazdırınca, bizi ilgilendiren aslında algoritmanın yanıldığı kısım oluyor. Nasıl mı? Algoritma eğer 0 (devam ediyor) olan çalışanı, 1 (işten ayrıldı) olarak tahmin ediyorsa; bu çalışanlar, yakın zamanda işten ayrılabilir kanaatine varılabilir. Algoritmada aylık çalışma süresi baz alındığı için, aylık bazda algoritma ile kontrollerin yapılması gerekmekte. Bu model ile bireyin ne kadar çalışacağına değil, işten ayrılıp ayrılmayacağına karar verilebilir.

iii) Sütun sayılarını azaltabilme adına feature importance ile veriler arasında en çok öneme sahip olan 15 sütunu seçip, modelleri bu sütunlar ile yeniden denemiş olsak da, sonuçlar yine %50'yi geçemiyor.

iv) Model 1,2 ve 3 aynı zamanda IBM HR verileri ‘TotalWorkYears’ sütunu üzerinde de denenmiş olup, Model 3, XGBoost algoritmasıyla %88 doğruluk oranıyla en iyi sonucu vermiştir.

4. Sonuç ve Son Sözler

Bu yazıda, projemizi ne amaçla geliştirdiğimizi ve hangi yöntemleri deneyip, ne gibi sonuçlar aldığımızı aktarmak istedik. Sonuç olarak her ne kadar literatür taramasında elimizdeki verilere benzeyen ve aynı amaçla üretilmiş modellere rastlamasak da, araştırmalarımıza dayanarak %85+ oranında bir doğruluk skoru, modellerimizin verilerimiz üzerinde uygulanabilir olduğunu gösterecektir. Sizlerin de bu ve benzeri konularda uygulayabileceği veya uygulaması halinde ne gibi sonuçlarla karşılaşabileceğini göstermek için, belki de sizlerden gelecek olan geri dönüşler ile modellerimizi geliştirebileceğimizi düşünerek ayrıntılı bir anlatım yaptık. Umarız sizler için de yararlı olmuştur.

5. Teşekkür

Bana bu güzel staj programında, bu güzel ekip ile gerçek bir proje üzerinde çalışabilme ve deneyim kazanabilme imkanı sunan Kariyer.net ailesine, projedeki hatalarımı göstererek ve öğreterek düşüncelerini bir öğretmen gibi sabırla sunan Kemal Can Kara’ya ve projenin fikir babası, toplantılarla projede önemli kararlar almamızı sağlayan Arda Yücel’e teşekkürü borç bilirim.

6. Kaynaklar

--

--