Veri Biliminde Sentetik Veri Seti Oluşturma, Faydaları, Türleri ve Makine Öğrenmesindeki Uygulaması

Yiğit Şener
6 min readJun 20, 2020

--

Her yerde data var deniliyor ama bazen istediğimiz veri setine ulaşmak o kadar da kolay olmuyor. O zaman neden kendi datamızı kendimiz oluşturmayalım ki?

Veri bilimi dünyasında keşfedeceğimiz bir sürü araç gereç (algoritma vs.) bulunuyor. Özellikle makine öğrenmesi algoritması öğrenme sürecinde ya da algoritmanın geliştirilmesini istiyorsak o probleme özel data bulmamız gerekiyor. Ancak kendimiz sentetik data üreterek en azından aklımızdaki problemin çözümüne dair bir harita çıkarabiliriz. Sentetik data üretmenin Python’da bir çok yöntemi bulunmaktadır. Hiç kütüphane kullanmadan sadece Random fonksiyonu ve birkaç matematiksel işlem yardımı ile oluşturabilirsiniz. Bunun yanı sıra Numpy kütüphanesinden de yararlanıp istediğiniz boyutlarda Matrisler çıkabilirsiniz. Ama ben bu yazı da Sklearn kütüphanesine ait sentetik data oluşturma fonksiyonlarından bahsedeceğim.

Sentetik veri setleri kullanmanın faydaları:

  • Hızlı ve kolay bir şekilde oluşturulabilir.
  • Veri setindeki çıktıların bilinir ve anlaşılır olması tahminleme algoritmalarının karşılaştırılmasında kolaylık sağlar.
  • Değişkendirler, bu sayede her üretildiklerinde aynı problem üzerinde başka neticeler çıkartılabilir.
  • Görsel anlatım konusunda yaratıcı veri setleri oluşturulabilir.

Sklearn kütüphanesi ile aşağıdaki işlevlere sahip sentetik veri setleri oluşturulabilir.

  • Bağımlı ve bağımsız değişkenler (target & predictores) otomatik olarak belirlenir.
  • İstenilen ölçüde satır ve kolon sayısı verilebilir.
  • Regresyon, sınıflandırma ve kümeleme algoritmalarına özel etiketlenmiş veri setleri yaratılabilir.
  • Veri setine gürültü, hata, dengesiz dağılım gibi yapay manipülasyonlar parametrik olarak verilebilir.

Aşağıdaki bölümlerde makine öğrenmesi algoritma türlerine göre oluşturulabilecek veri setlerinden örnekler verilmiştir. Son bölümde ise oluşturulan veri seti üzerinde basit bir makine öğrenmesi uygulaması yapılmıştır.

Öncelikle örneklerin hepsinde kullanacağımız ortak kütüphaneleri kuralım.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Sınıflandırma (Classification) için Sentetik Veri Setleri

Sınıflandırma problemlerinde en az iki adet etiketlenmiş kategorik sonuçlar kullanılır. Sklearn’de sınıflandırma problemleri için blobs, moons ve circles olmak üzere üç farklı tipte veri seti yaratma imkanı sunmaktadır.

Gaussian dağılımına dayalı veri setleri için make_blabs() fonksiyonu kullanılır. Bu veri setleri ile doğrusal sınıflandırma problemleri üzerinde çalışılabilir. Ne kadar blobs (damla, leke) kullanılacağı belirtilebilir.

Aşağıda oluşturulan sentetik veride toplamda veri setinde 4 farklı sınıf oluşturularak çoklu sınıf (multi class) problemlerinin denenmesi için kullanılabilir.

# Blobs Veri seti
from sklearn.datasets import make_blobs

# x = Bağımsız Değişken, y = Bağımlı değişken
x, y = make_blobs(n_samples = 1000 # Satır sayısı
,centers = 4 # Etiket adet
,n_features=2) # Özellik sayısı

# Dataframe objesine dönüşüm
df = pd.DataFrame({"x1":x[:,0], "x2":x[:,1], "target":y})

# Örnek veri seti
print(df.head(3))

# Scatter plot ile görselleştirme
colors = {0:'red', 1:'blue', 2:'green', 3:"black"}
fig, ax = plt.subplots()
grouped = df.groupby('target')
for key, group in grouped:
group.plot(ax=ax, kind='scatter', x='x1', y='x2', label=key, color=colors[key])
plt.show()

Scatter plot ile üretilen sentetik verinin dağılımı aşağıdaki grafikte gösterilmiştir. Farklı renklerdeki nokta kümeleri bir sınıfı oluşturmaktadır.

İkili sınıflandırma problemleri için make_moons() fonksiyonu kullanılmaktadır. Sınıflara bağlı özelliklerin gürültü ve şekilleri kontrol edilebilir. Bu sentetik veri setinin kullanımı doğrusal olmayan sınıflandırma problemleri için uygundur.

from sklearn.datasets import make_moons

# 2 Boyutlu sınıflandırma veri seti
x, y = make_moons(n_samples=1000
,noise=0.1) # verideki gürültü

# Dataframe objesine dönüştürme
df = pd.DataFrame({"x1":x[:,0], "x2":x[:,1], "target":y})

# Scatter plot ile görselleştirme
colors = {0:'red', 1:'blue'}
fig, ax = plt.subplots()
grouped = df.groupby('target')
for key, group in grouped:
group.plot(ax=ax, kind='scatter', x='x1', y='x2', label=key, color=colors[key])
plt.show()

İkili sınıflandırmaya dair başka bir fonksiyon olan make_circle() merkezi daireler biçiminde oluşan veri setleri oluşturmamızı sağlar. Make_moons() fonksiyonu ile benzer parametreler kullanılabilir.

from sklearn.datasets import make_circles

# 2 Boyutlu sınıflandırma veri seti
x, y = make_circles(n_samples = 1000 # veri adedi
,noise = 0.1 # verideki gürültü
,factor = 0.5) #

# Dataframe objesine dönüştürme
df = pd.DataFrame({"x1":x[:,0], "x2":x[:,1], "target":y})

# Görselleştirme
colors = {0:'red', 1:'blue'}
fig, ax = plt.subplots()
grouped = df.groupby('target')
for key, group in grouped:
group.plot(ax=ax, kind='scatter', x='x1', y='x2', label=key, color=colors[key])
plt.show()

Regresyon için Sentetik Veri Setleri

Eğer çıktı (target) değeri sürekli bir değişken ise regresyon algoritmaları kullanılmaktadır.

Make_regression() fonksiyonu sayesinde aralarında doğrusal bir ilişkinin bulunduğu veri setleri oluşturulabilir. Bu fonksiyonun içerisinde yer alan parametreleri inceleyelim;

make_regression(
n_samples = 100 # Veri adedi
,n_features = 30 # değişken sayısı
,n_informative = 5 # açıklayıcı değişken sayısı
,n_targets = 1 # hedef (bağımlı) değişken sayısı
,bias = 0.0 # Doğrusal modeldeki yanlılık terimi
,effective_rank = None # etkili değişken sayısı verilir
,tail_strength = 0.5 # effective rank None değil ise değer verilebilir
,noise = 0.0 # gaussian dağılımının standart sapması
,shuffle = True # satır ya da sütunların karıştırılması
,coef = False # katsayı üretimi yapılacak mı?
,random_state = None # rasgele veri seçim
)

Girdi (x) ve çıktı (y) değerlerini yukarıdaki parametreler vasıtasıyla üretip aralarındaki doğrusal olan ilişki scatter plot üzerinden görülebilir.

from sklearn.datasets import make_regression

# 2 Boyutlu sınıflandırma veri seti
x, y, coef = make_regression(n_samples = 100
,n_features = 2
,n_informative = 2
,n_targets = 1
,bias = 0.1
,coef = True)

# Dataframe objesine dönüştürme
df = pd.DataFrame({"x1":x[:,0],"target":y})

# Görselleştirme
colors = {0:'red', 1:'blue'}
plt.scatter(df.x1,df.target)
plt.show()

# Katsayılar
print(coef)
# ÇIKTI
# [90.2766654 21.79184802]

Sentetik Veri Seti Üzerinden Regresyon Analizi

Regresyon analizi için sentetik veri seti aşağıdaki gibi yaratılmış ve ardından makine öğrenmesi modeli kurularak çıkan sonuçlar gözlemlenmiştir. Sentetik verinin mükemmel olmasını istemediğimiz için bias ve noise parametrelerini değiştirerek biraz hatalı olmasını sağladık.

from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics

# 2 Boyutlu sınıflandırma veri seti
x, y = make_regression(n_samples = 100
,n_features = 1
,n_informative = 1
,n_targets = 1
,bias = 0.9
,noise = 2.5)
# Veri kümesini test ve train olarak ayrılması
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=0)

# modelleme
lr = LinearRegression()
lr.fit(x_train,y_train)

# Modelin değerlendirilmesi
print("coefficients ",lr.coef_)
print("intercept",lr.intercept_)
print("r2 score",metrics.r2_score(lr.predict(x_test),y_test))
print('(MSE) Mean Squared Error:', metrics.mean_squared_error(lr.predict(x_test),y_test))
print('(RMSE) Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(lr.predict(x_test),y_test)))

# ÇIKTI
# coefficients [7.66691413]
# intercept 0.4761857397943307
# r2 score 0.7171026666053839
# (MSE) Mean Squared Error: 9.442312999316197
# (RMSE) Root Mean Squared Error: 3.072834684670849

Yukarıda yer alan model sonuçlarının değerlendirildiği çıktıların anlamlarını öğrenmek için aşağıdaki yazıma göz atabilirsiniz. En basit hali ile değerlendirdiğimiz de R2 (0.71) sonucunun istatistiksel olarak modelin doğruluk oranının pozitif yönde güçlü olduğunu göstermektedir.

Modelden çıkan regresyon doğrusunu scatter plot üzerinden gösterimi:

plt.scatter(x, y)
plt.plot(x, lr.predict(x), color='red')
plt.show()

Sonuç

Sentetik veriler ile algoritma alıştırmaları uygulamak son derece konforlu bir ortam sunmaktadır. Bunun yanında gerçek veriler üzerinden alıştırma yapmanın verdiği zorlukları da bize yansıtmamış oluyor. Ancak tabi ki gerçek hayatta verilerimiz bu denli düzenli dağılan ve şık duran matrisler halinde gelmeyeceği de bilinmelidir. Veriyi modele hazır hale getirmek ayrı veriyi modellemek ayrı süreçlerdir. En azından sentetik veri ile modelle kısmında pratikler yapabilirsiniz.

--

--