Sunulan sorunun çözümü için gerçek tarif (olası bir çözüm)
-Q seçeneği ile ikinci dereceden (çapraz) özellikleri destekleyen en sevdiğim makine-öğrenme aracı olan vowpal wabbit'i kullanarak bu sorunu çözmek basittir .
vowpal wabbit arka plan
Kullanım detaylarına geçmeden önce. vowpal wabbit, hem sınıflandırma hem de regresyon için hızlı ve ölçeklenebilir bir çevrimiçi makine öğrenme yazılımıdır. Çevrimiçi öğrenme aracı olarak, verilerin tamamını belleğe yüklemeyi gerektirmediğinden, masaüstümde saniyede yaklaşık 5 milyon özellikli öğrenme (eğitim) oranları elde ediyorum (veri sayısı (örnek sayısı)). Diğer birçok çekici özelliğe sahiptir: bu sorunun kapsamı dışında olan farklı öğrenme algoritmaları, çoklu kayıp fonksiyonları, seyrek özellikler, karışık özellik türleri ve daha fazlası için destek.
Sorunu yorum ile çözmenin 3 adımı:
Adım 0: Github'dan Vowpal WABbit'i indirin ve oluşturun (desteklenen ortamlarda aşağıdaki nota bakın)
Adım 1: Her hattın şöyle göründüğü bir eğitim seti hazırlayın:
1.0 protein1/protein2|A p1_feature1 p1_feature2 ... |B p2_feature1 ...
...
eğitim seti formatının açıklaması:
En soldaki sayı olan 1.0 , etikettir (herhangi bir sayısal değer olabilen etkileşim gücü), ikinci dize ' protein1 / protein2 ', çizgiye bir kimlik vermek için bir etikettir, IOW: "Bu çizgi, protein1 ve protein2" ; İsteğe bağlıdır ve bunu bir yorum olarak düşünebilirsiniz. Bu etiket dizesi, hangi tahminin hangi örneğe ait olduğunu belirlemek için modellerden gelen tahminlerde de tekrarlanır, ancak burada tahmin etmiyoruz, sadece modelimizi modelliyor ve inceliyoruz. Daha sonra protein1 için giriş özelliği ad alanı geliyor |A
(farklı ad alanları arasında geçiş yapabilmemiz için bir ad alanı tanımlamamız gerekiyor, olması gerekmiyorA
, aslında herhangi bir sözcük olabilir, ancak ilk harfin ad boşlukları arasında farklı olması gerekir, böylece bunları komut çağrısında geçebiliriz) ve ardından protein1 için girdi özellikleri listesi gelir p1_...
. Son olarak protein2 için isim-alanı gelir: |B
ardından protein2'nin özellik-adları gelir p2_...
.
Vowpal wabbit'in güzelliklerinden biri, özellik adları için rastgele dizeler kullanabilmenizdir (bunları dahili olarak hash eder, ancak umursamazsınız). Eğitim setindeki tek özel karakter şunlardır:
- boşluklar (belli ki)
|
, giriş özelliklerinin ve ad boşluklarının önekini eklemek ve
:
özellik adlarını değerlerinden ayırmak için
:
Biz onların değerlerini varsayılan böylece her proteinin özelliği adı bir boolean (varlığı) temsil varsayalım, çünkü burada kullanılmaz 1
ve açık değerleri gerek yoktur.
Artık vowpal_wabbit (çalıştırılabilir ad vw
) ile -q AB
, bir özelliğin protein1 (ad adıyla başlayan A
) ve diğerinin protein2 ( ad-alanı ile başlayan B
). vowpal_wabbit, verileri okuyacak, her bir özellik kombinasyonu için protein çifti arasında bir miktar etkileşime neden olan ağırlıkları olan bir model öğrenecek ve oluşturacaktır. Burada, vw
doğrudan koşmak yerine, vw-varinfo
son adımımız olarak vowpal wabbit ile birlikte gelen sarmalayıcı yardımcı programı ile çalışacağız. modeli oluşturmak için vw-varinfo
çalışır vw
ve modeli insan tarafından okunabilir biçimde döker.
Adım 3: Vw-varinfo'yu şu şekilde arayın :
vw-varinfo -q AB -c --passes 20 your_data_set_file
vw-varinfo tüm seçenekleri ( -q ... -c --passes ...
) olduğu gibi geçirecektir vw
. Yalnızca -q AB
iki özellik ad boşluğunu geçmek için gereklidir. Daha iyi sonuçlar vereceğine inandığım bir seçenek daha ekledim (birden fazla geçişi çalıştırın).
Bu komut vw
, veri kümesi üzerinde antrenman yapmak için vowpal wabbit ( ) 'i çağırır ve aradığımı düşündüğüm çıktıyı yazdırır: tüm özellik etkileşimleri güç sırasına ve göreceli ağırlıklarına göre.
Örnek giriş ve çıkış
Girdinizi varsayalım, prot.dat
3 protein arasında 3 yönlü bir etkileşim içerir:
1.0 protein1/protein2|A a b |B k m
0.6 protein2/protein3|A k m |B b c d
2.2 protein1/protein3|A a b |B b c d
Bu kasten çok minimalist bir örnektir. vw
çok daha büyük veri kümeleriyle (örneğin milyonlarca satır, yüzlerce özellik) herhangi bir sorun olmamalı, ayrıca örneklerde etkileşim gücü etiketlerini değiştirdim. Durumunuzda etkileşim boolean "evet" veya "hayır" ise, her satırdaki 1. alan olarak (etkileşim yok) 0
veya 1
(etkileşim var) kullanın.
Koşu:
vw-varinfo -q AB -c --passes 20 prot.dat
Olası tüm etkileşimleri (ad boşluklarını A
ve B
çıktıdaki yoksay ) ve ağırlıklarını verir:
FeatureName HashVal MinVal MaxVal Weight RelScore
A^k 220268 0.00 1.00 +0.3804 100.00%
A^k^B^k 254241 0.00 0.00 +0.3804 100.00%
A^k^B^m 93047 0.00 0.00 +0.3804 100.00%
B^k 178789 0.00 1.00 +0.1011 26.58%
B^m 17595 0.00 1.00 +0.1011 26.58%
[... trimmed for brevity ...]
A^m^B^m 141879 0.00 0.00 +0.0000 0.00%
Constant 116060 0.00 0.00 +0.1515 0.00%
A^b 139167 0.00 1.00 -0.0641 -16.86%
A^b^B^k 204424 0.00 0.00 -0.1233 -32.43%
A^b^B^m 43230 0.00 0.00 -0.1233 -32.43%
Bu verilerde, genel olarak herhangi bir etkileşime en fazla katkıda bulunanların 1) k
özelliğin sadece varlığı , 2) k
kendisiyle etkileşen özellik (her iki proteinin de var olduğu varsayılarak) ve 3) ile k
etkileşime girdiğini gösterir m
. en zayıf (protein etkileşimine negatif katkı) ise b
özellik ile eşlenen m
özelliktir.
İşte vw-varinfo'da bir NASIL sayfası
vowpal wabbit kaynaktan oluşturulur (yukarıdaki bağlantıya bakın) ve Linux (ve muhtemelen diğer unix'ler), Mac OS-X ve Windows üzerinde çalışır.
HTH