Takip et

Python ile Maaş Tahmin Sistemi Geliştirme: Makine Öğrenimi ve GUI Entegrasyonu

Günümüz iş dünyasında, doğru maaş beklentileri hem çalışanlar hem de işverenler için kritik öneme sahiptir. Çalışanlar kariyer planlaması y…

Python ile Maaş Tahmin Sistemi Geliştirme: Makine Öğrenimi ve GUI Entegrasyonu

Günümüz iş dünyasında, doğru maaş beklentileri hem çalışanlar hem de işverenler için kritik öneme sahiptir. Çalışanlar kariyer planlaması yaparken, işverenler ise rekabetçi ve adil bir ücret politikası oluştururken güvenilir verilere ihtiyaç duyarlar. Bu makalede, Python programlama dilini kullanarak, makine öğrenimi modelleri ve grafiksel kullanıcı arayüzü (GUI) entegrasyonu ile interaktif bir maaş tahmin sistemi nasıl geliştirileceğini adım adım inceleyeceğiz. Bu sistem, farklı özelliklere sahip bir pozisyon için potansiyel maaş aralığını tahmin etmenize yardımcı olacaktır.

Giriş: Maaş Tahmin Sistemlerinin Önemi ve Kapsamı

Maaş tahmin sistemleri, veri bilimi ve makine öğreniminin gerçek dünya problemlerine uygulandığı mükemmel örneklerden biridir. Bu sistemler, geçmiş verilere dayanarak gelecekteki maaşları öngörmeyi amaçlar ve birçok paydaş için değerli içgörüler sunar.

Maaş Tahmininin İş Dünyasındaki Yeri

İnsan kaynakları departmanları, işe alım süreçlerinde adaylara adil teklifler sunmak için bu tür sistemlerden faydalanabilir. Aynı zamanda, mevcut çalışanların ücretlendirme yapılarını gözden geçirmek ve piyasa standartlarına uygun hale getirmek için de kullanılabilir. Bireyler ise kariyer geçişlerinde veya terfi görüşmelerinde pazarlık güçlerini artırmak amacıyla potansiyel kazançlarını öğrenmek isteyebilirler.

Sistemin Temel Bileşenleri

Bir maaş tahmin sistemi genellikle şu temel bileşenlerden oluşur:

  • Veri Toplama ve Ön İşleme: Tahmin modelini eğitmek için gerekli olan geçmiş maaş verilerinin toplanması ve temizlenmesi.
  • Makine Öğrenimi Modeli: Toplanan verilerden öğrenerek maaşları tahmin edebilen bir algoritma.
  • Grafiksel Kullanıcı Arayüzü (GUI): Kullanıcıların sisteme kolayca girdi sağlayıp tahminleri görüntüleyebileceği interaktif bir arayüz.

Bu Makalede Neler Öğreneceksiniz?

Bu makale boyunca, bir maaş tahmin sistemi oluşturmak için gerekli olan tüm adımları detaylı bir şekilde ele alacağız. Veri hazırlığından model seçimine, GUI geliştirmeden sistemin entegrasyonuna kadar her aşamayı pratik örneklerle açıklayacağız. Amaç, hem teorik bilgiyi pekiştirmek hem de kendi sisteminizi kurmanız için size yol göstermektir.

Veri Toplama, Temizleme ve Ön İşleme

Her makine öğrenimi projesinin temeli, kaliteli veridir. Maaş tahmin sistemi için de doğru ve temiz verilere sahip olmak, modelin başarısı için hayati öneme sahiptir.

Uygun Veri Kaynakları

Maaş verileri genellikle hassas olduğundan, kamuya açık ve güvenilir kaynaklardan veri toplamak önemlidir. Kaggle gibi platformlarda “Salary Prediction” veya “Job Salaries” gibi veri setleri bulunabilir. Bu veri setleri genellikle deneyim yılı, eğitim seviyesi, pozisyon, sektör, lokasyon gibi özellikleri içerir.

Eksik Veri Yönetimi ve Aykırı Değer Tespiti

Gerçek dünya verileri genellikle eksik değerler içerir. Bu değerleri ortalama, medyan ile doldurabilir veya ilgili satırları silebiliriz. Aykırı değerler (outliers) ise modelin genelleme yeteneğini olumsuz etkileyebilir. Kutup grafikleri (boxplot) veya Z-skoru gibi yöntemlerle aykırı değerler tespit edilip işlenebilir.


import pandas as pd
import numpy as np

# Örnek veri seti yükleme
df = pd.read_csv('salary_data.csv')

# Eksik değerleri medyan ile doldurma
for col in ['DeneyimYili', 'EgitimSeviyesi']:
    if df[col].isnull().any():
        df[col] = df[col].fillna(df[col].median())

# Aykırı değerleri tespit etme (örneğin, IQR yöntemi ile)
Q1 = df['Maas'].quantile(0.25)
Q3 = df['Maas'].quantile(0.75)
IQR = Q3 - Q1
alt_sinir = Q1 - 1.5 * IQR
ust_sinir = Q3 + 1.5 * IQR
df = df[(df['Maas'] >= alt_sinir) & (df['Maas'] <= ust_sinir)]

Kategorik Verilerin Dönüştürülmesi

Sektör, pozisyon, şehir gibi kategorik özellikler makine öğrenimi modelleri tarafından doğrudan anlaşılamaz. Bu verileri sayısal formata dönüştürmek için One-Hot Encoding veya Label Encoding gibi teknikler kullanılır. One-Hot Encoding, her kategori için yeni bir ikili (0/1) sütun oluşturur ve modelin kategoriler arasındaki ilişkileri daha iyi öğrenmesini sağlar.


# One-Hot Encoding uygulama
df = pd.get_dummies(df, columns=['Pozisyon', 'Sehir'], drop_first=True)

Veri Ölçeklendirme

Farklı ölçeklerdeki özellikler (örneğin, Deneyim Yılı ve Eğitim Seviyesi) bazı makine öğrenimi algoritmalarını olumsuz etkileyebilir. Özellikleri aynı ölçeğe getirmek için Min-Max Scaling veya Standard Scaling gibi yöntemler kullanılır. Bu, modelin daha hızlı ve doğru bir şekilde yakınsamasını sağlar.


from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df[['DeneyimYili', 'EgitimSeviyesi']] = scaler.fit_transform(df[['DeneyimYili', 'EgitimSeviyesi']])

Keşifçi Veri Analizi (EDA) ve Özellik Mühendisliği

Veriyi anlamak ve ondan yeni, anlamlı özellikler çıkarmak, modelin performansını önemli ölçüde artırabilir.

Veri Setini Anlamak

EDA, veri setindeki kalıpları, eğilimleri ve anormallikleri görsel ve istatistiksel yöntemlerle keşfetme sürecidir. .info(), .describe() gibi Pandas fonksiyonları ile veri setinin yapısı hakkında ilk bilgileri edinebiliriz.

Korelasyon Analizi

Özellikler arasındaki ilişkileri anlamak, hangi özelliklerin maaş tahmini için daha önemli olduğunu belirlememize yardımcı olur. Korelasyon matrisleri ve ısı haritaları (heatmap) bu analiz için sıkça kullanılır. Maaş ile yüksek korelasyona sahip özellikler, model için daha değerli olacaktır.


import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', fmt=".2f")
plt.title('Özellikler Arası Korelasyon Matrisi')
plt.show()

Yeni Özellikler Oluşturma

Mevcut özelliklerden yeni ve daha anlamlı özellikler türetmeye özellik mühendisliği denir. Örneğin, "Deneyim Yılı" ve "Eğitim Seviyesi"nden "Deneyim_Egitim_Etkilesimi" gibi bir özellik oluşturulabilir. Bu, modelin daha karmaşık ilişkileri yakalamasına yardımcı olabilir.


df['Deneyim_Egitim_Etkilesimi'] = df['DeneyimYili'] * df['EgitimSeviyesi']

Görselleştirmelerle İlişkileri Keşfetme

Dağılım grafikleri (scatterplot), çubuk grafikler (barplot) ve kutup grafikleri gibi görselleştirmeler, maaş ile diğer özellikler arasındaki ilişkileri net bir şekilde ortaya koyar. Örneğin, deneyim yılı arttıkça maaşın nasıl değiştiğini bir dağılım grafiği ile görebiliriz.

Makine Öğrenimi Modeli Seçimi ve Eğitimi

Maaş tahmini bir regresyon problemidir, yani sürekli bir değeri tahmin etmeye çalışırız. Bu nedenle, regresyon algoritmaları bu iş için uygundur.

Regresyon Modellerine Genel Bakış

Birçok regresyon algoritması mevcuttur:

  • Lineer Regresyon: Özellikler ve hedef değişken arasında doğrusal bir ilişki varsayar. Basit ve hızlıdır.
  • Karar Ağaçları: Veriyi belirli kurallara göre bölerek tahmin yapar. Yorumlanması kolaydır.
  • Rastgele Orman (Random Forest): Birden fazla karar ağacının bir araya gelmesiyle oluşur. Genellikle yüksek doğruluk sağlar ve aşırı uydurmaya karşı dayanıklıdır.
  • Gradient Boosting (XGBoost, LightGBM): Ardışık olarak zayıf modelleri eğiterek performansı artırır. Genellikle en yüksek doğrulukları sunar.

Model Seçimi: Lineer Regresyon, Karar Ağaçları, Rastgele Orman

Projenin karmaşıklığına ve veri setinin özelliklerine göre model seçimi yapılır. Genellikle Rastgele Orman Regresyonu, iyi bir başlangıç noktasıdır çünkü hem iyi performans gösterir hem de aşırı uydurmaya karşı nispeten dirençlidir.

Model Eğitimi ve Hiperparametre Ayarı

Seçilen model, ön işlenmiş veri seti üzerinde eğitilir. Modelin performansını optimize etmek için hiperparametre ayarı (örneğin, n_estimators, max_depth) Grid Search veya Random Search gibi yöntemlerle yapılabilir.


from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error, r2_score
import joblib

# Özellikler (X) ve Hedef (y) ayırma
X = df.drop('Maas', axis=1)
y = df['Maas']

# Eğitim ve test setlerine ayırma
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Rastgele Orman Regresyon modeli oluşturma ve eğitme
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# Modeli kaydetme
joblib.dump(model, 'salary_predictor_model.pkl')
joblib.dump(scaler, 'scaler.pkl') # Ölçekleyiciyi de kaydetmek önemli

Çapraz Doğrulama (Cross-Validation)

Modelin genelleme yeteneğini daha güvenilir bir şekilde değerlendirmek için çapraz doğrulama kullanılır. Bu yöntem, veri setini birden fazla eğitim ve test katmanına bölerek modelin farklı veri alt kümeleri üzerindeki performansını ölçer.

Model Değerlendirme ve Optimizasyon

Model eğitildikten sonra, performansını değerlendirmek ve gerekirse iyileştirmek önemlidir.

Performans Metrikleri (MAE, MSE, R²)

Regresyon modellerinin performansını ölçmek için çeşitli metrikler kullanılır:

  • Ortalama Mutlak Hata (MAE): Tahminler ile gerçek değerler arasındaki mutlak farkların ortalamasıdır. Daha küçük değerler daha iyi performansı gösterir.
  • Ortalama Kare Hata (MSE): Tahminler ile gerçek değerler arasındaki farkların karelerinin ortalamasıdır. Büyük hataları daha fazla cezalandırır.
  • R-kare (R²): Modelin bağımlı değişkendeki varyansın ne kadarını açıkladığını gösterir. 0 ile 1 arasında değişir; 1'e yakın değerler daha iyi uyumu gösterir.

# Test seti üzerinde tahmin yapma
y_pred = model.predict(X_test)

# Performans metriklerini hesaplama
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"Ortalama Mutlak Hata (MAE): {mae:.2f}")
print(f"R-kare (R²): {r2:.2f}")

Aşağıdaki tablo, farklı modellerin potansiyel performans metriklerini özetlemektedir:

Model Tipi MAE (Örnek) R² (Örnek) Açıklama
Lineer Regresyon 3500 0.70 Basit, hızlı, doğrusal ilişkiler için iyi.
Karar Ağacı 2800 0.82 Doğrusal olmayan ilişkileri yakalar, aşırı uydurmaya eğilimli olabilir.
Rastgele Orman 2200 0.88 Genellikle yüksek doğruluk, aşırı uydurmaya karşı dayanıklı.

Modelin Aşırı Uyumunu Engelleme

Aşırı uyum (overfitting), modelin eğitim verisini ezberlemesi ve yeni, görünmeyen verilere genelleme yapamaması durumudur. Çapraz doğrulama, düzenlileştirme (regularization) teknikleri ve daha fazla veri toplama gibi yöntemlerle aşırı uyum engellenebilir.

Modeli Kaydetme ve Yükleme

Eğitilmiş modeli ve kullanılan ölçekleyiciyi kaydetmek, her seferinde yeniden eğitmek yerine doğrudan GUI uygulamasına yükleyerek kullanmamızı sağlar. Bu, joblib veya pickle kütüphaneleri ile kolayca yapılabilir.

Grafiksel Kullanıcı Arayüzü (GUI) Geliştirme

Kullanıcıların makine öğrenimi modelimizle etkileşim kurmasını sağlayacak bir arayüz oluşturacağız. Python'da Tkinter veya PyQt gibi kütüphaneler bu iş için oldukça popülerdir.

GUI Kütüphanesi Seçimi (Tkinter veya PyQt)

  • Tkinter: Python'ın standart GUI kütüphanesidir. Kurulum gerektirmez, basit ve hızlı prototipleme için idealdir.
  • PyQt/PySide: Daha gelişmiş ve profesyonel görünümlü uygulamalar için tercih edilir. Daha fazla özellik ve esneklik sunar ancak kurulumu ve kullanımı biraz daha karmaşıktır.

Bu makalede basitliği nedeniyle Tkinter'ı kullanacağız.

Arayüz Tasarımı ve Bileşenler

Bir maaş tahmin uygulaması için temel GUI bileşenleri şunları içerebilir:

  • Girdi alanları (Entry widget) for deneyim yılı, eğitim seviyesi vb.
  • Açılır menüler (Combobox) for pozisyon, sektör, şehir.
  • Bir tahmin butonu (Button).
  • Tahmin sonucunu gösterecek bir metin alanı (Label).

Model Entegrasyonu ve Tahmin Fonksiyonu

GUI'deki tahmin butonuna tıklandığında, kullanıcının girdiği değerler alınacak, ön işleme tabi tutulacak ve eğitilmiş model kullanılarak bir tahmin yapılacaktır. Bu tahmin daha sonra GUI üzerinde gösterilecektir.


import tkinter as tk
from tkinter import ttk
import joblib
import pandas as pd
import numpy as np

# Modeli ve ölçekleyiciyi yükle
model = joblib.load('salary_predictor_model.pkl')
scaler = joblib.load('scaler.pkl')

# Örnek özellik isimleri (eğitimde kullanılanlarla aynı olmalı)
# Bu kısım, veri setinizdeki kolon isimlerine göre dinamik olarak oluşturulmalıdır.
# Örneğin: ['DeneyimYili', 'EgitimSeviyesi', 'Pozisyon_Veri Bilimci', 'Pozisyon_Yazılım Mühendisi', ...]
# Basitlik için burada örnek bir liste kullanıyoruz.
feature_names = ['DeneyimYili', 'EgitimSeviyesi', 'Pozisyon_Yazılım Mühendisi', 'Sehir_İstanbul'] # Örnek

def predict_salary():
    try:
        deneyim_yili = float(entry_deneyim.get())
        egitim_seviyesi = float(entry_egitim.get())
        pozisyon = combo_pozisyon.get()
        sehir = combo_sehir.get()

        # Kullanıcı girdilerini modelin beklediği formata dönüştür
        input_data = pd.DataFrame(np.zeros((1, len(feature_names))), columns=feature_names)
        input_data['DeneyimYili'] = deneyim_yili
        input_data['EgitimSeviyesi'] = egitim_seviyesi

        # Kategorik değerleri One-Hot Encoding'e uygun hale getir
        if f'Pozisyon_{pozisyon}' in feature_names:
            input_data[f'Pozisyon_{pozisyon}'] = 1
        if f'Sehir_{sehir}' in feature_names:
            input_data[f'Sehir_{sehir}'] = 1

        # Ölçeklendirme (sadece ölçeklenmesi gereken sütunlar)
        input_data[['DeneyimYili', 'EgitimSeviyesi']] = scaler.transform(input_data[['DeneyimYili', 'EgitimSeviyesi']])

        # Tahmin yap
        tahmin_maas = model.predict(input_data)[0]
        result_label.config(text=f"Tahmini Maaş: {tahmin_maas:.2f} TL")
    except ValueError:
        result_label.config(text="Lütfen geçerli sayısal değerler girin.")
    except Exception as e:
        result_label.config(text=f"Bir hata oluştu: {e}")

# Ana pencere oluşturma
root = tk.Tk()
root.title("Maaş Tahmin Sistemi")

# Girdi alanları
tk.Label(root, text="Deneyim Yılı:").grid(row=0, column=0, padx=10, pady=5, sticky="w")
entry_deneyim = tk.Entry(root)
entry_deneyim.grid(row=0, column=1, padx=10, pady=5)

tk.Label(root, text="Eğitim Seviyesi (1-5):").grid(row=1, column=0, padx=10, pady=5, sticky="w")
entry_egitim = tk.Entry(root)
entry_egitim.grid(row=1, column=1, padx=10, pady=5)

tk.Label(root, text="Pozisyon:").grid(row=2, column=0, padx=10, pady=5, sticky="w")
pozisyon_options = ["Veri Bilimci", "Yazılım Mühendisi", "Proje Yöneticisi"] # Veri setinizdeki pozisyonlar
combo_pozisyon = ttk.Combobox(root, values=pozisyon_options)
combo_pozisyon.grid(row=2, column=1, padx=10, pady=5)
combo_pozisyon.set(pozisyon_options[0])

tk.Label(root, text="Şehir:").grid(row=3, column=0, padx=10, pady=5, sticky="w")
sehir_options = ["İstanbul", "Ankara", "İzmir"] # Veri setinizdeki şehirler
combo_sehir = ttk.Combobox(root, values=sehir_options)
combo_sehir.grid(row=3, column=1, padx=10, pady=5)
combo_sehir.set(sehir_options[0])

# Tahmin butonu
predict_button = tk.Button(root, text="Maaşı Tahmin Et", command=predict_salary)
predict_button.grid(row=4, column=0, columnspan=2, pady=10)

# Sonuç etiketi
result_label = tk.Label(root, text="Tahmini Maaş: ", font=("Arial", 12, "bold"))
result_label.grid(row=5, column=0, columnspan=2, pady=10)

root.mainloop()

Kullanıcı Girdilerinin İşlenmesi

GUI'den alınan kullanıcı girdileri, modelin beklediği sayısal formata dönüştürülmelidir. Bu, kategorik veriler için One-Hot Encoding'in yeniden uygulanmasını ve sayısal veriler için ölçekleyicinin kullanılmasını gerektirir. Önemli olan, eğitim sırasında kullanılan aynı ön işleme adımlarının tahmin aşamasında da uygulanmasıdır.

Sistemin Bütünleştirilmesi ve Kullanımı

Tüm bileşenler hazır olduğunda, bunları bir araya getirerek işlevsel bir sistem oluşturabiliriz.

Python Proje Yapısı

Projenizi düzenli tutmak için aşağıdaki gibi bir klasör yapısı kullanabilirsiniz:

  • main.py (GUI kodunu içerir)
  • model.py (Model eğitimi ve kaydetme mantığını içerir, veya sadece model yükleme)
  • data/ (Veri setini içerir)
  • saved_models/ (Eğitilmiş modeli ve ölçekleyiciyi içerir)

GUI ve Model Arasındaki İletişim

main.py dosyasında, eğitilmiş modeli ve ölçekleyiciyi joblib.load() ile yükleyerek GUI'deki tahmin fonksiyonunda kullanırız. Bu sayede, kullanıcı arayüzü ile makine öğrenimi modeli arasında sorunsuz bir iletişim sağlanmış olur.

Uygulamanın Çalıştırılması

Tüm kodları bir araya getirdikten sonra, Python yorumlayıcısı ile main.py dosyasını çalıştırarak uygulamayı başlatabilirsiniz:


python main.py

Örnek Kullanım Senaryoları

Uygulamanız çalıştığında, farklı deneyim yılları, eğitim seviyeleri, pozisyonlar ve şehirler için maaş tahminleri alabilirsiniz. Bu, bir iş arayanın potansiyel kazançlarını anlamasına veya bir İK profesyonelinin adil bir teklif sunmasına yardımcı olabilir.

Sonuç

Bu makalede, Python kullanarak makine öğrenimi tabanlı bir maaş tahmin sistemi geliştirmenin tüm aşamalarını ele aldık. Veri toplama ve ön işleme, keşifçi veri analizi, model seçimi ve eğitimi, model değerlendirme ve son olarak grafiksel kullanıcı arayüzü oluşturma adımlarını detaylı bir şekilde inceledik. Bu tür sistemler, hem bireyler hem de kurumlar için bilinçli kararlar almalarına yardımcı olan güçlü araçlardır. Geliştirdiğiniz bu temel sistem, daha fazla veri, daha gelişmiş modeller ve daha zengin bir kullanıcı arayüzü ile kolayca genişletilebilir ve iyileştirilebilir.

SSS (Sıkça Sorulan Sorular)

1. Hangi veri kaynakları maaş tahmin sistemi için kullanılabilir?

Kaggle, Glassdoor, LinkedIn gibi platformlarda kamuya açık veri setleri bulunabilir. Şirket içi veriler de, gizlilik kurallarına uygun olarak kullanılabilir.

2. Hangi GUI kütüphanesi daha iyidir: Tkinter mı, PyQt mı?

Tkinter, basit ve hızlı prototipleme için idealdir, Python ile birlikte gelir ve kurulum gerektirmez. PyQt ise daha karmaşık, profesyonel görünümlü ve özellik açısından zengin uygulamalar için daha uygundur, ancak harici kurulum gerektirir.

3. Modelim neden doğru tahmin yapmıyor?

Modelin doğruluğu, veri kalitesine, veri setinin büyüklüğüne, özellik mühendisliğine ve seçilen algoritmanın uygunluğuna bağlıdır. Daha fazla ve daha temiz veri, daha iyi özellikler ve doğru model seçimi performansı artırabilir.

4. Sistemin doğruluğunu nasıl artırabilirim?

Daha fazla ve çeşitli veri toplayarak, daha gelişmiş özellik mühendisliği teknikleri uygulayarak (örneğin, etkileşim terimleri), farklı ve daha karmaşık makine öğrenimi modellerini (örneğin, XGBoost) deneyerek ve hiperparametre ayarını optimize ederek sistemin doğruluğunu artırabilirsiniz.

5. Maaş tahmin sistemleri etik sorunlar yaratır mı?

Evet, özellikle veri yanlılığı (bias) durumunda sistemler cinsiyet, ırk gibi hassas özelliklere dayalı ayrımcı tahminler yapabilir. Bu nedenle, veri setinin dengeli olduğundan emin olmak ve modelin adil çalıştığını doğrulamak önemlidir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version