Makine öğrenimi konusunda henüz çalışmalara başlamamış kişilerin en genel yanılgılarından biri, öğrenim sonucundaki tahminlerin ya da aksiyonların doğruluk oranıdır. Tıpkı her olayın %100 doğruluk (genellikle bunu standart sapma ile hesaplarız) durumu olamayacağı gibi, makine öğrenimi algoritmaları da çoğunlukla bir hata payı ortaya çıkarır. Yani makine öğrenmesinde hata payı her zaman vardır.
Aşağıda var olan basit programı, bu hata payı durumunu gösterebilmesi adına Python dili kullanarak oluşturdum. Programın temel amacı kullanıcıdan almış olduğu “Veri Seti Uzunluğu” değeri (örneğin X olsun) ile veri seti içerisinde kaç tane değer olması gerektiğini belirledikten sonra, X kadar rastgele sayı üretmeyi sağlıyor. Üretilen değerler daha sonrasında “Simple Linear Regression” modelinde kullanılmak üzere test seti ve eğitim seti olarak %20 lik bir bölümlemeyle birbirinden ayrılıyor.
import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression # Kullanıcıdan veri seti uzunluğunu alalım veri_seti_uzunlugu = int(input("Veri seti uzunluğunu girin: ")) # Random veri seti oluşturalım np.random.seed(1) # Rastgele verilerin tekrarlanabilirliği için X = np.random.rand(veri_seti_uzunlugu, 1) * 10 # Bağımsız değişken (0 ile 10 arasında rastgele değerler) y = 2 * X + 3 + np.random.randn(veri_seti_uzunlugu, 1) # Bağımlı değişken (doğrusal ilişki + gürültü) # Veriyi train ve test setlerine bölelim X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Yukarıda var olan kodda array operasyonlarını kontrol edebilmek için “Numpy” kütüphanesini kullanıyoruz. Çıktı olarak görmek istediğimiz grafikleri çizdirebilmek için ise “Matplotlib” kütüphanesini dahil ediyoruz. “Sklearn” kütüphanesinden test setini ve eğitim setini birbirinden ayırmak için gerekli olan “train_test_split” fonksiyonunu ve modelimizin kendisi olan “LinearRegression” kütüphanelerini de içe aktarıyoruz. Ayrıca bu oluşturulacak rastgele veri setinde kaç değer olacağını da kullanıcıdan aldığımız bir satırı eklemiş bulunuyoruz.
Burada ise “np.random.seed(1)” fonksiyonu ile üretecek olduğumuz array elemanlarının her zaman aynı olmasını belirtiyoruz. Bu sayede 50 adet değer ürettiğimizde ya da 100 adet değer ürettiğimizde her zaman program ilk X adeti bir sonraki daha büyük adet sayısına kadar aynı şekilde üretecek. Bu sayede program içerisindeki veri tutarlılığını artırmayı amaçlıyoruz.
np.random.seed(1)
Bir sonraki adım verileri oluşturmak. Basitlik açısından veri aralığımızı 0 ile 10 arasında tutuyoruz. Aynı zamanda veri içerisinde var olacak karşılık değerlerini ise 2X+3 ile belirleyerek farklı değerlere referans verebiliyoruz. Sonrasında modelimizi test setine ve eğitim setine ayırıp, eğitim sürecini gerçekleştiriyoruz.
model = LinearRegression() model.fit(X_train, y_train)
Buradaki adımda ise yapmış olduğumuz test ve eğitim sonuçlarını koordinat sisteminde gösterecek olduğumuz grafik çizimi için tanımladığımız kütüphaneyi kullanıyoruz. Bu nokta “Matplotlib” kütüphanesine çok atıf yapmayı gerektireceğinden bu kısmı es geçmeyi tercih ediyorum. Ancak genel amaç X ve y olarak tanımlanan değerleri test setindeki ve eğitim setindeki noktalarında göstermek.
plt.scatter(X_train, y_train, color='blue', label='Eğitim Verileri') plt.scatter(X_test, y_test, color='green', label='Test Verileri') plt.plot(X, model.predict(X), color='red', linewidth=2, label='Regresyon Doğrusu') plt.xlabel('Bağımsız Değişken') plt.ylabel('Bağımlı Değişken') plt.legend() plt.title('Simple Linear Regression')
Bu kısımdan sonra ise kullanıcıdan aldığımız değerin tahmin kısmına ilerliyoruz. Kullanıcıdan tahmin edilmesini istediği değeri aldıktan sonra eğitilmiş modelimizin “predict” fonksiyonunu kullanarak girilen değer tahminin yapıyoruz.
girdi_degeri = float(input("Tahmin etmek istediğiniz girdi değerini girin: ")) # Kullanıcının girdisi üzerinden tahmin yapalım tahmin = model.predict([[girdi_degeri]])
Son kısımda ise “Yüzdesel hata payı” hesaplama fonksiyonu oluşturarak yüzdelik anlamda ne kadar tahmin hatası yaptığımız değerini, tahmin edilen değeri ve gerçek değeri ekrana yazdırıyoruz.
gercek_deger = 2 * girdi_degeri + 3 percentage_error = (np.abs(tahmin - gercek_deger) / gercek_deger) * 100 print("Tahmin Edilen Değer:", tahmin[0][0]) print("Gerçek Değer:", gercek_deger) print("Yüzde Hata (Percentage Error):", percentage_error) plt.annotate(f'Tahmin: {tahmin[0][0]:.2f}', xy=(girdi_degeri, tahmin[0][0]), xytext=(girdi_degeri, tahmin[0][0] + 5), arrowprops=dict(arrowstyle='->', color='green')) plt.show()
Sonuç olarak girilen 4 farklı veri sayısı için yapılan tahminlerin ekran görüntüleri aşağıda sıralanmakta. Buradan da görüleceği üzere, veri setinin uzunluğundan bağımsız olarak her zaman bir hata payına sahip oluyoruz. Bununla birlikte, veri setinin büyüklüğü daha doğru bir sonuç üretir tezi, üçüncü ve dördüncü fotoğrafta görüleceği üzere 50.000 veri ile 100.000 veri arasındaki hata payından kolaylıkla yanlışlanmış oluyor.
Sonuçlar ise sırası ile:
Veri Sayısı | Gerçek Değer | Tahmin Edilen Değer | Hata Payı |
50 | 13 | 13.207 | %1.59 |
1.000 | 13 | 13.04 | %0.31 |
50.000 | 13 | 12.996 | %0.026 |
100.000 | 13 | 13.006 | %0.049 |
Ve kodun tamamı
# Gerekli kütüphaneleri içe aktaralım import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression # Kullanıcıdan veri seti uzunluğunu alalım veri_seti_uzunlugu = int(input("Veri seti uzunluğunu girin: ")) # Random veri seti oluşturalım np.random.seed(1) # Rastgele verilerin tekrarlanabilirliği için X = np.random.rand(veri_seti_uzunlugu, 1) * 10 # Bağımsız değişken (0 ile 10 arasında rastgele değerler) y = 2 * X + 3 + np.random.randn(veri_seti_uzunlugu, 1) # Bağımlı değişken (doğrusal ilişki + gürültü) # Veriyi train ve test setlerine bölelim X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Simple Linear Regression modelini oluşturalım ve eğitelim model = LinearRegression() model.fit(X_train, y_train) # Modelin tahminlerini ve gerçek verileri çizelim plt.scatter(X_train, y_train, color='blue', label='Eğitim Verileri') plt.scatter(X_test, y_test, color='green', label='Test Verileri') plt.plot(X, model.predict(X), color='red', linewidth=2, label='Regresyon Doğrusu') plt.xlabel('Bağımsız Değişken') plt.ylabel('Bağımlı Değişken') plt.legend() plt.title('Simple Linear Regression') # Kullanıcıdan tahmin etmek istediği girdi değerini alalım girdi_degeri = float(input("Tahmin etmek istediğiniz girdi değerini girin: ")) # Kullanıcının girdisi üzerinden tahmin yapalım tahmin = model.predict([[girdi_degeri]]) # Yüzde Hata (Percentage Error) hesaplayalım gercek_deger = 2 * girdi_degeri + 3 percentage_error = (np.abs(tahmin - gercek_deger) / gercek_deger) * 100 print("Tahmin Edilen Değer:", tahmin[0][0]) print("Gerçek Değer:", gercek_deger) print("Yüzde Hata (Percentage Error):", percentage_error) # Tahmin sonucunu yazdıralım plt.annotate(f'Tahmin: {tahmin[0][0]:.2f}', xy=(girdi_degeri, tahmin[0][0]), xytext=(girdi_degeri, tahmin[0][0] + 5), arrowprops=dict(arrowstyle='->', color='green')) plt.show()