2016-06-12 57 views
0

我使用以下代碼在更改物品的價格,折扣和廣告時查找給定物品的預期銷售量。這是通過使用Accord.Net庫的ID3算法實現的。使用ID3算法預測,Accord.Net框架

namespace PnredictionSales 
{ 
public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     DataTable data = new DataTable("Sales prediction Example"); 

     data.Columns.Add("RowKey"); 
     data.Columns.Add("Brand"); 
     data.Columns.Add("PriceRange"); 
     data.Columns.Add("Discount"); 
     data.Columns.Add("Advertisement"); 
     data.Columns.Add("ExpSales"); 

     // data.Columns.Add("Wind"); 
     // data.Columns.Add("PlayTennis"); 

     data.Rows.Add("D1", "Highland", "R1", "yes", "No", "B"); 
     data.Rows.Add("D2", "Highland", "R1", "yes", "yes", "C"); 
     data.Rows.Add("D3", "Anchor", "R1", "yes", "No", "B"); 
     data.Rows.Add("D4", "Flora", "R2", "yes", "No", "B"); 
     data.Rows.Add("D5", "Flora", "R3", "No", "No", "A"); 
     data.Rows.Add("D6", "Flora", "R3", "No", "yes", "A"); 
     data.Rows.Add("D7", "Anchor", "R3", "No", "yes", "A"); 
     data.Rows.Add("D8", "Highland", "R2", "yes", "No", "B"); 
     data.Rows.Add("D9", "Highland", "R3", "No", "No", "A"); 
     data.Rows.Add("D10", "Flora", "R2", "No", "No", "B"); 
     data.Rows.Add("D11", "Highland", "R2", "No", "yes", "B"); 
     data.Rows.Add("D12", "Anchor", "R2", "yes", "yes", "A"); 
     data.Rows.Add("D13", "Anchor", "R1", "No", "No", "B"); 
     data.Rows.Add("D14", "Flora", "R2", "yes", "yes", "A"); 

     Codification codebook = new Codification(data); 

     DecisionVariable[] attributes = 
     { 
      new DecisionVariable("Brand", 3), new DecisionVariable("PriceRange",3), 
      new DecisionVariable("Discount",2),new DecisionVariable("Advertisement",2) 
     }; 

     int classCount=3; // 2 possible output values for playing tennis: yes or no 

     DecisionTree tree = new DecisionTree(attributes, classCount); 

     // Create a new instance of the ID3 algorithm 
     ID3Learning id3learning = new ID3Learning(tree); 

     // Translate our training data into integer symbols using our codebook: 
     DataTable symbols = codebook.Apply(data); 
     int[][] inputs = symbols.ToIntArray("Brand", "PriceRange","Discount","Advertisement"); 
     int[] outputs = symbols.ToIntArray("ExpSales").GetColumn(0); 

     // Learn the training instances! 

     id3learning.Run(inputs, outputs); 
     int[] query = codebook.Translate("Flora","R1","yes","No"); 

     int output = tree.Compute(query.ToDouble()); 

     string answer = codebook.Translate("ExpSales", output); // answer will be "No". 
     Label1.Text = answer; 
    } 
} 

,我的問題是:

當我把任何字符串值int[] query = codebook.Translate("fff","eee","ffg","qqq");它給了我一個輸出。我想這是什麼原因?我的方法錯了嗎? 另外我想知道爲了得到準確的結果,在數據表中組織數據的最低要求是什麼。

回答

1

我試着運行你的代碼 - 但我得到了一個異常而不是任何輸出。看着它,我認爲問題在於,當您創建編碼時,您不指定要包含哪些列,因此它包含RowKey列,然後沒有排列。相反,創建編碼:

Codification codebook = new Codification(data, "Brand", "PriceRange", "Discount", "Advertisement", "ExpSales"); 

然後它似乎工作。

當我再次嘗試int[] query = codebook.Translate("fff","eee","ffg","qqq");的示例時,我只是得到一個異常(因爲這些值不存在) - 所以我認爲您必須有一個異常處理程序來隱藏這些問題。

就獲得準確結果的最小數據而言 - 它確實取決於數據的複雜程度以及其包含的噪聲程度。您需要針對一組數據對模型進行訓練,然後針對完全不同的一組數據測試其準確性,以便衡量其工作情況。