Python Scikit-Learn ile SVM ve Kernel SVM Uygulaması

Python Scikit-Learn ile SVM ve Kernel SVM Uygulaması

Giriş

Bu kılavuz, Destek Vektör Makineleri (SVM'ler) ile ilgili üç kılavuzun ilk bölümüdür. Bu dizide, sahte bir banknot kullanım durumu üzerinde çalışacağız, basit SVM hakkında bilgi edineceğiz, ardından SVM hiperparametreleri hakkında bilgi edineceğiz ve son olarak, çekirdek numarası ve diğer SVM türlerini keşfedin.

Tüm kılavuzları okumak veya en çok hangilerinin ilginizi çektiğini görmek isterseniz, her kılavuzda ele alınan konuların tablosu aşağıdadır:

1. SVM ve Kernel SVM'yi Python's Scikit-Learn ile Uygulama

  • Kullanım örneği: Banknotları unutun
  • SVM'lerin arka planı
  • Basit (Doğrusal) SVM Modeli
    • Veri Kümesi Hakkında
    • Veri Kümesini İçe Aktarma
    • Veri Kümesini Keşfetmek
  • Scikit-Learn ile SVM Uygulama
    • Verileri Eğitim/Test Setlerine Bölme
    • Modeli Eğitmek
    • Tahminler Yapmak
    • Modelin Değerlendirilmesi
    • Sonuçları Yorumlama

2. SVM Hiperparametrelerini Anlamak (Çok yakında!)

  • C Hiperparametresi
  • Gama Hiperparametresi

3. Diğer SVM çeşitlerini Python'un Scikit-Learn'ü ile uygulamak (Çok yakında!)

  • SVM'lerin Genel Fikri (bir özet)
  • Çekirdek (hile) SVM
  • Scikit-Learn ile doğrusal olmayan çekirdek SVM'yi uygulama
  • Kitaplıkları içe aktarma
    • Veri kümesini içe aktarma
    • Verileri özelliklere (X) ve hedefe (y) bölme
    • Verileri Eğitim/Test Setlerine Bölme
    • Algoritmayı Eğitmek
  • polinom çekirdek
    • Tahminler Yapmak
    • Algoritmayı Değerlendirmek
  • Gauss çekirdeği
    • Tahmin ve Değerlendirme
  • Sigmoid Çekirdek
    • Tahmin ve Değerlendirme
  • Doğrusal Olmayan Çekirdek Performanslarının Karşılaştırılması

Kullanım Örneği: Sahte Banknotlar

Bazen insanlar sahte banknot basmanın bir yolunu bulur. Bu notlara bakıp geçerliliğini doğrulayan biri varsa bunlara aldanmak zor olabilir.

Ama her nota bakacak bir kişi olmadığında ne olur? Banknotların sahte mi yoksa gerçek mi olduğunu otomatik olarak öğrenmenin bir yolu var mı?

Bu soruları cevaplamanın birçok yolu var. Bir cevap, alınan her notun fotoğrafını çekmek, görüntüsünü sahte bir notun görüntüsüyle karşılaştırmak ve ardından onu gerçek veya sahte olarak sınıflandırmaktır. Notun onaylanmasını beklemek sıkıcı veya kritik olduğunda, bu karşılaştırmayı hızlı bir şekilde yapmak da ilginç olacaktır.

Görüntüler kullanıldığından, bunlar sıkıştırılabilir, gri tonlamaya indirgenebilir ve ölçümleri çıkarılabilir veya nicelendirilebilir. Bu şekilde karşılaştırma, her görüntünün pikseli yerine görüntülerin ölçümleri arasında olacaktır.

Şimdiye kadar banknotları işlemenin ve karşılaştırmanın bir yolunu bulduk, ancak bunlar gerçek veya sahte olarak nasıl sınıflandırılacak? Bu sınıflandırmayı yapmak için makine öğrenimini kullanabiliriz. adında bir sınıflandırma algoritması vardır. Destek Vektör Makinesi, esas olarak kısaltılmış biçimiyle bilinir: SVM.

SVM'lerin arka planı

SVM'ler ilk olarak 1968'de Vladmir Vapnik ve Alexey Chervonenkis tarafından tanıtıldı. O zamanlar algoritmaları, yalnızca tek bir düz çizgi kullanılarak ayrılabilen verilerin sınıflandırılmasıyla veya önceden belirlenmiş verilerin sınıflandırılmasıyla sınırlıydı. lineer olarak ayrılabilir. Bu ayrılığın nasıl görüneceğini görebiliriz:

Python'un Scikit-Learn PlatoBlockchain Veri Zekası ile SVM ve Çekirdek SVM'nin uygulanması. Dikey Arama. Ai.

Yukarıdaki resimde ortada bir çizgimiz var, bazı noktalar bu çizginin solunda, diğerleri ise sağında. Her iki nokta grubunun mükemmel bir şekilde ayrıldığına, çizginin arasında hatta yakınında hiçbir nokta olmadığına dikkat edin. Benzer noktalar ile onları ayıran çizgi arasında bir kenar boşluğu varmış gibi görünür, bu kenar boşluğuna denir. ayırma marjı. Ayırma payının işlevi, benzer noktalar ile onları ayıran çizgi arasındaki boşluğu büyütmektir. DVM bunu bazı noktaları kullanarak yapar ve çizginin marjı kararını desteklemek için dikey vektörlerini hesaplar. bunlar destek vektörleri bunlar algoritmanın adının bir parçasıdır. Daha sonra onlar hakkında daha fazla şey anlayacağız. Ortada gördüğümüz düz çizgi ise şu yöntemlerle bulunur: maksimuma çıkarmak çizgi ile noktalar arasındaki boşluk veya ayırma kenar boşluğunu maksimize eden. Bu yöntemler, alanından kaynaklanmaktadır. Optimizasyon Teorisi.

Az önce gördüğümüz örnekte, her bir nokta benzer noktalara yakın olduğundan ve iki grup birbirinden uzak olduğundan, her iki nokta grubu kolayca ayrılabilir.

Ancak verileri tek bir düz çizgi kullanarak ayırmanın bir yolu yoksa ne olur? Yerinde olmayan dağınık noktalar varsa veya bir eğriye ihtiyaç duyulursa?

Bu sorunu çözmek için, DVM daha sonra 1990'larda, aykırı değerler gibi merkezi eğiliminden uzak noktalara sahip verileri veya ikiden fazla boyutu olan ve doğrusal olarak ayrılamayan daha karmaşık sorunları da sınıflandırabilecek şekilde rafine edildi. .

Merak edilen şey, DVM'lerin yalnızca son yıllarda, esas olarak bazen doğru cevapların %90'ından fazlasını veya doğruluk, zor problemler için.

SVM'ler, öğrenmenin ne olduğuna ilişkin istatistiksel açıklamalara veya İstatistiksel Öğrenme Kuramı.

Bu makalede, Destek Vektör Makineleri algoritmalarının ne olduğunu, bir destek vektör makinesinin arkasındaki kısa teoriyi ve bunların Python'un Scikit-Learn kitaplığında uygulanmasını göreceğiz. Daha sonra, olarak bilinen başka bir SVM konseptine geçeceğiz. Çekirdek SVM'siya da Çekirdek hilesive ayrıca Scikit-Learn'ün yardımıyla uygulayacaktır.

Basit (Doğrusal) SVM Modeli

Veri Kümesi Hakkında

Giriş bölümünde verilen örneği takip ederek, gerçek ve sahte banknot görüntülerinin ölçümlerini içeren bir veri seti kullanacağız.

İki nota bakarken, gözlerimiz genellikle onları soldan sağa doğru tarar ve nerede benzerlikler veya farklılıklar olabileceğini kontrol eder. Yeşil bir noktadan önce gelen siyah bir nokta veya bir resmin üzerinde parlak bir işaret ararız. Bu, notlara baktığımız bir düzen olduğu anlamına gelir. Yeşiller ve siyah noktaların olduğunu bilseydik, ama yeşil noktanın siyahtan önce geldiğini veya siyahın yeşilden önce geldiğini bilmeseydik, notalar arasında ayrım yapmak daha zor olurdu.

Banknot görüntülerine uygulanabilecek, az önce anlattığımıza benzer bir yöntem var. Genel olarak, bu yöntem, görüntünün piksellerini bir sinyale çevirmekten ve ardından görüntüdeki her farklı sinyalin küçük dalgalara dönüştürülerek meydana gelme sırasını dikkate almaktan veya dalgacıklar. Dalgacıkları elde ettikten sonra, bazı sinyallerin diğerinden önce meydana gelme sırasını bilmenin bir yolu vardır. zaman, ama tam olarak hangi sinyal değil. Bunu bilmek için görüntünün frekanslarının elde edilmesi gerekir. Her sinyalin ayrışmasını yapan bir yöntemle elde edilirler. Fourier yöntemi.

Dalgacıklar aracılığıyla zaman boyutu ve Fourier yöntemi ile frekans boyutu elde edildikten sonra, her ikisinin de eşleştiğini görmek için zaman ve frekansın üst üste bindirilmesi yapılır. kıvrım analiz. Evrişim, dalgacıkları görüntünün frekanslarıyla eşleştiren bir uyum elde eder ve hangi frekansların daha belirgin olduğunu bulur.

Dalgacıkları, frekanslarını bulmayı ve ardından her ikisini uydurmayı içeren bu yönteme denir. Dalgacık dönüşümü. Dalgacık dönüşümünün katsayıları vardır ve bu katsayılar veri setinde sahip olduğumuz ölçümleri elde etmek için kullanılmıştır.

Veri Kümesini İçe Aktarma

Bu bölümde kullanacağımız banknot veri seti, programın sınıflandırma bölümünde kullanılanla aynıdır. karar ağacı eğitimi.

Not: Veri setini indirebilirsiniz okuyun.

Verileri bir pandaya aktaralım dataframe yapısı ve ilk beş satırına bir göz atın. head() yöntemi.

Verilerin bir dosyaya kaydedildiğine dikkat edin. txt (metin) dosya biçimi, virgülle ayrılmış ve başlıksız. Bunu bir tablo olarak okuyarak yeniden yapılandırabiliriz. csv, belirterek separator virgül olarak ve sütun adlarını names argüman.

Bu üç adımı aynı anda uygulayalım ve ardından verilerin ilk beş satırına bakalım:

import pandas as pd data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()

Bunun sonucu:

	variance skewness curtosis entropy class
0 3.62160 8.6661 -2.8073 -0.44699 0
1 4.54590 8.1674 -2.4586 -1.46210 0
2 3.86600 -2.6383 1.9242 0.10645 0
3 3.45660 9.5228 -4.0112 -3.59440 0
4 0.32924 -4.4552 4.5718 -0.98880 0

Not: Ayrıca verileri yerel olarak kaydedebilir ve değiştirebilirsiniz. data_link için data_path, ve yolu yerel dosyanıza iletin.

Veri kümemizde beş sütun olduğunu görebiliriz, yani, variance, skewness, curtosis, entropy, ve class. Beş satırda ilk dört sütun 3.62160, 8.6661, -2.8073 veya sürekli değerler ve son class sütunun ilk beş satırı 0'larla doldurulmuş veya ayrık değeri.

Amacımız bir banknotun gerçek olup olmadığını tahmin etmek olduğundan, bunu banknotun dört özelliğine dayanarak yapabiliriz:

  • variance Dalgacık Dönüştürülmüş görüntü. Genellikle varyans, veri noktalarının verinin ortalama değerine ne kadar yakın veya uzak olduğunu ölçen sürekli bir değerdir. Noktalar verinin ortalama değerine daha yakınsa, dağılım normal dağılıma daha yakındır, bu da genellikle değerlerinin daha iyi dağıldığı ve bir şekilde tahmin edilmesinin daha kolay olduğu anlamına gelir. Geçerli görüntü bağlamında bu, dalgacık dönüşümünden kaynaklanan katsayıların varyansıdır. Varyans ne kadar azsa, katsayılar gerçek görüntüyü çevirmeye o kadar yakındı.

  • skewness Dalgacık Dönüştürülmüş görüntü. Çarpıklık, bir dağılımın asimetrisini gösteren sürekli bir değerdir. Ortalamanın solunda daha fazla değer varsa, dağılım olumsuz çarpık, ortalamanın sağında daha fazla değer varsa, dağılım pozitif çarpıkve ortalama, mod ve ortanca aynı ise, dağılım simetrik. Bir dağılım ne kadar simetrikse, normal dağılıma o kadar yakındır ve değerleri de daha iyi dağılmıştır. Mevcut bağlamda bu, dalgacık dönüşümünden kaynaklanan katsayıların çarpıklığıdır. Ne kadar simetrik olursa katsayılar o kadar yakın olur.variance, skewness, curtosis, entropygerçek görüntüyü çevirmek için.

Python'un Scikit-Learn PlatoBlockchain Veri Zekası ile SVM ve Çekirdek SVM'nin uygulanması. Dikey Arama. Ai.

  • curtosis (veya basıklık) Wavelet Transformed görüntüsünün. Basıklık, çarpıklık gibi bir dağılımın şeklini de tanımlayan sürekli bir değerdir. Basıklık katsayısına (k) bağlı olarak, bir dağılım - normal dağılıma kıyasla az ya da çok düz olabilir ya da uçlarında ya da kuyruklarında az ya da çok veri içerebilir. Dağılım daha geniş ve daha düz olduğunda buna denir. platikürtik; daha az yayılmış ve ortada daha yoğun olduğunda, mezokurtik; ve dağılım neredeyse tamamen ortada yoğunlaştığında, buna denir leptokurtik. Bu, varyans ve çarpıklık önceki durumlarla aynı durumdur, dağılım ne kadar mezokurtik ise, katsayılar gerçek görüntüyü çevirmeye o kadar yakındı.

Python'un Scikit-Learn PlatoBlockchain Veri Zekası ile SVM ve Çekirdek SVM'nin uygulanması. Dikey Arama. Ai.

  • entropy görüntü. Entropi de sürekli bir değerdir, genellikle bir sistemdeki rastgeleliği veya düzensizliği ölçer. Bir görüntü bağlamında entropi, bir piksel ile komşu pikselleri arasındaki farkı ölçer. Bizim bağlamımız için, katsayılar ne kadar fazla entropiye sahipse, görüntüyü dönüştürürken o kadar fazla kayıp oluyordu ve entropi ne kadar küçükse, bilgi kaybı o kadar küçük oluyordu.

Python'un Scikit-Learn PlatoBlockchain Veri Zekası ile SVM ve Çekirdek SVM'nin uygulanması. Dikey Arama. Ai.

Beşinci değişken, class muhtemelen 0 ve 1 değerlerine sahip olan, notun gerçek mi yoksa sahte mi olduğunu söyleyen değişken.

Beşinci sütunun sıfırlar ve birler içerip içermediğini Pandalar ile kontrol edebiliriz. unique() yöntem:

bankdata['class'].unique()

Yukarıdaki yöntem şunu döndürür:

array([0, 1]) 

Yukarıdaki yöntem, 0 ve 1 değerlerine sahip bir dizi döndürür. Bu, sınıf satırlarımızda bulunan tek değerlerin sıfırlar ve birler olduğu anlamına gelir. olarak kullanıma hazırdır. hedef denetimli öğrenmemizde.

  • class görüntü. Bu bir tamsayı değeridir, görüntü sahte olduğunda 0, görüntü gerçek olduğunda 1'dir.

Gerçek ve unutulan görüntülerin ek açıklamalarını içeren bir sütunumuz olduğu için, bu, öğrenme türümüzün olduğu anlamına gelir. denetimli.

Önerileri: Banknot görüntülerinde Dalgacık Dönüşümü'nün arkasındaki mantık ve SVM kullanımı hakkında daha fazla bilgi edinmek için yazarların yayınlanmış makalesini okuyun.

Ayrıca verilerdeki satır sayısına bakarak kaç kaydımız veya görüntümüz olduğunu da görebiliriz. shape özelliği:

bankdata.shape

Bu çıktılar:

(1372, 5)

Yukarıdaki satır, 1,372 sıra dönüştürülmüş banknot görüntüsü ve 5 sütun olduğu anlamına gelir. Bu, analiz edeceğimiz verilerdir.

Veri setimizi içe aktardık ve birkaç kontrol yaptık. Şimdi daha iyi anlamak için verilerimizi keşfedebiliriz.

Veri Kümesini Keşfetmek

Az önce sınıf sütununda yalnızca sıfırlar ve birler olduğunu gördük, ancak bunların hangi oranda olduğunu - başka bir deyişle - birden fazla sıfır varsa, sıfırdan fazla bir varsa veya sayıların sıfır olup olmadığını da bilebiliriz. sıfırlar, birlerin sayısı ile aynıdır, yani onlar dengeli.

Orantıyı bilmek için, verilerdeki sıfır ve bir değerlerin her birini sayabiliriz. value_counts() yöntem:

bankdata['class'].value_counts()

Bu çıktılar:

0 762
1 610
Name: class, dtype: int64

Yukarıdaki sonuçta 762 tane sıfır ve 610 tane olduğunu ya da 152 birden fazla sıfır olduğunu görebiliriz. Bu, gerçek görüntüleri biraz daha fazla taklit ettiğimiz anlamına gelir ve bu tutarsızlık daha büyükse, örneğin 5500 sıfır ve 610 bir, sonuçlarımızı olumsuz etkileyebilir. Bu örnekleri modelimizde kullanmaya çalıştığımızda - ne kadar çok örnek varsa, genellikle modelin sahte veya gerçek banknotlar arasında karar vermesi için o kadar fazla bilgi gerekeceği anlamına gelir - eğer birkaç gerçek banknot örneği varsa, model tanımaya çalışırken yanılıyorlar.

152 sahte banknot daha olduğunu zaten biliyoruz, ancak bunların modelin öğrenmesi için yeterli örnek olduğundan emin olabilir miyiz? Öğrenmek için kaç örneğe ihtiyaç olduğunu bilmek, cevaplaması çok zor bir sorudur, bunun yerine, sınıflar arasındaki bu farkın ne kadar olduğunu yüzde cinsinden anlamaya çalışabiliriz.

İlk adım pandaları kullanmaktır value_counts() yöntemi yeniden, ancak şimdi argümanı dahil ederek yüzdeyi görelim normalize=True:

bankdata['class'].value_counts(normalize=True)

The normalize=True her sınıf için verilerin yüzdesini hesaplar. Şimdiye kadar, sahte (0) ve gerçek verilerin (1) yüzdesi:

0 0.555394
1 0.444606
Name: class, dtype: float64

Bu, veri kümemizin yaklaşık (~) %56'sının sahte ve %44'ünün gerçek olduğu anlamına gelir. Bu bize %56-%44'lük bir oran veriyor ki bu da %12'lik bir farkla aynı. Bu istatistiksel olarak küçük bir fark olarak kabul edilir, çünkü %10'un biraz üzerindedir, dolayısıyla veriler dengeli kabul edilir. 56:44 oranı yerine 80:20 veya 70:30 oranı olsaydı, o zaman verilerimiz dengesiz kabul edilirdi ve biraz dengesizlik tedavisi yapmamız gerekirdi, ama neyse ki durum böyle değil.

Bu farkı görsel olarak da görebiliriz, sınıfa veya hedefin dağılımına Pandas histogramı ile bakarak, şunu kullanarak:

bankdata['class'].plot.hist();

Bu, doğrudan dataframe yapısını kullanarak bir histogram çizer. matplotlib perde arkasında olan kütüphane.

Python'un Scikit-Learn PlatoBlockchain Veri Zekası ile SVM ve Çekirdek SVM'nin uygulanması. Dikey Arama. Ai.

Histograma bakarak hedef değerlerimizin 0 veya 1 olduğundan ve verilerin dengeli olduğundan emin olabiliriz.

Bu, tahmin etmeye çalıştığımız sütunun analiziydi, peki ya verilerimizin diğer sütunlarını analiz etmeye ne dersiniz?

İstatistiksel ölçümlere şu şekilde bir göz atabiliriz: describe() veri çerçevesi yöntemi. biz de kullanabiliriz .T devrik – sütunları ve satırları tersine çevirmek için, değerler arasında karşılaştırmayı daha doğrudan hale getirir:

En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!

bankdata.describe().T

Bunun sonucu:

 count mean std min 25% 50% 75% max
variance 1372.0 0.433735 2.842763 -7.0421 -1.773000 0.49618 2.821475 6.8248
skewness 1372.0 1.922353 5.869047 -13.7731 -1.708200 2.31965 6.814625 12.9516
curtosis 1372.0 1.397627 4.310030 -5.2861 -1.574975 0.61663 3.179250 17.9274
entropy 1372.0 -1.191657 2.101013 -8.5482 -2.413450 -0.58665 0.394810 2.4495
class 1372.0 0.444606 0.497103 0.0000 0.000000 0.00000 1.000000 1.0000

Çarpıklık ve eğrilik sütunlarının standart sapma değerlerinden uzak ortalama değerlere sahip olduğuna dikkat edin, bu, verilerin merkezi eğiliminden daha uzak olan veya daha fazla değişkenliğe sahip olan değerleri gösterir.

Ayrıca, her bir özelliğin histogramını bir for döngüsü içinde çizerek, her bir özelliğin dağılımına görsel olarak göz atabiliriz. Dağılıma bakmanın yanı sıra, her sınıfın puanlarının her özelliğe göre nasıl ayrıldığına bakmak ilginç olacaktır. Bunu yapmak için, aralarındaki özelliklerin bir kombinasyonunu oluşturan bir dağılım grafiği çizebilir ve sınıfına göre her noktaya farklı renkler atayabiliriz.

Her özelliğin dağılımıyla başlayalım ve her veri sütununun histogramını çizelim. class sütunu. class sütunu, banka verileri sütunları dizisindeki konumuna göre dikkate alınmayacaktır. Sonuncusu hariç tüm sütunlar seçilecektir. columns[:-1]:

import matplotlib.pyplot as plt for col in bankdata.columns[:-1]: plt.title(col) bankdata[col].plot.hist() plt.show();

Yukarıdaki kodu çalıştırdıktan sonra, her ikisinin de olduğunu görebiliriz. skewness ve entropy veri dağılımları negatif çarpıktır ve curtosis pozitif çarpıktır. Tüm dağılımlar simetriktir ve variance normale yakın tek dağılımdır.

Şimdi ikinci kısma geçebilir ve her değişkenin dağılım grafiğini çizebiliriz. Bunu yapmak için, sınıf dışındaki tüm sütunları da seçebiliriz. columns[:-1], Seaborn'u kullanın scatterplot() ve özelliklerin her biri için eşleştirmedeki varyasyonları elde etmek için iki for döngüsü. İlk özelliğin ikinciye eşit olup olmadığını test ederek, bir özelliğin kendisiyle eşleşmesini de hariç tutabiliriz. if statement.

import seaborn as sns for feature_1 in bankdata.columns[:-1]: for feature_2 in bankdata.columns[:-1]: if feature_1 != feature_2: print(feature_1, feature_2) sns.scatterplot(x=feature_1, y=feature_2, data=bankdata, hue='class') plt.show();

Tüm grafiklerin birbirinden açıkça ayrılmamış hem gerçek hem de sahte veri noktalarına sahip olduğuna dikkat edin, bu, sınıfların bir tür üst üste binmesi olduğu anlamına gelir. Bir SVM modeli, sınıfları ayırmak için bir çizgi kullandığından, grafiklerdeki bu gruplardan herhangi biri yalnızca bir çizgi kullanılarak ayrılabilir mi? Pek mümkün görünmüyor. Gerçek verilerin çoğu böyle görünür. Bir ayrılığa ulaşabileceğimiz en yakın şey, ikisinin birleşimidir. skewness ve varianceya da entropy ve variance araziler. Bunun nedeni muhtemelen variance normale yakın dağılım şekline sahip verilerdir.

Ancak tüm bu grafiklere sırayla bakmak biraz zor olabilir. Seaborn's kullanarak tüm dağılım ve dağılım grafiği grafiklerine birlikte bakma alternatifimiz var. pairplot().

Yaptığımız önceki her iki for döngüsü de yalnızca bu satırla değiştirilebilir:

sns.pairplot(bankdata, hue='class');

Çift arsaya bakıldığında, öyle görünüyor ki, aslında, curtosis ve variance özelliklerin en kolay kombinasyonu olacaktır, bu nedenle farklı sınıflar bir çizgi ile ayrılabilir veya lineer olarak ayrılabilir.

Çoğu veri doğrusal olarak ayrılabilir olmaktan uzaksa, boyutlarını azaltarak önişlemeyi deneyebilir ve ayrıca dağılımı normale yaklaştırmaya çalışmak için değerlerini normalleştirebiliriz.

Bu durumda veriyi daha fazla önişleme yapmadan olduğu gibi kullanalım ve daha sonra bir adım geriye giderek veri önişlemesini ekleyebilir ve sonuçları karşılaştırabiliriz.

Önerileri: Verilerle çalışırken, bilgi genellikle dönüştürülürken kaybolur çünkü daha fazla veri toplamak yerine tahminler yapıyoruz. İlk verilerle olduğu gibi çalışmak, mümkünse, diğer ön işleme tekniklerini denemeden önce bir temel sunar. Bu yol izlenirken, ham veriler kullanılarak elde edilen ilk sonuç, veriler üzerinde ön işleme teknikleri kullanan başka bir sonuçla karşılaştırılabilir.

Not: Genellikle İstatistikte, modeller oluştururken, veri türüne (kesikli, sürekli, kategorik, sayısal), dağılımına ve model varsayımlarına bağlı olarak bir prosedür izlemek yaygındır. Bilgisayar Bilimlerinde (CS) deneme, yanılma ve yeni yinelemeler için daha fazla alan vardır. CS'de karşılaştırmak için bir taban çizgisine sahip olmak yaygındır. Scikit-learn'de, sahte modellerin (veya sahte tahmincilerin) bir uygulaması vardır, bazıları yazı tura atmaktan daha iyi değildir ve sadece cevaplayın Evet (veya 1) zamanın %50'sinde. Sonuçları karşılaştırırken gerçek model için bir temel olarak kukla modelleri kullanmak ilginçtir. Gerçek model sonuçlarının rastgele bir tahminden daha iyi olması beklenir, aksi takdirde bir makine öğrenimi modeli kullanmak gerekli olmaz.

Scikit-Learn ile SVM Uygulama

DVM'nin nasıl çalıştığına dair teoriye daha fazla girmeden önce, verilerle ilk temel modelimizi oluşturabiliriz ve Scikit-Learn'ün Destek Vektörü Sınıflandırıcısı or SVC sınıf.

Modelimiz dalgacık katsayılarını alacak ve bunları sınıfa göre sınıflandırmaya çalışacaktır. Bu süreçteki ilk adım, katsayıları ayırmak veya Özellikler sınıftan ya hedef. Bu adımdan sonra, ikinci adım, verileri modelin öğrenmesi veya öğrenmesi için kullanılacak bir kümeye bölmektir. tren seti ve modelin değerlendirilmesinde kullanılacak olan veya Deneme seti.

Not: Test ve değerlendirme terminolojisi biraz kafa karıştırıcı olabilir çünkü verilerinizi tren, değerlendirme ve test setleri arasında da bölebilirsiniz. Bu şekilde, iki sete sahip olmak yerine, sadece kullanmak ve modelinizin performansının artıp artmadığını görmek için bir ara sete sahip olursunuz. Bu, modelin tren seti ile eğitileceği, değerlendirme seti ile geliştirileceği ve test seti ile nihai bir metrik elde edileceği anlamına gelir.

Bazı insanlar değerlendirmenin ara küme olduğunu söylerken, diğerleri test kümesinin ara küme ve değerlendirme kümesinin son küme olduğunu söyleyecektir. Bu, modelin hiçbir şekilde aynı örneği görmediğini veya bir tür veri sızıntısı olmuyor ve son ayarlanan metriklerin iyileştirilmesiyle bir model genellemesi var. Bu yaklaşımı izlemek istiyorsanız, verileri burada açıklandığı gibi bir kez daha bölebilirsiniz. Scikit-Learn'ün train_test_split() – Eğitim, Test ve Doğrulama Setleri Kılavuz.

Verileri Eğitim/Test Setlerine Bölme

Bir önceki oturumda, verileri anladık ve inceledik. Şimdi, verilerimizi iki diziye ayırabiliriz - biri dört özellik için, diğeri beşinci veya hedef özellik için. Dalgacık katsayılarına bağlı olarak sınıfı tahmin etmek istediğimiz için, y Olacak class sütun ve bizim X olacak variance, skewness, curtosis, ve entropy sütunlar.

Hedefi ve özellikleri ayırmak için yalnızca class sütun y, daha sonra kalan sütunları şu şekilde ilişkilendirmek için veri çerçevesinden bırakarak X ile .drop() yöntem:

y = bankdata['class']
X = bankdata.drop('class', axis=1) 

Veriler niteliklere ve etiketlere bölündükten sonra, onu tren ve test kümelerine ayırabiliriz. Bu elle yapılabilir, ancak model_selection Scikit-Learn kitaplığı şunları içerir: train_test_split() Verileri rasgele tren ve test setlerine bölmemize izin veren bir yöntem.

Kullanmak için kitaplığı içe aktarabilir, train_test_split() yöntem, geçmek X ve y veri ve tanımlayın test_size argüman olarak geçmek için. Bu durumda, onu olarak tanımlayacağız. 0.20– bu, verilerin %20'sinin test için ve diğer %80'inin eğitim için kullanılacağı anlamına gelir.

Bu yöntem, tanımladığımız yüzdeye göre rastgele örnekler alır, ancak örneklemenin ilişkiyi tamamen karıştırmaması için Xy çiftlerine saygı duyar.

Örnekleme işlemi doğası gereği rastgele olduğundan, yöntemi çalıştırırken her zaman farklı sonuçlara sahip olacağız. Aynı sonuçlara veya tekrarlanabilir sonuçlara sahip olabilmek için SEED adında 42 değerinde bir sabit tanımlayabiliriz.

Bunu yapmak için aşağıdaki betiği çalıştırabilirsiniz:

from sklearn.model_selection import train_test_split SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

Dikkat edin train_test_split() yöntem zaten döndürür X_train, X_test, y_train, y_test bu sırayla ayarlar. Tren ve test için ayrılan örnek sayısını, ilk (0) öğesini alarak yazdırabiliriz. shape özellik döndürülen demet:

xtrain_samples = X_train.shape[0]
xtest_samples = X_test.shape[0] print(f'There are {xtrain_samples} samples for training and {xtest_samples} samples for testing.')

Bu, eğitim için 1097 örnek ve test için 275 örnek olduğunu gösterir.

Modeli Eğitmek

Verileri tren ve test setlerine ayırdık. Şimdi tren verileri üzerinde bir SVM modeli oluşturma ve eğitme zamanı. Bunu yapmak için Scikit-Learn'ü içe aktarabiliriz. svm kütüphane ile birlikte Destek Vektörü Sınıflandırıcısı sınıf veya SVC sınıf.

Sınıfı içe aktardıktan sonra, bunun bir örneğini oluşturabiliriz - basit bir DVM modeli oluşturduğumuz için, verilerimizi doğrusal olarak ayırmaya çalışıyoruz, böylece verilerimizi bölmek için bir çizgi çizebiliriz - bu, bir sınıf kullanmakla aynıdır. doğrusal fonksiyon – tanımlayarak kernel='linear' sınıflandırıcı için bir argüman olarak:

from sklearn.svm import SVC
svc = SVC(kernel='linear')

Bu şekilde, sınıflandırıcı verilerimizi ayıran doğrusal bir fonksiyon bulmaya çalışacaktır. Modeli oluşturduktan sonra onu eğitelim veya uygun tren verileriyle birlikte, fit() yöntemi ve verilmesi X_train Özellikleri ve y_train argüman olarak hedefler.

Modeli eğitmek için aşağıdaki kodu çalıştırabiliriz:

svc.fit(X_train, y_train)

Aynen böyle, model eğitildi. Şimdiye kadar verileri anladık, böldük, basit bir DVM modeli oluşturduk ve modeli tren verilerine uydurduk.

Bir sonraki adım, bu uyumun verilerimizi tanımlamayı ne kadar iyi başardığını anlamaktır. Başka bir deyişle, doğrusal bir SVM'nin yeterli bir seçim olup olmadığını yanıtlamak için.

Tahminler Yapmak

Modelin verileri tanımlamayı başardığını cevaplamanın bir yolu, bazı sınıflandırmaları hesaplamak ve bunlara bakmaktır. metrikleri.

Öğrenmenin denetimli olduğunu düşünürsek, tahminlerde bulunabiliriz. X_test ve diyebileceğimiz bu tahmin sonuçlarını karşılaştırın y_pred – gerçek ile y_testya da Zemin gerçeği.

Verilerin bir kısmını tahmin etmek için, modelin predict() yöntem kullanılabilir. Bu yöntem test özniteliklerini alır, X_test, bir bağımsız değişken olarak ve her biri için 0 veya 1 olan bir tahmin döndürür. X_testsatırları.

tahmin ettikten sonra X_test veriler, sonuçlar bir y_pred değişken. Böylece, basit doğrusal SVM modeliyle tahmin edilen sınıfların her biri artık y_pred değişkeni.

Bu tahmin kodudur:

y_pred = svc.predict(X_test)

Tahminlere sahip olduğumuzu düşünürsek, artık bunları gerçek sonuçlarla karşılaştırabiliriz.

Modelin Değerlendirilmesi

Tahminleri gerçek sonuçlarla karşılaştırmanın birkaç yolu vardır ve bunlar bir sınıflandırmanın farklı yönlerini ölçer. En çok kullanılan bazı sınıflandırma ölçütleri şunlardır:

  1. Karışıklık Matrisi: ne kadar numunenin doğru veya yanlış olduğunu bilmemiz gerektiğinde her sınıf. Doğru ve doğru tahmin edilen değerlere denir. gerçek pozitifler, pozitif olarak tahmin edilen ancak pozitif olmayanlara denir yanlış pozitif. Aynı isimlendirme gerçek negatifler ve yanlış negatifler negatif değerler için kullanılır;

  2. Hassas: amacımız, sınıflandırıcımız tarafından hangi doğru tahmin değerlerinin doğru kabul edildiğini anlamak olduğunda. Kesinlik, bu gerçek pozitif değerleri, pozitif olarak tahmin edilen örneklere böler;

$$
kesinlik = frac{text{gerçek pozitifler}}{text{gerçek pozitifler} + metin{yanlış pozitifler}}
$$

  1. Geri çağırmak: sınıflandırıcımız tarafından gerçek pozitiflerden kaçının tanımlandığını anlamak için genellikle hassasiyetle birlikte hesaplanır. Geri çağırma, gerçek pozitiflerin pozitif olarak tahmin edilmesi gereken herhangi bir şeye bölünmesiyle hesaplanır.

$$
hatırlama = frac{text{gerçek pozitifler}}{text{gerçek pozitifler} + metin{yanlış negatifler}}
$$

  1. F1 skoru: dengeli mi yoksa harmonik ortalama kesinlik ve hatırlama. En düşük değer 0 ve en yüksek değer 1'dir. f1-score 1'e eşittir, tüm sınıfların doğru tahmin edildiği anlamına gelir - bu, gerçek verilerle elde edilmesi çok zor bir puandır (neredeyse her zaman istisnalar vardır).

$$
metin{f1-skor} = 2* frak{metin{kesinlik} * metin{hatırlama}}{metin{kesinlik} + metin{hatırlatma}}
$$

Karışıklık matrisi, kesinlik, geri çağırma ve F1 puan ölçütlerine zaten aşinayız. Bunları hesaplamak için Scikit-Learn'ün verilerini içe aktarabiliriz. metrics kütüphane. Bu kütüphane şunları içerir: classification_report ve confusion_matrix yöntemlerinde, sınıflandırma raporu yöntemi kesinliği, geri çağırmayı ve f1 puanını verir. İkisi birden classification_report ve confusion_matrix tüm bu önemli metriklerin değerlerini bulmak için kolayca kullanılabilir.

Metrikleri hesaplamak için yöntemleri içe aktarırız, onları çağırırız ve tahmin edilen sınıflandırmaları argüman olarak iletiriz, y_testve sınıflandırma etiketleri veya y_true.

Karışıklık matrisinin daha iyi görselleştirilmesi için, onu bir Seaborn'un grafiğinde çizebiliriz. heatmap miktar ek açıklamalarıyla birlikte ve sınıflandırma raporu için sonucunu yazdırmak en iyisidir, böylece sonuçları biçimlendirilir. Bu, aşağıdaki koddur:

from sklearn.metrics import classification_report, confusion_matrix cm = confusion_matrix(y_test,y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Confusion matrix of linear SVM') print(classification_report(y_test,y_pred))

Bu şunu görüntüler:

 precision recall f1-score support 0 0.99 0.99 0.99 148 1 0.98 0.98 0.98 127 accuracy 0.99 275 macro avg 0.99 0.99 0.99 275
weighted avg 0.99 0.99 0.99 275

Python'un Scikit-Learn PlatoBlockchain Veri Zekası ile SVM ve Çekirdek SVM'nin uygulanması. Dikey Arama. Ai.

Sınıflandırma raporunda, sahte notlar veya sınıf 0.99 için 0.99'luk bir kesinlik, 1'luk bir geri çağırma ve 0.99'luk bir f0 puanı olduğunu biliyoruz. Bu ölçümler, destek sütununda gösterildiği gibi 148 örnek kullanılarak elde edildi. Bu arada, 1. sınıf veya gerçek notalar için sonuç bir birim aşağıda, 0.98 kesinlik, 0.98 hatırlama ve aynı f1 puanıydı. Bu kez, bu sonuçları elde etmek için 127 görüntü ölçümü kullanıldı.

Karışıklık matrisine bakarsak, 148 sınıf 0 örneğinden 146'sının doğru sınıflandırıldığını ve 2 yanlış pozitif olduğunu, 127 sınıf 1 örneğinde ise 2 yanlış negatif ve 125 gerçek pozitif olduğunu görebiliriz.

Sınıflandırma raporunu ve karışıklık matrisini okuyabiliriz, ancak bunlar ne anlama geliyor?

Sonuçları Yorumlama

Anlamını bulmak için, birleştirilmiş tüm ölçümlere bakalım.

1. sınıf için numunelerin neredeyse tamamı doğru bir şekilde sınıflandırıldı, gerçek banknotları tanımlarken modelimiz için 2 hata vardı. Bu, 0.98 veya %98 ile aynıdır, hatırlayın. Sınıf 0 için benzer bir şey söylenebilir, yalnızca 2 örnek yanlış sınıflandırılırken, 148'i gerçek negatiftir ve toplamda %99'luk bir kesinlik sağlar.

Bu sonuçların yanı sıra, diğerleri neredeyse 0.99 olan 1'u işaretliyor, bu çok yüksek bir metrik. Çoğu zaman, gerçek hayattaki verilerde bu kadar yüksek bir metrik olduğunda, bu, verilere aşırı ayarlanmış bir modele işaret ediyor olabilir veya fazla donatılmış.

Aşırı uyum olduğunda, model zaten bilinen verileri tahmin ederken iyi çalışabilir, ancak gerçek dünya senaryolarında önemli olan yeni verilere genelleme yeteneğini kaybeder.

Bir aşırı uyum olup olmadığını öğrenmek için hızlı bir test de tren verileriyle yapılır. Model, tren verilerini bir şekilde ezberlediyse, ölçümler %1'e veya %100'e çok yakın olacaktır. Tren verilerinin test verilerinden daha büyük olduğunu unutmayın - bu nedenle - ona orantılı olarak, daha fazla örnekle, daha fazla hata yapma olasılığıyla, biraz fazla uydurma olmadığı sürece bakmaya çalışın.

Tren verileriyle tahmin yapmak için, test verileri için yaptığımız şeyi tekrarlayabiliriz, ancak şimdi X_train:

y_pred_train = svc.predict(X_train) cm_train = confusion_matrix(y_train,y_pred_train)
sns.heatmap(cm_train, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with train data') print(classification_report(y_train,y_pred_train))

Bu çıktılar:

 precision recall f1-score support 0 0.99 0.99 0.99 614 1 0.98 0.99 0.99 483 accuracy 0.99 1097 macro avg 0.99 0.99 0.99 1097
weighted avg 0.99 0.99 0.99 1097

Python'un Scikit-Learn PlatoBlockchain Veri Zekası ile SVM ve Çekirdek SVM'nin uygulanması. Dikey Arama. Ai.

99 kat daha fazla veriye sahipken tren ölçümleri %4 olduğunda, bir fazla uyum olduğunu görmek kolaydır. Bu senaryoda ne yapılabilir?

Fazla uyumu geri döndürmek için daha fazla tren gözlemi ekleyebilir, veri kümesinin farklı bölümleriyle bir eğitim yöntemi kullanabiliriz, örneğin çapraz doğrulamave ayrıca modelimizi oluştururken eğitimden önce var olan varsayılan parametreleri değiştirin veya hiperparametreler. Çoğu zaman, Scikit-learn bazı parametreleri varsayılan olarak ayarlar ve bu, belgeleri okumaya ayrılmış fazla zaman yoksa sessizce gerçekleşebilir.

Bu kılavuzun ikinci bölümünü kontrol edebilirsiniz (Çok yakında!) çapraz doğrulamanın nasıl uygulanacağını ve bir hiperparametre ayarının nasıl gerçekleştirileceğini görmek için.

Sonuç

Bu yazıda basit doğrusal çekirdek SVM'yi inceledik. SVM algoritmasının arkasındaki sezgiyi aldık, gerçek bir veri seti kullandık, verileri araştırdık ve bu verilerin Python'un Scikit-Learn kitaplığı ile uygulayarak SVM ile birlikte nasıl kullanılabileceğini gördük.

Pratik yapmaya devam etmek için aşağıdaki gibi yerlerde bulunan diğer gerçek dünya veri kümelerini deneyebilirsiniz: Kaggle, UCI, Big Query genel veri kümeleri, üniversiteler ve devlet web siteleri.

Ayrıca SVM modelinin arkasındaki gerçek matematiği keşfetmenizi öneririm. DVM algoritmasını kullanmak için buna ihtiyacınız olmayacak olsa da, algoritmanız karar sınırlarını bulurken perde arkasında gerçekte neler olup bittiğini bilmek yine de çok kullanışlıdır.

Zaman Damgası:

Den fazla Yığın kötüye kullanımı