2016-06-12 58 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");的示例时,我只是得到一个异常(因为这些值不存在) - 所以我认为您必须有一个异常处理程序来隐藏这些问题。

就获得准确结果的最小数据而言 - 它确实取决于数据的复杂程度以及其包含的噪声程度。您需要针对一组数据对模型进行训练,然后针对完全不同的一组数据测试其准确性,以便衡量其工作情况。