大多數機器學習分類器在遇到沒有前面看到的特徵的實例時,會將該示例與訓練數據中最頻繁的類分類。爲什麼不能線性預測多數類?
這似乎不是liblinear-java的情況,我想知道這是爲什麼。下面是一些示例代碼,我構造物,其中有兩個功能,一個樣的問題,訓練數據有4倍之多0
標籤爲1
標籤:
Problem problem = new Problem();
problem.l = 5;
problem.n = 2;
problem.x = new FeatureNode[][] {
new FeatureNode[] { new FeatureNode(1, 1) },
new FeatureNode[] { new FeatureNode(1, 1) },
new FeatureNode[] { new FeatureNode(1, 1) },
new FeatureNode[] { new FeatureNode(1, 1) },
new FeatureNode[] { new FeatureNode(2, 1) },
};
problem.y = new int[] {0, 0, 0, 0, 1};
Parameter parameter = new Parameter(SolverType.L2R_L2LOSS_SVC, 1.0, 0.01);
Model model = Linear.train(problem, parameter);
現在讓我們來測試這對一個新的功能,3
,這沒有在訓練數據中。由於訓練過的模型對特徵3
一無所知,我預計預測的類將是0
,這是訓練數據中最常見的類。
FeatureNode[] instance = new FeatureNode[] { new FeatureNode(3, 1) };
int prediction = Linear.predict(model, instance);
System.err.println(prediction);
最後一行打印出1
但是。這是爲什麼?
這取決於分隔線的設置位置,您可以添加模型的學習參數嗎?我相信它是在1/1和2/1之間,所以2/1以上的所有東西都會被分類爲1,所有的東西都會低於0. – 2013-02-19 10:19:52
只是猜測:是的,你的假設是正確的,它應該指派具有最高存在的類。問題在於算法如何處理看不見的功能:a)代碼中可能存在一個錯誤(看不見的分配給第一類),或者b)解算器被定義爲以這種方式執行(出於某種理論原因)。我會檢查解算器應該如何工作,或者我會在其他一些sw中嘗試相同的ML算法(R,Weka,...) – xhudik 2013-02-19 10:20:28
似乎未指定的特徵值默認爲零。您的測試實例因此對分類器顯示爲'(0,0)'。如果你不使用偏差,分界線會穿過這個點,所以兩個輸出同樣可能(不管訓練集是多少)。畢竟,我沒有看到像這樣的測試中的重點。如果數據中缺少值,將它們設置爲零(隱式)可能不是使用SVM時的最佳策略。嘗試找到一些解釋缺失數據的學習算法。 – 2013-02-21 08:36:12