Selam.
Dünkü kursu gördüyseniz - "Makine öğreniminde karşılaşabileceğiniz" çukurlar "- Özellik seçimi nasıl yapılır (teori)" ve yöntemin uygulanmasıyla çok ilgileniyorsanız, o zaman kod uygulamasının bu açıklamasını umuyorum Makaleler, gelecekte özellik seçimi görevinizi kolaylaştırabilir.
Burada öncelikle verilerin gereksiz özelliklerini ve ilgisiz özelliklerini görselleştiriyoruz, böylece özellik seçiminin motivasyonunu daha iyi anlayabiliriz ve ardından kodun görüntülenmesi için filtreleme yöntemini, sarma yöntemini ve gömme yöntemini kullanırız. Özellik seçiminin üstünlüğünü yansıtmak için test setindeki genelleme hatasını gözlemleyin ve son olarak daha iyi sonuçlar alıp almayacağını görmek için onu birleştirmeye çalışıyoruz.
Önceki makalede kullandığımız diyabet verilerinin eski bir sorusu var, yani cinsiyet ile diyabetin kötüleşmesi arasında herhangi bir ilişki var mı? Başka bir deyişle, alakasız bir özellik mi?
sklearn ithal veri kümelerinden
seaborn'u sns olarak ithal etmek
matplotlib.pyplot dosyasını plt olarak içe aktar
numpy'yi np olarak içe aktar
# Verileri oku
data = datasets.load_diabetes ()
X = veri
y = veri
#
sns.set (style = 'darkgrid')
plt.plot (X, y, '. k', işaret boyutu = 5)
plt.xlabel ("Cinsiyet")
plt.ylabel ('hastalığın ilerlemesinin nicel ölçüsü')
plt.legend ()
plt.show ()
Şekilden de görebileceğimiz gibi, her cinsiyette hedeflerimiz tekdüze bir dağılım eğilimi gösteriyor. Cinsiyetin alakasız bir özellik olması çok muhtemeldir ancak tüm özellikleri test etmek için en iyisi korelasyon katsayısı yöntemini kullanmaktır. :
sklearn ithal veri kümelerinden
fromsklearn.feature_selection import f_regression
seaborn'u sns olarak ithal etmek
matplotlib.pyplot dosyasını plt olarak içe aktar
numpy'yi np olarak içe aktar
# Verileri oku
data = datasets.load_diabetes ()
X = veri
y = veri
# Korelasyon katsayısını hesaplayın
score = f_regression (X, y)
#
sns.set (style = 'darkgrid')
sns.barplot (skor, veri)
plt.xlabel ('Puan')
plt.ylabel ('özellikler')
plt.legend ()
plt.show ()
Korelasyon katsayısı, özellik ile hedef arasındaki doğrusal korelasyonu ölçer.Şekilden cinsiyet ile hedef arasındaki korelasyon katsayısının çok küçük olduğu görülebilir, bu nedenle 'yaş', 's1' ve '2' gibi geri kalanlar kaldırılmalı mı? Özellikler hakkında karşılıklı bilgi taraması yapıyoruz:
......
fromsklearn.feature_selection import mutual_info_regression
score = mutual_info_regression (X, y, discrete_features = False, random_state = 0)
......
Ek olarak, Spearman korelasyon katsayısını da kullanabiliriz:
scipy.stats'den spearmanr içe aktarma
score =
için n içinde aralığı (10):
score.append (np.abs (spearmanr (X, y)))
"Yaş", "cinsiyet", "s1" ve "s2" nin hala en düşük dört puanlama özelliği olduğu, "yaş", "cinsiyet" ve "s2" nin hala en düşük puanlama özelliği olduğu görülebilir. Karşılıklı bilgi ve Pearson katsayısı ve Spearman katsayısının belirli bir tutarlılık elde ettiğini söyleyebiliriz. Daha sonra, bu tür filtrelemeden sonra, özelliklerin önemini anlıyoruz ve son modele girmek için kaç özellik seçtiğimiz, kaç özelliğin en iyi performansı elde edebileceğine bağlı.
Bu noktaya kadar yaptığımız şey sadece özellikler ve hedefler arasındaki korelasyonu test ederek ilgisiz özellikleri ortadan kaldırmaktır ama ayrıca özellik seçimimizin önemli bir görevi de fazlalık özellikleri ortadan kaldırmaktır. Verilerimizle ilgili olarak, sezgisel olarak yaş ve tansiyonun belirli bir ilişkisi olduğunu düşünebiliriz:
plt.plot (X, X, '. k')
Ama sadece örnek uzaydan gözümüzde canlandırırsak, kesin yargılarda bulunamayız mesela bu resimde herhangi bir bilgi alamıyoruz. Daha iyi bir yaklaşım, korelasyon matrisini elde etmek için her özellik ve her özellik için korelasyon katsayıları yapmaktır (şu anda yalnızca özellikleri işlediğimizi ve hedef i ile hiçbir ilgimiz olmadığını unutmayın):
scipy.stats'den spearmanr içe aktarma
seaborn'u sns olarak ithal etmek
sklearn ithal veri kümelerinden
data = datasets.load_diabetes ()
X = veri
score_mat = np.abs (mızrakçı (X))
sns.set (stil = 'beyaz')
sns.heatmap (score_mat, annot = True, center = 0)
plt.show ()
Kare ne kadar hafifse, korelasyon o kadar yüksek olur. İlginç bir gerçeği fark edebiliriz: Endişelendiğimiz yaş ve kan basıncı arasındaki korelasyon sadece 0,35'tir; bu, 0,88'e kadar yüksek olan 1 'serum ve 2' serumu arasındaki korelasyondan çok daha düşük, while's3 'serumu ve 'Serumun korelasyon derecesi de 0.79'dur. Bu korelasyon derecesini sezgisel olarak anlamak için, yüksek korelasyonlu serum 1' ve serum 2 'grafiğini yapabiliriz:
plt.plot (X, X, '. k')
İkisi güçlü bir doğrusal ilişki gösteriyor! O zaman bunun gereksiz bir özellik olduğu sonucuna varabiliriz ve bunlardan sadece birini tutmamız gerekir.
Yukarıdan, filtreleme yönteminin iki ana görevi olduğu görülebilir: özellikler arasındaki korelasyonu kontrol ederek gereksiz özellikleri bulmak ve özellikler ile hedefler arasındaki korelasyonu kontrol ederek ilgisiz özellikleri bulmak.
Daha sonra, paketleme yönteminin anlaşılması nispeten kolaydır, tüm özellikleri koleksiyona atar ve açgözlü stratejiyi kullanır. Doğrusal modeli yalnızca farklı özellik sayılarının modelin uydurma yeteneği üzerindeki etkisini gözlemlemek için kullanabiliriz Teoriye göre, ne kadar az özellik, model parametreleri o kadar az ve modelin uydurma yeteneği o kadar zayıftır diyoruz. Bununla birlikte, özellik seçiminin amacı, modelin genelleme yeteneğini güçlendirmektir, bu nedenle özellik numarasını bir hiperparametre olarak ele almalı ve çapraz doğrulama ile test setindeki genelleme hatasını gözlemlemeliyiz:
sklearn.feature_selection'dan RFECV'yi içe aktar
seaborn'u sns olarak ithal etmek
matplotlib.pyplot dosyasını plt olarak içe aktar
numpy'yi np olarak içe aktar
sklearn.linear_model'den içe aktarma LinearRegression
fromsklearn.model_selection import KFold
data = datasets.load_diabetes ()
X = veri
y = veri
lr = Doğrusal Regresyon ()
scorer = 'neg_mean_squared_error'
rfecv = RFECV (tahmin edici = lr, adım = 1, cv = KFold (5),
puanlama = puanlayıcı)
rfecv.fit (X, y)
sns.set (style = 'darkgrid')
plt.xlabel ("Seçilen özelliklerin sayısı")
plt.ylabel ("Çapraz doğrulama puanı (MSE)")
plt.plot (aralık (1, len (rfecv.grid_scores_) +1), -rfecv.grid_scores _, 'r', label = "Optimum sayı özellikleri:% d"% rfecv.n_features_)
plt.legend ()
plt.show ()
Sarma yöntemini kullanarak, özellik numarası 6 olan en iyi özellik alt kümesini seçebiliriz. Bu özellik alt kümesinin genelleme yeteneği, tüm özellik kümelerininkinden daha iyidir. En iyi özellik alt kümesinin MSE'si yaklaşık 2946.88'dir ve toplam özellik MSE yaklaşık 2993'tür ve veriler üzerindeki özellik seçiminin modelin performansını önemli ölçüde artırabileceğini belirtir. Aşağıdaki kodla hangi özelliklerin korunduğunu kontrol edebiliriz:
np.array (data) # Numpy dizisinin Boolean değeri segmentasyon yöntemi burada kullanılır
Sarmalama yöntemi çok basit ve kaba. Özellik seçme işlevini gerçekleştirmek için doğrudan özellik alt kümelerinin performansını kullanır, ancak öğrenciyi düzeltir. Özellikleri seçmek için doğrusal regresyon kullanırsak, yalnızca bu özelliklerin doğrusal regresyonda en fazla olduğunu gösterebilir. Bu iyi bir kombinasyondur ve vektör makineleri ve Bayes modelleri gibi daha geniş bir model yelpazesine yerleştirilemez.
Gömme yöntemi öğrenciye yerleştirilir ve eğitim süreci ve özellik seçimi aynı anda tamamlanır. Bu yerleştirme, sarma yöntemi ile seçilen özellikler öğrencinin değişmesiyle değişebileceğinden, öğrenciyi özellik seçiminden ayırma zahmetini ortadan kaldırır. .
"Overfitting Problem (Code Article)" da böyle bir resmimiz var (en iyisi
Yaklaşık 0.057):
Modelin genelleme hatasının, düzenlileştirme katsayısı ile değiştiğini ve genelleme hatasını en aza indirenin seçildiğini gösterir.En iyisi, parametre uzayındaki bazı özelliklerin kaybolmasına karşılık gelir:
coefs_lasso =
alfa = np.linspace (0,01,0,5,1000)
için a içinde alphas:
kement = Kement (alfa = a)
lasso.fit (X, y)
coefs_lasso.append ((lasso.coef_))
Düzenlilik, modelin optimizasyonuna katıldığı için çok kullanışlı bir yöntemdir, ancak modelin kendisine bağlı değildir, bu nedenle birçok modele gömülebilir. Doğrusal Regresyonda gömülü ise, daha önce defalarca tartıştığımız formdur, ancak bir vektör makinesine gömülü ise, özellik seçiminde de rol oynayabilir.
Modelin perspektifinden özellik seçimine bakıldığında, özü, daha iyi performans, daha hızlı eğitim hızı ve hatta daha iyi yorumlanabilirlik elde etmek için modelimizin girdi değişkenlerinin boyutsallığını azaltmaktır.
Öyleyse benzer bir amaca ulaşmanın başka bir yolu var mı? Bir sonraki makalede boyutsallık azaltma ile özellik seçimi arasındaki farkı ve boyutsal azaltmayı uygun şekilde nasıl uygulayabileceğimizi tanıtacağız.
Çekirdeği okuyun
Sınıf İPUÇLARI
Bu makaledeki veriler, esas olarak regresyon sorunları için "Aşırı Yerleştirme Problemi (Kod)" daki verilerle aynıdır. Bir sınıflandırma problemi ise, filtreleme yöntemindeki korelasyon katsayısı ve karşılıklı bilgi yöntemi buna göre değiştirilmeli sklearn.featureselection ve chi2 fclassif ve mutualinfoclassif kullanmalıyız.
Bu makalede kullanılan spearman katsayısı yöntemi Scipy'nin istatistiksel modülünden gelmektedir. Ek olarak, yaygın olarak kullanılan filtreleme yöntemlerinin gerektirdiği işlevlerin neredeyse tamamı Scipy'de bulunabilir.
Teorik olarak, filtreleme yöntemiyle çıkarılan özellikler, sarma yöntemi ile kaldırılanlarla aynı olmalıdır.Ancak, gerçek durumlarda, verilerin dağılımı bilinmediğinden, filtreleme yönteminin birçok matematiksel varsayımı, gerçek veriler bile artık geçerli değildir. İlişki çok büyüktür ve ilişki çok karmaşıktır ve filtreleme yönteminin özellikleri genellikle sarma yönteminin özelliklerinden farklıdır.
Sarma yönteminin prensibi basit ve algoritmanın kullanımı kolay olmasına rağmen, pratikte çoğu zaman birçok özellik vardır ve hesaplama miktarı çok büyük olacaktır. Bu nedenle, düzenleme yöntemi genellikle insanlar tarafından kullanılır ve filtreleme kuralı genellikle bir referans değer yöntemi olarak kullanılır ve filtreleme, özellik seçiminin son noktası olarak görülmez.
Yazar: Head & Shoulders olmadan keşiş
Yeniden yazdırmanız gerekirse, lütfen arka planda bir mesaj bırakın ve yeniden yazdırma şartnamelerine uyun.