このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
kfoldEdge
学習で使用しない観測値の分類エッジ
説明
は、1 つ以上の e
= kfoldEdge(CVMdl
,Name,Value
)Name,Value
引数のペアによって指定された追加オプションを使用します。たとえば、復号化方式、エッジの計算に使用する分割、詳細レベルなどを指定します。
入力引数
線形分類モデルから構成される交差検証済みの ECOC モデル。ClassificationPartitionedLinearECOC
モデル オブジェクトとして指定します。ClassificationPartitionedLinearECOC
モデルを作成するには、fitcecoc
を使用し、以下を行います。
交差検証用の名前と値のペアの引数のいずれか 1 つ (
CrossVal
など) を指定名前と値のペアの引数
Learners
を、'linear'
に、またはtemplateLinear
によって返される線形分類モデル テンプレートに設定
推定値を取得するため、kfoldEdge は ECOC モデルの交差検証に使用したものと同じデータ (X
および Y
) を適用します。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
バイナリ学習器の損失関数。'BinaryLoss'
と組み込みの損失関数名または関数ハンドルから構成されるコンマ区切りのペアとして指定します。
次の表には、組み込み関数の名前と説明が含まれています。ここで、yj は特定のバイナリ学習器のクラス ラベル (集合 {-1,1,0} 内)、sj は観測値 j のスコア、g(yj,sj) はバイナリ損失の式です。
値 説明 スコア領域 g(yj,sj) "binodeviance"
二項分布からの逸脱度 (–∞,∞) log[1 + exp(–2yjsj)]/[2log(2)] "exponential"
指数 (–∞,∞) exp(–yjsj)/2 "hamming"
ハミング [0,1] または (–∞,∞) [1 – sign(yjsj)]/2 "hinge"
ヒンジ (–∞,∞) max(0,1 – yjsj)/2 "linear"
線形 (–∞,∞) (1 – yjsj)/2 "logit"
ロジスティック (–∞,∞) log[1 + exp(–yjsj)]/[2log(2)] "quadratic"
2 次 [0,1] [1 – yj(2sj – 1)]2/2 バイナリ損失は、yj = 0 の場合に損失が 0.5 になるように正規化されます。また、各クラスについて平均のバイナリ損失が計算されます。
カスタム バイナリ損失関数、たとえば
customFunction
は関数ハンドル'BinaryLoss',@customFunction
を指定します。customFunction
は以下のような形式になります。ここでbLoss = customFunction(M,s)
M
はMdl.CodingMatrix
に格納された K 行 B 列の符号化行列です。s
は 1 行 B 列の分類スコアの行ベクトルです。bLoss
は分類損失です。このスカラーは、特定のクラスのすべての学習器についてバイナリ損失を集計します。たとえば、平均バイナリ損失を使用して、各クラスの学習器の損失を集計できます。K は、クラスの数です。
B はバイナリ学習器の数です。
カスタムなバイナリ損失関数を渡す例については、カスタム バイナリ損失関数の使用による ECOC モデルのテスト標本ラベルの予測を参照してください。
既定の設定では、すべてのバイナリ学習器が以下を使用する線形分類モデルである場合、次のようになります。
SVM の場合、
BinaryLoss
は'hinge'
になります。ロジスティック回帰の場合、
BinaryLoss
は'quadratic'
になります。
例: 'BinaryLoss','binodeviance'
データ型: char
| string
| function_handle
バイナリ損失を集計する復号化方式。'Decoding'
と 'lossweighted'
または 'lossbased'
から構成されるコンマ区切りのペアとして指定します。詳細については、バイナリ損失を参照してください。
例: 'Decoding','lossbased'
分類スコアの予測に使用する分割のインデックス。正の整数の数値ベクトルとして指定します。Folds
の要素は 1
から CVMdl.KFold
の範囲でなければなりません。
例: Folds=[1 4 10]
データ型: single
| double
エッジの集約レベル。"average"
または "individual"
として指定します。
値 | 説明 |
---|---|
"average" | 分割全体で平均した分類エッジを返す |
"individual" | 各分割について分類エッジを返す |
例: Mode="individual"
推定オプション。statset
によって返される構造体配列として指定します。
並列計算を起動するには、Parallel Computing Toolbox™ ライセンスが必要です。
例: Options=statset(UseParallel=true)
データ型: struct
詳細レベル。0
または 1
として指定します。Verbose
は、コマンド ウィンドウに表示される診断メッセージの量を制御します。
Verbose
が 0
の場合、診断メッセージは表示されません。それ以外の場合は、診断メッセージが表示されます。
例: Verbose=1
データ型: single
| double
出力引数
交差検証済みの分類エッジ。数値スカラー、ベクトルまたは行列として返されます。
交差検証済みモデルの正則化強度の個数を L
(つまり、L は numel(CVMdl.Trained{1}.BinaryLearners{1}.Lambda)
)、分割数 (CVMdl.KFold
に格納) を F
とします。
Mode
が'average'
の場合、e
は 1 行L
列のベクトルになります。e(
は、正則化強度j
)j
を使用する交差検証済みモデルのすべての分割に対する平均分類エッジです。それ以外の場合、
e
はF
行L
列の行列になります。e(
は、正則化強度i
,j
)j
を使用する交差検証済みモデルの分割i
に対する分類エッジです。
例
NLP のデータ セットを読み込みます。
load nlpdata
X
は予測子データのスパース行列、Y
はクラス ラベルの categorical ベクトルです。
簡単にするため、'simulink'
、'dsp'
、'comm'
のいずれでもない Y
の観測値すべてに対して 'others' というラベルを使用します。
Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others';
マルチクラス線形分類モデルを交差検証します。
rng(1); % For reproducibility CVMdl = fitcecoc(X,Y,'Learner','linear','CrossVal','on');
CVMdl
は ClassificationPartitionedLinearECOC
モデルです。既定では、10 分割交差検証が実行されます。'KFold'
名前と値のペアの引数を使用して分割数を変更できます。
分割外のエッジの平均を推定します。
e = kfoldEdge(CVMdl)
e = 1.4464
あるいは、kfoldEdge
内の名前と値のペアの引数 'Mode','individual'
を指定することで各分割エッジを取得できます。
特徴選択を実行する方法の 1 つは、複数のモデルの k 分割エッジを比較することです。この条件のみに基づくと、エッジが最高となる分類器が最善の分類器となります。
NLP のデータ セットを読み込みます。k 分割交差検証エッジの推定で説明されているようにデータを前処理し、観測値が列に対応するように予測子データを配置します。
load nlpdata Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others'; X = X';
2 つのデータ セットを作成します。
fullX
にはすべての予測子が含まれます。partX
には、無作為に選択された 1/2 の予測子が含まれています。
rng(1); % For reproducibility p = size(X,1); % Number of predictors halfPredIdx = randsample(p,ceil(0.5*p)); fullX = X; partX = X(halfPredIdx,:);
SpaRSA を使用して目的関数を最適化するように指定する線形分類モデル テンプレートを作成します。
t = templateLinear('Solver','sparsa');
バイナリ線形分類モデルから構成されている 2 つの ECOC モデルを交差検証します。1 つではすべての予測子を、もう 1 つでは半分の予測子を使用します。観測値が列に対応することを指定します。
CVMdl = fitcecoc(fullX,Y,'Learners',t,'CrossVal','on',... 'ObservationsIn','columns'); PCVMdl = fitcecoc(partX,Y,'Learners',t,'CrossVal','on',... 'ObservationsIn','columns');
CVMdl
および PCVMdl
は ClassificationPartitionedLinearECOC
モデルです。
各分類器について k 分割エッジを推定します。
fullEdge = kfoldEdge(CVMdl)
fullEdge = 0.6181
partEdge = kfoldEdge(PCVMdl)
partEdge = 0.5235
k 分割エッジによれば、すべての予測子を使用する分類器の方がモデルとして優れています。
ロジスティック回帰学習器を使用する線形分類モデルに適した LASSO ペナルティの強度を決定するため、k 分割エッジを比較します。
NLP のデータ セットを読み込みます。k 分割エッジを使用した特徴選択で説明されているようにデータを前処理します。
load nlpdata Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others'; X = X';
~ の範囲で対数間隔で配置された 8 つの正則化強度を作成します。
Lambda = logspace(-8,1,8);
線形分類モデル テンプレートを作成します。このテンプレートでは、LASSO ペナルティがあるロジスティック回帰を使用し、各正則化強度を使用し、SpaRSA を使用して目的関数を最適化し、目的関数の勾配の許容誤差を 1e-8
に下げるように指定します。
t = templateLinear('Learner','logistic','Solver','sparsa',... 'Regularization','lasso','Lambda',Lambda,'GradientTolerance',1e-8);
5 分割の交差検証を使用して、バイナリ線形分類モデルから構成されている ECOC モデルを交差検証します。
rng(10) % For reproducibility CVMdl = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns','KFold',5)
CVMdl = ClassificationPartitionedLinearECOC CrossValidatedModel: 'LinearECOC' ResponseName: 'Y' NumObservations: 31572 KFold: 5 Partition: [1×1 cvpartition] ClassNames: [comm dsp simulink others] ScoreTransform: 'none' Properties, Methods
CVMdl
は ClassificationPartitionedLinearECOC
モデルです。
各分割および正則化強度のエッジを推定します。
eFolds = kfoldEdge(CVMdl,'Mode','individual')
eFolds = 5×8
0.5520 0.5524 0.5528 0.5508 0.4936 0.2933 0.1029 0.0853
0.5241 0.5255 0.5259 0.5260 0.4773 0.2945 0.1052 0.0868
0.5281 0.5298 0.5301 0.5302 0.4786 0.2880 0.1034 0.0868
0.5389 0.5404 0.5408 0.5373 0.4833 0.2910 0.1022 0.0854
0.5497 0.5552 0.5586 0.5571 0.4936 0.2949 0.1027 0.0849
eFolds
は 5 行 8 列のエッジの行列です。行は分割に、列は Lambda
の正則化強度に対応します。eFolds
を使用して、性能が低い分割、つまり非常に低いエッジを特定します。
各正則化強度について、すべての分割に対する平均エッジを推定します。
e = kfoldEdge(CVMdl)
e = 1×8
0.5386 0.5407 0.5417 0.5403 0.4853 0.2923 0.1033 0.0858
各正則化強度について 5 分割エッジの平均をプロットすることにより、モデルがどの程度一般化を行うかを判断します。グリッド全体で 5 分割エッジを最大化する正則化強度を特定します。
figure plot(log10(Lambda),log10(e),'-o') [~, maxEIdx] = max(e); maxLambda = Lambda(maxEIdx); hold on plot(log10(maxLambda),log10(e(maxEIdx)),'ro') ylabel('log_{10} 5-fold edge') xlabel('log_{10} Lambda') legend('Edge','Max edge') hold off
いくつかの Lambda
の値で同じようにエッジが高くなっています。正則化強度の値が大きくなると、予測子変数がスパースになります。これは分類器の品質として優れています。
エッジが低下する直前にある正則化強度を選択します。
LambdaFinal = Lambda(4);
データ セット全体を使用して、線形分類モデルから構成されている ECOC モデルに学習をさせます。正則化強度として LambdaFinal
を指定します。
t = templateLinear('Learner','logistic','Solver','sparsa',... 'Regularization','lasso','Lambda',LambdaFinal,'GradientTolerance',1e-8); MdlFinal = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns');
新しい観測値のラベルを推定するには、MdlFinal
と新しいデータを predict
に渡します。
詳細
"バイナリ損失" は、バイナリ学習器がどの程度の精度で観測値をクラスに分類するかを決定する、クラスと分類スコアの関数です。ソフトウェアでバイナリ損失をどのように集計して各観測値の予測クラスを判定するかは、ECOC モデルの "復号化方式" で指定します。
以下のように仮定します。
mkj は符号化設計行列 M の要素 (k,j)、つまりバイナリ学習器 j のクラス k に対応する符号。M は K 行 B 列の行列であり、K はクラスの数、B はバイナリ学習器の数です。
sj は観測値に対するバイナリ学習器 j のスコア。
g はバイナリ損失関数。
は観測値の予測クラス。
ソフトウェアでは 2 つの復号化方式をサポートしています。
関数 predict
、resubPredict
、および kfoldPredict
は、それぞれの観測値とクラスについて、argmin
の目的関数の符号反転値を 2 番目の出力引数 (NegLoss
) として返します。
次の表は、サポートされる損失関数をまとめたものです。ここで、yj は特定のバイナリ学習器のクラス ラベル (集合 {–1,1,0} 内)、sj は観測値 j のスコア、g(yj,sj) はバイナリ損失関数です。
値 | 説明 | スコア領域 | g(yj,sj) |
---|---|---|---|
"binodeviance" | 二項分布からの逸脱度 | (–∞,∞) | log[1 + exp(–2yjsj)]/[2log(2)] |
"exponential" | 指数 | (–∞,∞) | exp(–yjsj)/2 |
"hamming" | ハミング | [0,1] または (–∞,∞) | [1 – sign(yjsj)]/2 |
"hinge" | ヒンジ | (–∞,∞) | max(0,1 – yjsj)/2 |
"linear" | 線形 | (–∞,∞) | (1 – yjsj)/2 |
"logit" | ロジスティック | (–∞,∞) | log[1 + exp(–yjsj)]/[2log(2)] |
"quadratic" | 2 次 | [0,1] | [1 – yj(2sj – 1)]2/2 |
yj = 0 のときに損失が 0.5 になるようにバイナリ損失が正規化され、バイナリ学習器の平均が集計に使用されます[1]。
ECOC 分類器の全体的な性能の尺度である全体の分類損失 (オブジェクト関数 kfoldLoss
および kfoldPredict
の名前と値の引数 LossFun
により指定) とバイナリ損失を混同しないでください。
"分類エッジ" は、分類マージンの加重平均です。
特徴選択を実行する場合などに複数の分類器から選択する方法の 1 つは、エッジが最大になる分類器を選択することです。
"分類マージン" は、各観測値における真のクラスの負の損失と偽のクラスの負の最大損失の差です。各マージンのスケールが同じである場合、マージンを分類の信頼尺度として使用できます。複数の分類器の中で、マージンが大きい分類器の方が優れています。
参照
[1] Allwein, E., R. Schapire, and Y. Singer. “Reducing multiclass to binary: A unifying approach for margin classifiers.” Journal of Machine Learning Research. Vol. 1, 2000, pp. 113–141.
[2] Escalera, S., O. Pujol, and P. Radeva. “Separability of ternary codes for sparse designs of error-correcting output codes.” Pattern Recog. Lett. Vol. 30, Issue 3, 2009, pp. 285–297.
[3] Escalera, S., O. Pujol, and P. Radeva. “On the decoding process in ternary error-correcting output codes.” IEEE Transactions on Pattern Analysis and Machine Intelligence. Vol. 32, Issue 7, 2010, pp. 120–134.
拡張機能
並列実行するには、この関数を呼び出すときに名前と値の引数 Options
を指定し、statset
を使用してオプション構造体の UseParallel
フィールドを true
に設定します。
Options=statset(UseParallel=true)
並列計算の詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
この関数は、GPU 配列を完全にサポートします。詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2016a で導入R2023b 以降では、次の分類モデルのオブジェクト関数において、予測子に欠損値がある観測値が再代入 ("resub") と交差検証 ("kfold") による分類エッジ、損失、マージン、および予測の計算でその一部として使用されます。
以前のリリースでは、予測子に欠損値がある観測値は再代入と交差検証の計算で省略されていました。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)