matlab残留法実装

1545 ワード

残余法(hold-out)の方法:データセットDを直接2つの反発する集合に分割する、そのうちの1つの集合をトレーニングセットSとし、もう1つをテストセットTとする.S上でモデルを訓練した後,Tを試験誤差として評価し,汎化誤差の推定とした.
二分類タスクを例として、Dが1000個のサンプルを含むと仮定し、これをSが700個のサンプルを含むように区分し、Tが300個のサンプルを含むようにSで訓練し、モデルがT上に90個のサンプル分類エラーがある場合、そのエラー率は(90/300)*100%=30%、精度は1-30%=70%である.
注意事項:(1)トレーニング/テストセットの区分は、データ区分プロセスに追加のばらつきが導入され、最終結果に影響を及ぼさないように、できるだけデータ分布の一貫性を維持しなければならない.たとえば、分類タスクで少なくともサンプルのカテゴリスケールを類似させるには、サンプリング中にカテゴリスケールを保持する階層サンプリング方法を使用します.(2)訓練/試験セットのサンプル割合が与えられた後でも、初期データセットDを分割する複数の分割方式が存在する.従って、単回使用残法で得られた推定結果は不安定で信頼性が低いことが多く、残法を使用する場合、残法の評価結果としていくつかのランダム区分、繰り返し試験評価または平均値を採用するのが一般的である.
ここで、もう一つの窮地は、訓練セットSがほとんどのサンプルを含む場合、訓練所のモデルはDで訓練したモデルに近いかもしれないが、Tが比較的小さいため、評価結果が安定で正確ではない可能性があり、試験セットが小さく、評価結果の分散が大きい.テストセットTにいくつかのサンプルを多く含ませると、トレーニングセットSとの差が大きくなり、評価されたモデルはDで訓練されたモデルと比較して大きな差があり、評価結果の忠実性(fidelity)が低下する可能性がある.
一般的な解決策:約2/3~4/5のサンプルをトレーニングに使用し、残りのサンプルをテストに使用する.
clear all;
close all;
clc;
data = csvread('irisdata.csv');
[S,T]=divide(data,0.7);


function [S,T]=divide(data,rate)
    S = [];
    T = [];
    [m, n] = size(data);
    labels = data(:,n);
    labelsClass = unique(labels);
    weight = [];
    for i=1:length(labelsClass)
        weight(i) = round(sum(ismember(labels,labelsClass(i)))*rate);
    end
    for i=1:length(labelsClass)
        index = find(labels==labelsClass(i));
        randomIndex = index(randperm(length(index)));
        S = [S;data(randomIndex(1:weight(i)),:)];
        T = [T;data(randomIndex(weight(i)+1:sum(ismember(labels,labelsClass(i)))),:)];
    end
end