2016-01-27 174 views
1

我使用Matlab的統計和機器學習工具箱來創建決策樹,合奏,Knn模型等。我想將我的數據分成訓練/測試分區,然後得到模型訓練並使用訓練數據進行交叉驗證(實質上將訓練數據分解爲訓練數據和驗證數據),同時保留測試數據的錯誤度量。使用測試數據不以任何方式對模型進行訓練是非常重要的。對於我的決策樹,我有類似下面的代碼:Matlab機器學習火車,驗證,測試分區

chess = csvread(filename); 
predictors = chess(:,1:6); 
class = chess(:,7); 

cvpart = cvpartition(class,'holdout', 0.3); 
Xtrain = predictors(training(cvpart),:); 
Ytrain = class(training(cvpart),:); 
Xtest = predictors(test(cvpart),:); 
Ytest = class(test(cvpart),:); 


% Fit the decision tree 
tree = fitctree(Xtrain, Ytrain, 'CrossVal', 'on'); 

% Error Metrics 
testingLoss = loss(tree,Xtest,Ytest,'Subtrees','all'); % Testing 
resubcost = resubLoss(tree,'Subtrees','all'); % Training 
[cost,secost,ntermnodes,bestlevel] = cvloss(tree,'Subtrees','all'); % Cross Val 

但是,試圖找到測試錯誤,當它返回

Undefined function 'loss' for input arguments of 
type 'classreg.learning.partition.ClassificationPartitionedModel'. 

。我已經嘗試了使用不同類型的分類算法的類似方法的幾種組合,但由於分區數據,不能將測試數據應用於交叉驗證的模型。我應該如何將測試數據應用於交叉驗證模型?

回答

1

當您在調用fitctree時使用交叉驗證時,默認情況下會在用於訓練模型的70%數據中構建10個模型摺疊。您可以通過找到kFoldLoss(各型號倍以內):

modelLoss = kfoldLoss(tree); 

由於到fitctree構建原來的呼叫模型10折,有10個獨立訓練的模型。 10個模型中的每一個都包含在單元格數組中,位於tree.Trained。對於例如,你可以使用第一訓練模型通過測試您伸出損失數據:

testingLoss = loss(tree.Trained{1},Xtest,Ytest,'Subtrees','all'); % Testing 
0

可以使用kfoldLoss功能也得到每個倍CV的損失,然後選擇訓練的模式,爲您提供了以下方式至少CV損失:

modelLosses = kfoldLoss(tree,'mode','individual'); 

上面的代碼將會給你長度10的載體,如果你已經做了10倍交叉驗證,同時學習。假設具有最小CV誤差的經過訓練的模型是第k個,那麼您將使用:

testSetPredictions = predict(tree.Trained{k}, testSetFeatures);