2014-02-10 26 views
2

我有一個非常小的數據集,只有200行。我只有3列;前兩個是數字(負值和正值),最後一個是字母。Encog框架沒有給可接受的誤差率

我試圖根據前兩個數字列在最後一列分類。

我的逗號分隔的數據看起來類似這樣(前正常化):

HomeTeamLine,AwayTeamLine,Winner-p0,Winner-p1 
-0.40493939,1,-1,0 
-0.22929292,1,-1,0 
-1,-0.9233003,0,-1 

我已經試過我能想到的,包括傳播與模擬神經的每一個方法:歸一化後

Home Team Line,Away Team Line,Winner 
-6,0,H 
-8,0,H 
0,-21,A 
etc... 

示例數據退火,但Encog框架仍然找不到模式。

我的代碼類似於此(從內存中寫入):

// build network 
BasicNetwork network = new BasicNetwork(); 

network.AddLayer(new BasicLayer(new ActivationTANH(), true, 2)); 
network.AddLayer(new BasicLayer(new ActivationTANH(), true, 14)); 
network.AddLayer(new BasicLayer(new ActivationTANH(), true, 2)); 
network.Structure.FinalizeStructure(); 

network.Reset(); 

// train network 
var trainingSet = // load training CSV 
ITrain train = new ResilientPropagation(network, trainingSet); 

do 
{ 
    train.Iteration(); 
    Console.WriteLine("Epoch #" + epoch + " Error:" + train.Error); 
    epoch++; 
} while (train.Error > 0.001); 

我的錯誤率從未低於去74%。

我假設問題是我沒有使用足夠的數據行,或者我沒有使用足夠的功能(列),或者數據中沒有任何模式。

什麼是推薦的方法來實現可接受的錯誤率是多少?

+1

你是如何爲您創造trainingSet理想值?因爲你有2個輸出神經元,所以你可以使用具有二進制值的double [] []'創建'理想'值,例如:對於'H':'new double [] {1,0 }'和'A':'new double [] {0,1}'。 –

+0

謝謝。規範化數據使用兩列:「H = -1,0」和「A = 0,-1」或反之亦然。我不確定這是不是你的意思?我將此列指定爲「OneOf」操作方法。 – user1477388

+0

是的,你明白我想說什麼。由於您使用ActivationTANH作爲激活函數,因此應該將輸出標準化爲與ActivationTANH,'-1'和'1'兼容的正確時間間隔。 –

回答

1

我有另一種澄清。你有兩個來自神經網絡的輸出,但是在任務描述中你會說「我試圖根據前兩個數字列對最後一列進行分類」,這對我來說聽起來有兩個輸入和一個輸出。爲什麼你有另一個輸出?另一個建議是添加一個隱藏層。我不建議添加更多然後兩個隱藏層,因爲在這種情況下,誤差函數

爲錯誤層與層擴展,其與層數成倍縮水。如前所述http://en.wikipedia.org/wiki/Deep_learning

+0

兩個輸出'Winner-p0,Winner-p1'是因爲encog規範化了數據。 – user1477388

+0

從NN預期看來,它看起來像你想給NN兩個輸入並得到兩個輸出。 –

相關問題