Önceki iki yazıda, makine öğrenimi hattında verileri ön işlemenin rolünü inceledim. Özellikle, en Yakın K Komşu (k-NN) ve lojistik regresyon algoritmalarına baktım ve sayısal verilerin ölçeklenmesinin, örneğin doğrulukla ölçüldüğünde (ölçekleme, k-NN ve diğer ilgili terimlerin tanımları için aşağıdaki Sözlük bölümüne veya önceki yazılara bakın), ilkinde performansı güçlü biçimde etkilediğini, ikincisinde ise etkilemediğini gördüm. Buradaki asıl çıkarım, ön işlemenin bir vakumda gerçekleşmediğidir; yani verinizi dilediğiniz kadar ön işleyebilirsiniz ama esas olan şu: modeliniz sonrasında ne kadar iyi performans gösteriyor?
Sayısal verileri ölçeklemenin (yani bir değişkenin tüm örneklerini, aralığını değiştirmek için bir sabitle çarpmak) iki ilişkili amacı vardır: i) Ölçümleriniz metre, benimkiler mil cinsindeyse ve ikimiz de verilerimizi ölçeklersek, sonuçta aynı ölçekte buluşuruz & ii) İki değişkenin aralıkları çok farklıysa, aralığı daha geniş olan değişken hedef değişkeniniz açısından daha az önemli olsa bile öngörücü modelinizde baskın hale gelebilir. Gördüğümüz üzere, ii) maddesinde tanımlanan bu sorun, verilerin birbirine ne kadar yakın olduğuna açıkça bakan k-NN’de ortaya çıkarken, eğitim sırasında ilgili katsayıyı küçülterek ölçek eksikliğini telafi edebilen lojistik regresyonda görülmez.
Önceki yazılarda kullandığımız veriler gerçek dünya verileri olduğundan, yalnızca modellerin ölçekleme öncesi ve sonrası performanslarını görebildik. Burada, gürültünün rahatsızlık değişkenleri (hedef değişkeni etkilemeyen ancak modelinizi etkileyebilecek değişkenler) biçiminde hem ölçekleme öncesinde hem de sonrasında model performansını nasıl değiştirdiğini görmek için, rahatsızlık değişkeninin niteliğini tam olarak kontrol edebileceğim bir veri kümesi sentezleyeceğim. Göreceğiz ki sentezlenmiş veri ne kadar gürültülü olursa, k-NN için ölçekleme o kadar önemli hale geliyor. Buradaki tüm örnekler Python ile. Python’a aşina değilseniz, DataCamp kurslarımıza buradan göz atabilirsiniz. pandas kütüphanesini DataFrame ihtiyaçlarımız için, scikit-learn kütüphanesini ise makine öğrenimi ihtiyaçlarımız için kullanacağım.
Aşağıdaki kod bloğunda, scikit-learn’ün make_blobs fonksiyonunu kullanarak 4 kümede yer alan 2000 veri noktası üretiyoruz (her veri noktasının 2 öngördürücü değişkeni ve 1 hedef değişkeni var).
# Generate some clustered data (blobs!)import numpy as np
from sklearn.datasets.samples_generator import make_blobs
n_samples=2000
X, y = make_blobs(n_samples, centers=4, n_features=2,
random_state=0)Altyapı:
Sentezlenmiş veriyi görselleştirme
Şimdi sentezlediğimiz veriyi düzlemde çizelim. Her eksen bir öngördürücü değişkeni, renk ise hedef değişkene ilişkin anahtarı gösteriyor:
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')
plt.figure(figsize=(20,5));
plt.subplot(1,2,1);
plt.scatter(X[:,0], X[:,1], c = y, alpha =0.7);
plt.subplot(1,2,2);
plt.hist(y)
plt.show()Altyapı:
Not: 2. grafikte tüm olası hedef değişkenlerin eşit biçimde temsil edildiğini görüyoruz. Bu durumda (ya da yaklaşık olarak eşit temsil edildiklerinde), y sınıfının dengeli olduğunu söyleriz.
Şimdi de özelliklerin (öngördürücü değişkenlerin) histogramlarını çizmek istiyorum:
import pandas as pd
df = pd.DataFrame(X)
pd.DataFrame.hist(df, figsize=(20,5));Altyapı:
Şimdi test ve eğitim setlerine ayıralım ve her iki seti de çizelim:
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
plt.figure(figsize=(20,5));
plt.subplot(1,2,1);
plt.title('training set')
plt.scatter(X_train[:,0], X_train[:,1], c = y_train, alpha =0.7);
plt.subplot(1,2,2);
plt.scatter(X_test[:,0], X_test[:,1], c = y_test, alpha =0.7);
plt.title('test set')
plt.show()Altyapı:
Güzel görünüyor! Şimdi bir en Yakın K Komşu oylama sınıflandırıcısı başlatalım ve eğitim setimiz üzerinde eğitelim:
Tekrarlamakta fayda var: scikit-learn’de k-NN için varsayılan puanlama yöntemi doğruluktur. Başka pek çok metriğe bakmak için scikit-learn’ün sınıflandırma raporunu da kullanabiliriz:
from sklearn.metrics import classification_report
y_true, y_pred = y_test, knn_model.predict(X_test)print(classification_report(y_true, y_pred))Altyapı:
precision recall f1-score support
00.870.900.8810610.980.930.9510220.900.920.9110031.001.001.0092
avg / total 0.940.940.94400Altyapı:
Şimdi ölçekleme ile
Şimdi öngördürücü değişkenleri ölçekleyip tekrar k-NN kullanacağım:
from sklearn.preprocessing import scale
Xs = scale(X)
Xs_train, Xs_test, y_train, y_test = train_test_split(Xs, y, test_size=0.2, random_state=42)
plt.figure(figsize=(20,5));
plt.subplot(1,2,1);
plt.scatter(Xs_train[:,0], Xs_train[:,1], c = y_train, alpha =0.7);
plt.title('scaled training set')
plt.subplot(1,2,2);
plt.scatter(Xs_test[:,0], Xs_test[:,1], c = y_test, alpha =0.7);
plt.title('scaled test set')
plt.show()Altyapı:
knn_model_s = knn.fit(Xs_train, y_train)print('k-NN score for test set: %f'% knn_model_s.score(Xs_test, y_test))Altyapı:
Ölçekleme ile daha iyi performans göstermiyor! Bunun muhtemel nedeni, her iki özelliğin de zaten benzer aralıklarda olması. Değişkenlerin aralıkları çok farklı olduğunda ölçekleme yapmak gerçek anlam kazanır. Bunu göstermek için bir özellik daha ekleyeceğiz. Dahası, bu özellik hedef değişkenle hiçbir ilişkisi olmayacak: saf gürültü olacak.
Sinyale gürültü ekleme:
Ortalamasi 0 ve değişken standart sapması \(\sigma\) olan üçüncü bir Gauss gürültüsü değişkeni ekliyoruz. \(\sigma\)’yı gürültünün gücü olarak adlandıracağız ve gürültü güçlendikçe en Yakın K Komşuların performansının kötüleştiğini göreceğiz.
# Add noise column to predictor variables
ns =10**(3)# Strength of noise term
newcol = np.transpose([ns*np.random.randn(n_samples)])
Xn = np.concatenate((X, newcol), axis =1)Altyapı:
Şimdi 3B veriyi çizmek için mplot3d paketini kullanacağız:
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(15,10));
ax = fig.add_subplot(111, projection='3d', alpha =0.5);
ax.scatter(Xn[:,0], Xn[:,1], Xn[:,2], c = y);Altyapı:
Şimdi modelimizin yeni verilerde nasıl performans gösterdiğine bakalım:
Xn_train, Xn_test, y_train, y_test = train_test_split(Xn, y, test_size=0.2, random_state=42)
knn = neighbors.KNeighborsClassifier()
knn_model = knn.fit(Xn_train, y_train)print('k-NN score for test set: %f'% knn_model.score(Xn_test, y_test))Altyapı:
k-NN score for test set: 0.400000
Bu berbat bir model! Ölçekleyip performansa bakalım mı?
Harika, verileri ölçekledikten sonra model, gürültü hiç eklenmemiş gibi neredeyse aynı performansı gösteriyor. Şimdi model performansını gürültü gücünün bir fonksiyonu olarak inceleyelim.
Gürültü güçlendikçe sorun büyüyor:
Şimdi gürültü gücünün model doğruluğunu nasıl etkilediğini göreceğiz. Aynı kodu birkaç kez kullanmamız gerekeceğinden, ana kısımları küçük bir fonksiyonda toparlayalım:
Yukarıdaki şekilde görebileceğiniz gibi, rahatsızlık değişkenindeki gürültü arttıkça k-NN modeli için verinizi ölçeklemek daha da önemli hale geliyor! Aşağıda aynı işlemi lojistik regresyon için de yapma fırsatınız olacak. Sonuç olarak, veri bilimi hattında ön işlemenin, özellikle ölçekleme ve merkezleme biçiminde, ne kadar temel bir yere sahip olduğunu gördük ve bunu makine öğreniminin zorluklarına bütüncül bir yaklaşıma katkı sağlamak için yaptık. İlerideki yazılarda, sayısal veri dönüşümleri ve kategorik verilerin ön işlemesi gibi diğer ön işleme türlerine de değinmeyi umuyorum; bunların ikisi de her veri bilimcisinin araç kutusunun vazgeçilmez parçalarıdır.
Meraklı okur için egzersiz: Yukarıdaki sentezlenmiş veri kümelerine bir lojistik regresyon modeli uydurmayı deneyin ve model performansına bakın. Doğruluk, sırasıyla ölçeklenmiş ve ölçeklenmemiş veriler için gürültü gücünün bir fonksiyonu olarak nasıl değişiyor? Bunu aşağıdaki DataCamp Light bileşeniyle yapabilirsiniz! Gürültü miktarını değiştirmek için 10’un üssünü değiştirin (önce k-NN için yukarıda denediğim aralığı deneyin) ve özelliklerinizi ölçeklemek istiyorsanız sc = True olarak ayarlayın. Ayrıca Github’da DataCamp Light’a da göz atabilirsiniz!
# Below, change the exponent of 10 to alter the amount of noise
ns = 10**(3) # Strength of noise term
# Set sc = True if you want to scale your features
sc = False
#Import packages
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn import neighbors, linear_model
from sklearn.preprocessing import scale
from sklearn.datasets.samples_generator import make_blobs
#Generate some data
n_samples=2000
X, y = make_blobs(n_samples, centers=4, n_features=2,
random_state=0)
# Add noise column to predictor variables
newcol = np.transpose([ns*np.random.randn(n_samples)])
Xn = np.concatenate((X, newcol), axis = 1)
#Scale if desired
if sc == True:
Xn = scale(Xn)
#Train model and test after splitting
Xn_train, Xn_test, y_train, y_test = train_test_split(Xn, y, test_size=0.2, random_state=42)
lr = linear_model.LogisticRegression()
lr_model = lr.fit(Xn_train, y_train)
print('logistic regression score for test set: %f' % lr_model.score(Xn_test, y_test))
Sözlük
Denetimli öğrenme:Hedef değişkeninöngördürücü değişkenlerden çıkarılması görevi. Örneğin, hedef değişken olarak ‘kalp hastalığı varlığı’nın; ‘yaş’, ‘cinsiyet’ ve ‘sigara içme durumu’ gibi öngördürücü değişkenlerden çıkarılması.
Sınıflandırma görevi: Eğer hedef değişken kategorilerden oluşuyorsa (ör. ‘tıklama’ veya ‘tıklama yok’, ‘malign’ veya ‘benign’ tümör), bir denetimli öğrenme görevi sınıflandırma görevidir.
Regresyon görevi: Eğer hedef değişken sürekli değişen bir değişkense (ör. bir evin fiyatı) ya da ‘şarap kalite puanı’ gibi sıralı kategorik bir değişkense, bir denetimli öğrenme görevi regresyon görevidir.
en Yakın K Komşu: Bir veri noktasına, en yakın k komşusunun çoğunluk oyuyla belirlenen etiketin atandığı sınıflandırma görevleri için bir algoritma.
Ön işleme: Veri bilimcilerin, verilerini yapmak istedikleri işlem için daha uygun bir biçime getirmek amacıyla kullanacakları çok sayıda işlem. Örneğin, Twitter verilerinin duygu analizi yapılmadan önce, HTML etiketlerini ve boşlukları temizlemek, kısaltmaları açmak ve tweet’leri içerdiği sözcüklerin listelerine bölmek isteyebilirsiniz.
Merkezleme ve Ölçekleme: Her ikisi de sayısal verilerin (örneğin kategoriler veya dizeler yerine sayılardan oluşan veriler) ön işlemesinin biçimleridir; bir değişkeni merkezlemek, yeni değişkenin ortalaması 0 olacak şekilde her veri noktasından o değişkenin ortalamasını çıkarmaktır; bir değişkeni ölçeklemek ise verinin aralığını değiştirmek için her veri noktasını bir sabitle çarpmaktır. Önemleri ve örnekler için yazının gövdesine bakın.
Bu makale bir Jupyter defterinden üretildi. Defteri buradan indirebilirsiniz.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Önceki iki yazıda, makine öğrenimi hattında verileri ön işlemenin rolünü inceledim. Özellikle, en Yakın K Komşu (k-NN) ve lojistik regresyon algoritmalarına baktım ve sayısal verilerin ölçeklenmesinin, örneğin doğrulukla ölçüldüğünde (ölçekleme, k-NN ve diğer ilgili terimlerin tanımları için aşağıdaki Sözlük bölümüne veya önceki yazılara bakın), ilkinde performansı güçlü biçimde etkilediğini, ikincisinde ise etkilemediğini gördüm. Buradaki asıl çıkarım, ön işlemenin bir vakumda gerçekleşmediğidir; yani verinizi dilediğiniz kadar ön işleyebilirsiniz ama esas olan şu: modeliniz sonrasında ne kadar iyi performans gösteriyor?
Sayısal verileri ölçeklemenin (yani bir değişkenin tüm örneklerini, aralığını değiştirmek için bir sabitle çarpmak) iki ilişkili amacı vardır: i) Ölçümleriniz metre, benimkiler mil cinsindeyse ve ikimiz de verilerimizi ölçeklersek, sonuçta aynı ölçekte buluşuruz & ii) İki değişkenin aralıkları çok farklıysa, aralığı daha geniş olan değişken hedef değişkeniniz açısından daha az önemli olsa bile öngörücü modelinizde baskın hale gelebilir. Gördüğümüz üzere, ii) maddesinde tanımlanan bu sorun, verilerin birbirine ne kadar yakın olduğuna açıkça bakan k-NN’de ortaya çıkarken, eğitim sırasında ilgili katsayıyı küçülterek ölçek eksikliğini telafi edebilen lojistik regresyonda görülmez.
Önceki yazılarda kullandığımız veriler gerçek dünya verileri olduğundan, yalnızca modellerin ölçekleme öncesi ve sonrası performanslarını görebildik. Burada, gürültünün rahatsızlık değişkenleri (hedef değişkeni etkilemeyen ancak modelinizi etkileyebilecek değişkenler) biçiminde hem ölçekleme öncesinde hem de sonrasında model performansını nasıl değiştirdiğini görmek için, rahatsızlık değişkeninin niteliğini tam olarak kontrol edebileceğim bir veri kümesi sentezleyeceğim. Göreceğiz ki sentezlenmiş veri ne kadar gürültülü olursa, k-NN için ölçekleme o kadar önemli hale geliyor. Buradaki tüm örnekler Python ile. Python’a aşina değilseniz, DataCamp kurslarımıza buradan göz atabilirsiniz. pandas kütüphanesini DataFrame ihtiyaçlarımız için, scikit-learn kütüphanesini ise makine öğrenimi ihtiyaçlarımız için kullanacağım.
Aşağıdaki kod bloğunda, scikit-learn’ün make_blobs fonksiyonunu kullanarak 4 kümede yer alan 2000 veri noktası üretiyoruz (her veri noktasının 2 öngördürücü değişkeni ve 1 hedef değişkeni var).
Sentezlenmiş veriyi görselleştirme
Şimdi sentezlediğimiz veriyi düzlemde çizelim. Her eksen bir öngördürücü değişkeni, renk ise hedef değişkene ilişkin anahtarı gösteriyor:
Not: 2. grafikte tüm olası hedef değişkenlerin eşit biçimde temsil edildiğini görüyoruz. Bu durumda (ya da yaklaşık olarak eşit temsil edildiklerinde), y sınıfının dengeli olduğunu söyleriz.
Şimdi de özelliklerin (öngördürücü değişkenlerin) histogramlarını çizmek istiyorum:
Şimdi test ve eğitim setlerine ayıralım ve her iki seti de çizelim:
Güzel görünüyor! Şimdi bir en Yakın K Komşu oylama sınıflandırıcısı başlatalım ve eğitim setimiz üzerinde eğitelim:
Modelimizi eğittiğimize göre, şimdi test setimize uygulayıp doğruluğu hesaplayabiliriz:
Ayrıca eğitim setimize yeniden uygulayıp doğruluğu hesaplayabiliriz. Eğitim setinde test setine kıyasla daha iyi performans bekleriz:
Tekrarlamakta fayda var: scikit-learn’de k-NN için varsayılan puanlama yöntemi doğruluktur. Başka pek çok metriğe bakmak için scikit-learn’ün sınıflandırma raporunu da kullanabiliriz:
Şimdi ölçekleme ile
Şimdi öngördürücü değişkenleri ölçekleyip tekrar k-NN kullanacağım:
Ölçekleme ile daha iyi performans göstermiyor! Bunun muhtemel nedeni, her iki özelliğin de zaten benzer aralıklarda olması. Değişkenlerin aralıkları çok farklı olduğunda ölçekleme yapmak gerçek anlam kazanır. Bunu göstermek için bir özellik daha ekleyeceğiz. Dahası, bu özellik hedef değişkenle hiçbir ilişkisi olmayacak: saf gürültü olacak.
Sinyale gürültü ekleme:
Ortalamasi 0 ve değişken standart sapması \(\sigma\) olan üçüncü bir Gauss gürültüsü değişkeni ekliyoruz. \(\sigma\)’yı gürültünün gücü olarak adlandıracağız ve gürültü güçlendikçe en Yakın K Komşuların performansının kötüleştiğini göreceğiz.
Şimdi 3B veriyi çizmek için mplot3d paketini kullanacağız:
Şimdi modelimizin yeni verilerde nasıl performans gösterdiğine bakalım:
k-NN score for test set: 0.400000Bu berbat bir model! Ölçekleyip performansa bakalım mı?
Harika, verileri ölçekledikten sonra model, gürültü hiç eklenmemiş gibi neredeyse aynı performansı gösteriyor. Şimdi model performansını gürültü gücünün bir fonksiyonu olarak inceleyelim.
Gürültü güçlendikçe sorun büyüyor:
Şimdi gürültü gücünün model doğruluğunu nasıl etkilediğini göreceğiz. Aynı kodu birkaç kez kullanmamız gerekeceğinden, ana kısımları küçük bir fonksiyonda toparlayalım:
Şimdi doğruluğu gürültü gücünün bir fonksiyonu olarak çiziyoruz (log x eksenine dikkat):
Yukarıdaki şekilde görebileceğiniz gibi, rahatsızlık değişkenindeki gürültü arttıkça k-NN modeli için verinizi ölçeklemek daha da önemli hale geliyor! Aşağıda aynı işlemi lojistik regresyon için de yapma fırsatınız olacak. Sonuç olarak, veri bilimi hattında ön işlemenin, özellikle ölçekleme ve merkezleme biçiminde, ne kadar temel bir yere sahip olduğunu gördük ve bunu makine öğreniminin zorluklarına bütüncül bir yaklaşıma katkı sağlamak için yaptık. İlerideki yazılarda, sayısal veri dönüşümleri ve kategorik verilerin ön işlemesi gibi diğer ön işleme türlerine de değinmeyi umuyorum; bunların ikisi de her veri bilimcisinin araç kutusunun vazgeçilmez parçalarıdır.
Meraklı okur için egzersiz: Yukarıdaki sentezlenmiş veri kümelerine bir lojistik regresyon modeli uydurmayı deneyin ve model performansına bakın. Doğruluk, sırasıyla ölçeklenmiş ve ölçeklenmemiş veriler için gürültü gücünün bir fonksiyonu olarak nasıl değişiyor? Bunu aşağıdaki DataCamp Light bileşeniyle yapabilirsiniz! Gürültü miktarını değiştirmek için 10’un üssünü değiştirin (önce k-NN için yukarıda denediğim aralığı deneyin) ve özelliklerinizi ölçeklemek istiyorsanız sc = True olarak ayarlayın. Ayrıca Github’da DataCamp Light’a da göz atabilirsiniz!
Sözlük
Denetimli öğrenme: Hedef değişkenin öngördürücü değişkenlerden çıkarılması görevi. Örneğin, hedef değişken olarak ‘kalp hastalığı varlığı’nın; ‘yaş’, ‘cinsiyet’ ve ‘sigara içme durumu’ gibi öngördürücü değişkenlerden çıkarılması.
Sınıflandırma görevi: Eğer hedef değişken kategorilerden oluşuyorsa (ör. ‘tıklama’ veya ‘tıklama yok’, ‘malign’ veya ‘benign’ tümör), bir denetimli öğrenme görevi sınıflandırma görevidir.
Regresyon görevi: Eğer hedef değişken sürekli değişen bir değişkense (ör. bir evin fiyatı) ya da ‘şarap kalite puanı’ gibi sıralı kategorik bir değişkense, bir denetimli öğrenme görevi regresyon görevidir.
en Yakın K Komşu: Bir veri noktasına, en yakın k komşusunun çoğunluk oyuyla belirlenen etiketin atandığı sınıflandırma görevleri için bir algoritma.
Ön işleme: Veri bilimcilerin, verilerini yapmak istedikleri işlem için daha uygun bir biçime getirmek amacıyla kullanacakları çok sayıda işlem. Örneğin, Twitter verilerinin duygu analizi yapılmadan önce, HTML etiketlerini ve boşlukları temizlemek, kısaltmaları açmak ve tweet’leri içerdiği sözcüklerin listelerine bölmek isteyebilirsiniz.
Merkezleme ve Ölçekleme: Her ikisi de sayısal verilerin (örneğin kategoriler veya dizeler yerine sayılardan oluşan veriler) ön işlemesinin biçimleridir; bir değişkeni merkezlemek, yeni değişkenin ortalaması 0 olacak şekilde her veri noktasından o değişkenin ortalamasını çıkarmaktır; bir değişkeni ölçeklemek ise verinin aralığını değiştirmek için her veri noktasını bir sabitle çarpmaktır. Önemleri ve örnekler için yazının gövdesine bakın.
Bu makale bir Jupyter defterinden üretildi. Defteri buradan indirebilirsiniz.