2017-03-22 9 views
0

Ich bin im Aufbau eines binären Klassifikationsmodells und habe eine Eingabedatei für svm-train (svm_input.txt) erstellt. Diese Eingabedatei hat 453 Zeilen, 4 Nr. Merkmale und 2 Nr. Klassen [0,1]. dh 0 1: 15.0 2: 40.0 3 30.0 4 15.0 1 1: 22,73 2: 40.91 3: 36.36 4: 0,0 1 1: 31,82 2: 27.27 3: 22.73 4: 18,18 0 1: 22,73 2 : 13,64 3: 36,36 4: 27,27 1 1: 30,43 2: 39,13 3: 13,04 4: 17,39 ......................SVM Zug Ausgabedatei hat weniger Zeilen als die der Eingabedatei

Mein Problem Wenn ich die Anzahl der Zeilen in dem von svm-train (svm_train_model.txt) erzeugten Ausgabemodell zähle, hat dies 12 Zeilen weniger als die der Eingabedatei. Die Linie 450 zeigt hier zählen, obwohl es selbstverständlich auch 9 Zeilen zu Beginn zeigen die verschiedenen Parameter dh

svm_type c_svc kernel_type RBF gamma 1 nr_class 2 total_sv 441 erzeugt rho -0,156449 Label 0 1 nr_sv 228 213 SV

Also 12 Zeilen insgesamt von der ursprünglichen Eingabe von 453 gegangen. Ich bin neu bei SVM und habe gehofft, dass jemand etwas Licht in die Frage bringen könnte, warum das passiert sein könnte? Vielen Dank im Voraus

Aktualisiert .........

Ich glaube jetzt, dass das Modell bei der Erzeugung hat es Linien entfernt, wobei die Etiketten und alle Parameter sind genau die gleichen.

Um zu erklären ............... Meine Eingabe ist ein Satz von miRNAs, die in Abhängigkeit von ihrer Beteiligung an einem bestimmten Prozess als 1 und 0 eingestuft wurden (dh 1 = Ja & 0 = Nein). Die Eingabedatei sieht etwa so .......

0 1:22 2:30 3:14 4:16

1 1:26 2:15 3:17 4:25

0 1:22 2:30 3:14 4:16

Wobei die Zeilen eins und drei genau gleich sind und daher aus dem Ausgabemodell entfernt werden. Meine Frage ist dann, warum das Output-Modell das tun würde und wie ich das umgehen kann (während ich die gleichen Features nutze)?

Während sowohl die Labels als auch die zugehörigen Feature-Werte in der Eingabedatei identisch sind, handelt es sich immer noch um verschiedene miRNAs.

HINWEIS: Die Eingabedatei verfügt nicht über eine Funktion für den miRNA-Namen (und dies würde deutlich die Unterschiede in jeder Zeile anzeigen), jedoch haben einige der miRNAs hinsichtlich der verwendeten Funktionen (z. B. Nukleotidprozentsatz) genau der gleiche prozentuale Inhalt von A, U, G & C und folglich als Duplikate betrachtet und dann aus dem Ausgabemodell entfernt, da es sie offensichtlich als Duplikate ansieht, obwohl sie nicht vorhanden sind (daher gibt es weniger Zeilen im Ausgabemodell)).

das Format der Eingabedatei:

Wo:

Spalte 0 - Label (i.e 1 oder 0): 1 = Ja & 0 = kein

Spalte 1 - Eigenschaft 1 = Anteil "A"

Spalte 2 - Merkmal 2 = Anteil "U"

Spalte 3 - Merkmal 3 = Anteil „G“

Spalte 4 - Feature 4 = Anteil „C“

Die Eingabedatei sieht tatsächlich so etwas wie (Siehe die ersten zwei Zeilen weiter unten), da sie identisch erscheinen, jedoch jede Linie repräsentiert ein anderes m iRNA):

1 1:23 2:36 3:23 4:18

1 1:23 2:36 3:23 4:18

0 1:36 2:32 3: 5 4:27

1 1:14 2:41 3:36 4: 9

1 1:18 2:50 3:18 4:14

0 1:36 2:23 3 : 23 4:18

0 1:15 2: 40 3:30 4:15

In Bezug auf die Software, ich bin mit LIBSVM-3.22 und Python 2.7.5

+0

Es würde helfen, ein haben [MCVE] zu versuchen, das Problem zu reproduzieren. – Cecilia

Antwort

0

richtig Eingabedatei ausrichten, ist meine erste Beobachtung. Der Code für libsvm sucht nicht nach genau 4 Features. Ich identifiziere anhand der String-Literale, die Sie zur Verfügung gestellt haben, die Features von den Labels. Ich schlage vor, Ihre Eingabedatei manuell zu konvertieren, um das gewünschte Eingabeargument zu erstellen. Versuchen Sie den folgenden Code in Python zu laufen Anforderungen - h5py, wenn Ihre Eingabe von Matlab ist. (.mat Datei) pip installieren h5py

import h5py 
f = h5py.File('traininglabel.mat', 'r')# give label.mat file for training 
variables = f.items() 
labels = [] 
c = [] 
import numpy as np 
for var in variables: 
    data = var[1] 
    lables = (data.value[0]) 
trainlabels= [] 
for i in lables: 
    trainlabels.append(str(i)) 

finaltrain = [] 
trainlabels = np.array(trainlabels) 
for i in range(0,len(trainlabels)): 
    if trainlabels[i] == '0.0': 
     trainlabels[i] = '0' 
    if trainlabels[i] == '1.0': 
    trainlabels[i] = '1'  
    print trainlabels[i] 


f = h5py.File('training_features.mat', 'r') #give features here 
variables = f.items() 
lables = [] 

file = open('traindata.txt', 'w+') 

for var in variables: 
    data = var[1] 

lables = data.value 

for i in range(0,1000): #no of training samples in file features.mat 
    file.write(str(trainlabels[i])) 
    file.write(' ') 
    for j in range(0,49): 
     file.write(str(lables[j][i])) 
     file.write(' ') 
    file.write('\n') 
+0

Ja, ich habe die Eingabedatei richtig ausgerichtet, aber wenn ich hier poste, scheint es den Text aus irgendeinem Grund durcheinander zu bringen. – Doc

+0

Also was ich hier herausgefunden habe, ist, dass Sie versuchen, jede der RNAs basierend auf ihrer Beteiligung am Prozess zu klassifizieren, sagen Sie P. Und Sie haben anders. Das Interessante, das hier zu beachten ist, ist, dass der Algorithmus in SVM versucht, nur eindeutige Eingaben zu machen. Ich verstehe Ihre Logik hier nicht, da für den Algorithmus beide Daten gleich sind. Warum versuchen Sie es dann zweimal oder dreimal mit den gleichen Etiketten zu geben? Es ist redundant. Geben Sie außerdem normalisierte Features und nicht die tatsächlichen Prozentwerte an. Es reduziert sehr viel Zeit. –

Verwandte Themen