0

Ich lese gerade "Einführung in das maschinelle Lernen" von Ethem Alpaydin und ich stieß auf die nächsten Zentroid-Klassifikatoren und versuchte es zu implementieren. Ich denke, ich habe den Klassifikator richtig implementiert, aber ich bekomme nur 68% Genauigkeit. Also, ist der nächste Schwerpunkt-Klassifikator selbst ineffizient oder gibt es einen Fehler in meiner Implementierung (unten)?Ist der nächstgelegene Zentroidklassifikator wirklich ineffizient?

Der Datensatz enthält 1372 Datenpunkte jeweils 4 Merkmale aufweist, und es gibt zwei Leistungsklassen Meine Implementierung MATLAB:

DATA = load("-ascii", "data.txt"); 

#DATA is 1372x5 matrix with 762 data points of class 0 and 610 data points of class 1 
#there are 4 features of each data point 
X = DATA(:,1:4); #matrix to store all features 

X0 = DATA(1:762,1:4); #matrix to store the features of class 0 
X1 = DATA(763:1372,1:4); #matrix to store the features of class 1 
X0 = X0(1:610,:); #to make sure both datasets have same size for prior probability to be equal 
Y = DATA(:,5); # to store outputs 

mean0 = sum(X0)/610; #mean of features of class 0 
mean1 = sum(X1)/610; #mean of featurs of class 1 

count = 0; 
for i = 1:1372 
    pre = 0; 
    cost1 = X(i,:)*(mean0'); #calculates the dot product of dataset with mean of features of both classes 
    cost2 = X(i,:)*(mean1'); 

    if (cost1<cost2) 
    pre = 1; 
    end 
    if pre == Y(i) 
    count = count+1; #counts the number of correctly predicted values 
    end 

end 

disp("accuracy"); #calculates the accuracy 
disp((count/1372)*100); 

Antwort

0

Es gibt hier zumindest ein paar Dinge:

  1. Sie verwenden Sie Punktprodukt, um Ähnlichkeit im Eingabebereich zuzuweisen, das ist fast nie gültig. Der einzige Grund, ein Punktprodukt zu verwenden, wäre die Annahme, dass alle Ihre Datenpunkte dieselbe Norm haben oder dass die Norm keine Rolle spielt (fast nie richtig). Versuchen Sie stattdessen Euklidische Entfernung zu verwenden, obwohl es sehr naiv ist - es sollte deutlich besser sein

  2. Ist es ein ineffizienter Klassifikator? Hängt von der Definition der Effizienz ab. Es ist eine extrem einfache und schnelle, aber in Bezug auf die Vorhersagekraft ist es extrem schlecht. In der Tat ist es schlimmer als Naive Bayes, die bereits als "Spielzeugmodell" gilt.

  3. Es ist etwas falsch mit dem Code zu

    X0 = DATA(1:762,1:4); #matrix to store the features of class 0 
    X1 = DATA(763:1372,1:4); #matrix to store the features of class 1 
    X0 = X0(1:610,:); #to make sure both datasets have same size for prior probability to be equal 
    

    Sobald Sie subsamples X0, Sie haben 1220 Trainingsproben, noch später während der „Testen“ Sie testen, auf Training und „Elemente von X0 fehlt“, Aus probabilistischer Sicht macht das keinen Sinn. Zuallererst sollten Sie nie die Genauigkeit des Trainingssatzes testen (da er die wahre Genauigkeit überschätzt). Zweitens, indem Sie Ihre Trainingsdaten subsampling sind, sind Sie nicht Equalising priors. Nicht in der Methode wie dieser, du erniedrigst lediglich die Qualität deiner Schwerpunktschätzung, sonst nichts. Diese Art von Techniken (Unter-/Überabtastung) gleicht Prioren für Modelle aus, die Modell Prioren haben. Deine Methode nicht (da es sich grundsätzlich um ein generatives Modell mit dem angenommenen Prior von 1/2 handelt), also kann nichts Gutes passieren.