Main Content

fsrmrmr

Minimum Redundancy Maximum Relevance (MRMR) アルゴリズムを使用した回帰用の特徴量のランク付け

    説明

    idx = fsrmrmr(Tbl,ResponseVarName) は、MRMR アルゴリズムを使用して特徴量 (予測子) をランク付けします。テーブル Tbl には予測子変数と応答変数が含まれていて、ResponseVarNameTbl 内の応答変数の名前です。関数は idx を返します。これには予測子の重要度順に並べ替えられた予測子のインデックスが含まれます。idx を使用して、回帰問題のための重要な予測子を選択できます。

    idx = fsrmrmr(Tbl,formula) は、formula を使用して Tbl 内の変数を考慮するために応答変数と予測子変数を指定します。たとえば、fsrmrmr(cartable,"MPG ~ Acceleration + Displacement + Horsepower") は、cartable 内の応答変数 MPG を使用して、cartable 内の予測子 AccelerationDisplacement、および Horsepower をランク付けします。

    idx = fsrmrmr(Tbl,Y) は、応答変数 Y を使用して Tbl 内の予測子をランク付けします。

    idx = fsrmrmr(X,Y) は、応答変数 Y を使用して X 内の予測子をランク付けします。

    idx = fsrmrmr(___,Name=Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用して追加のオプションを指定します。たとえば、観測値の重みを指定できます。

    [idx,scores] = fsrmrmr(___) は、予測子スコア scores も返します。大きなスコア値は、対応する予測子が重要であることを示します。

    すべて折りたたむ

    モデル y=x4+2x7+e から 1000 個の観測値をシミュレートします。

    • X={x1,...,x10} は、標準正規の要素の 1000 行 10 列の行列です。

    • "e" は、平均が 0、標準偏差が 0.3 のランダムな正規誤差のベクトルです。

    rng("default") % For reproducibility
    X = randn(1000,10);
    Y = X(:,4) + 2*X(:,7) + 0.3*randn(1000,1);

    重要度に基づいて予測子をランク付けします。

    idx = fsrmrmr(X,Y);

    上位 2 つの最も重要な予測子を選択します。

    idx(1:2)
    ans = 1×2
    
         7     4
    
    

    関数により、X の 7 列目と 4 列目が Y の最も重要な予測子として識別されます。

    carbig データ セットを読み込み、さまざまな変数が含まれている table を作成します。応答変数 MPG を table の最後の変数として含めます。

    load carbig
    cartable = table(Acceleration,Cylinders,Displacement, ...
        Horsepower,Model_Year,Weight,Origin,MPG);

    重要度に基づいて予測子をランク付けします。応答変数を指定します。

    [idx,scores] = fsrmrmr(cartable,"MPG");

    メモ: fsrmrmr が table 内の変数のサブセットを予測子として使用する場合、関数は予測子のサブセットのみにインデックスを作成します。関数でランク付けされない変数 (応答変数も含む) は、返されるインデックスでカウントされません。

    予測子の重要度スコアの棒グラフを作成します。予測子の名前を x 軸の目盛りラベルに使用します。

    bar(scores(idx))
    xlabel("Predictor rank")
    ylabel("Predictor importance score")
    predictorNames = cartable.Properties.VariableNames(1:end-1);
    xticklabels(strrep(predictorNames(idx),"_","\_"))
    xtickangle(45)

    Figure contains an axes object. The axes object contains an object of type bar.

    最も重要な予測子の 2 番目と 3 番目の間のスコアの下落は大きいですが、3 番目の予測子の後は比較的小さい下落になっています。重要度スコアの下落は、特徴選択の信頼度を表します。したがって、最も重要な予測子の選択においては、大きな下落は、ソフトウェアが確実に 2 番目の最も重要な予測子を選択していることを示します。小さな下落は、予測子の重要度の差が有意ではないことを示します。

    上位 2 つの最も重要な予測子を選択します。

    idx(1:2)
    ans = 1×2
    
         3     5
    
    

    cartable の 3 列目が MPG の最も重要な予測子です。cartable の 5 列目が MPG の 2 番目に最も重要な予測子です。

    回帰モデルの性能を改善するために、genrfeatures を使用して新しい特徴量を生成し、fsrmrmr を使用して最も重要な予測子を選択します。元の特徴量だけを使用して学習させたモデルの検定セット性能と最も重要な生成された特徴量を使用して学習させたモデルの性能を比較します。

    停電のデータをワークスペースに table として読み込みます。欠損値がある観測値を削除し、table の最初の数行を表示します。

    outages = readtable("outages.csv");
    Tbl = rmmissing(outages);
    head(Tbl)
    ans=8×6 table
           Region           OutageTime        Loss     Customers     RestorationTime            Cause       
        _____________    ________________    ______    __________    ________________    ___________________
    
        {'SouthWest'}    2002-02-01 12:18    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'   }
        {'SouthEast'}    2003-02-07 21:15     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'   }
        {'West'     }    2004-04-06 05:44    434.81    3.4037e+05    2004-04-06 06:10    {'equipment fault'}
        {'MidWest'  }    2002-03-16 06:18    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'   }
        {'West'     }    2003-06-18 02:49         0             0    2003-06-18 10:54    {'attack'         }
        {'NorthEast'}    2003-07-16 16:23    239.93         49434    2003-07-17 01:12    {'fire'           }
        {'MidWest'  }    2004-09-27 11:09    286.72         66104    2004-09-27 16:37    {'equipment fault'}
        {'SouthEast'}    2004-09-05 17:48    73.387         36073    2004-09-05 20:46    {'equipment fault'}
    
    

    変数の中には、OutageTimeRestorationTime など、fitrensemble のような回帰モデル学習関数でサポートされないデータ型の変数も含まれています。

    cvpartitionを使用して、データ セットを学習セットと検定セットに分割します。観測値の約 70% を学習データとして使用し、それ以外の約 30% を検定データとして使用します。

    rng("default") % For reproducibility of the data partition
    c = cvpartition(length(Tbl.Loss),"Holdout",0.30);
    trainTbl = Tbl(training(c),:);
    testTbl = Tbl(test(c),:);

    関数 isoutlier を使用して、学習データから Customers の外れ値を特定して削除します。

    [customersIdx,customersL,customersU] = isoutlier(trainTbl.Customers);
    trainTbl(customersIdx,:) = [];

    学習データの計算で使用したのと同じ下限および上限のしきい値を使用して、検定データから Customers の外れ値を削除します。

    testTbl(testTbl.Customers < customersL | testTbl.Customers > customersU,:) = [];

    trainTbl 内の予測子から、バギング アンサンブルの学習に使用できる特徴量を 35 個生成します。応答として変数 Loss を指定し、特徴選択手法として MRMR を指定します。

    [Transformer,newTrainTbl] = genrfeatures(trainTbl,"Loss",35, ...
        TargetLearner="bag",FeatureSelectionMethod="mrmr");

    返される table newTrainTbl には、各種の設計された特徴量が含まれます。newTrainTbl の最初の 3 列は関数 fitrensemble を使用して回帰モデルの学習に使用できる trainTbl の元の特徴量で、newTrainTbl の残りの列は応答変数 Loss です。

    originalIdx = 1:3;
    head(newTrainTbl(:,[originalIdx end]))
    ans=8×4 table
        c(Region)    Customers        c(Cause)         Loss 
        _________    __________    _______________    ______
    
        SouthEast    1.4294e+05    winter storm        289.4
        West         3.4037e+05    equipment fault    434.81
        MidWest      2.1275e+05    severe storm       186.44
        West                  0    attack                  0
        MidWest           66104    equipment fault    286.72
        SouthEast         36073    equipment fault    73.387
        SouthEast    1.0698e+05    winter storm       46.918
        NorthEast    1.0444e+05    winter storm       255.45
    
    

    newTrainTbl の予測子をランク付けします。応答変数を指定します。

    [idx,scores] = fsrmrmr(newTrainTbl,"Loss");

    メモ: fsrmrmr が table 内の変数のサブセットを予測子として使用する場合、関数はサブセットのみにインデックスを作成します。関数でランク付けされない変数 (応答変数も含む) は、返されるインデックスでカウントされません。

    予測子の重要度スコアの棒グラフを作成します。

    bar(scores(idx))
    xlabel("Predictor rank")
    ylabel("Predictor importance score")

    Figure contains an axes object. The axes object contains an object of type bar.

    7 番目と 8 番目の最も重要な予測子のスコア間に大きなギャップがあるため、7 個の最も重要な特徴量を選択してバギング アンサンブル モデルに学習させます。

    importantIdx = idx(1:7);
    fsMdl = fitrensemble(newTrainTbl(:,importantIdx),newTrainTbl.Loss, ...
        Method="Bag");

    比較のために、モデルの学習に使用できる 3 つの元の予測子を使用して別のバギング アンサンブル モデルに学習させます。

    originalMdl = fitrensemble(newTrainTbl(:,originalIdx),newTrainTbl.Loss, ...
        Method="Bag");

    検定データ セットを変換します。

    newTestTbl = transform(Transformer,testTbl);

    2 つの回帰モデルの検定の平均二乗誤差 (MSE) を計算します。

    fsMSE = loss(fsMdl,newTestTbl(:,importantIdx), ...
        newTestTbl.Loss)
    fsMSE = 1.0867e+06
    
    originalMSE = loss(originalMdl,newTestTbl(:,originalIdx), ...
        newTestTbl.Loss)
    originalMSE = 1.0961e+06
    

    fsMSEoriginalMSE より小さくなっており、最も重要な生成された特徴量で学習させたバギング アンサンブルの方が元の特徴量で学習させたバギング アンサンブルよりも性能がわずかに高くなっていることを示しています。

    入力引数

    すべて折りたたむ

    標本データ。テーブルとして指定します。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

    Tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。必要に応じて、Tbl に応答変数用および観測値の重み用の追加列を含めることができます。応答変数は、数値ベクトルでなければなりません。

    • Tbl に応答変数が含まれている場合に Tbl 内の他の変数をすべて予測子として使用するには、ResponseVarName を使用して応答変数を指定します。Tbl に観測値の重みも含まれている場合、Weights を使用して重みを指定できます。

    • Tbl に応答変数が含まれている場合に Tbl 内の他の変数のサブセットのみを予測子として使用するには、formula を使用して変数のサブセットを指定します。

    • Tbl に応答変数が含まれていない場合は、Y を使用して応答変数を指定します。応答変数と Tbl の行数は同じでなければなりません。

    fsrmrmrTbl 内の変数のサブセットを予測子として使用する場合、関数はサブセットのみを使用して予測子にインデックスを作成します。名前と値の引数 CategoricalPredictors と出力引数 idx 内の値は、関数がランク付けを行わない予測子はカウントしません。

    Tbl に応答変数が格納されている場合、fsrmrmr は応答変数に含まれる NaN の値を欠損値と見なします。fsrmrmr は、応答変数に欠損値がある観測値を使用しません。

    データ型: table

    応答変数名。Tbl 内の変数の名前を含む文字ベクトルまたは string スカラーを指定します。

    たとえば、応答変数が Tbl の列 Y (Tbl.Y) である場合、ResponseVarName"Y" として指定します。

    データ型: char | string

    応答変数および予測子変数サブセットの説明モデル。"Y ~ x1 + x2 + x3" という形式の文字ベクトルまたは string スカラーとして指定します。この形式では、Y は応答変数を、x1x2 および x3 は予測子変数を表します。

    予測子として Tbl 内の変数のサブセットを指定するには、式を使用します。式を指定した場合、fsrmrmrformula に現れない Tbl 内の変数をランク付けしません。

    式の変数名は Tbl の変数名 (Tbl.Properties.VariableNames) であり、有効な MATLAB® 識別子でなければなりません。関数 isvarname を使用して Tbl の変数名を検証できます。変数名が有効でない場合、関数 matlab.lang.makeValidName を使用してそれらを変換できます。

    データ型: char | string

    応答変数。数値ベクトルとして指定します。Y の各行は、X または Tbl の対応する行の応答を表します。

    fsrmrmrY に含まれる NaN の値を欠損値と見なします。fsrmrmr は、Y に欠損値がある観測値を使用しません。

    データ型: single | double

    予測子データ。数値行列として指定します。X の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。

    データ型: single | double

    名前と値の引数

    オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

    例: fsrmrmr(Tbl,"y",CategoricalPredictors=[1 2 4],Weights="w") は、Tbly 列を応答変数、Tblw 列を観測値の重みの格納先、Tbl の 1 列目、2 列目、4 列目をカテゴリカル予測子 (y 列と w 列を削除) として指定します。

    カテゴリカル予測子のリスト。次の表のいずれかの値として指定します。

    説明
    正の整数のベクトル

    ベクトルの各エントリは、対応する予測子がカテゴリカルであることを示すインデックス値です。インデックス値の範囲は 1 ~ p です。p はモデルの学習に使用した予測子の数です。

    fsrmrmr が入力変数のサブセットを予測子として使用する場合、関数はサブセットのみを使用して予測子にインデックスを作成します。応答変数、観測値の重み変数、および関数で使用されないその他の変数は、CategoricalPredictors 値でカウントされません。

    logical ベクトル

    true というエントリは、対応する予測子がカテゴリカルであることを意味します。ベクトルの長さは p です。

    文字行列行列の各行は予測子変数の名前です。名前は Tbl の名前に一致しなくてはなりません。文字行列の各行が同じ長さになるように、名前を余分な空白で埋めてください。
    文字ベクトルの cell 配列または string 配列配列の各要素は予測子変数の名前です。名前は Tbl の名前に一致しなくてはなりません。
    "all"すべての予測子がカテゴリカルです。

    既定では、予測子データがテーブル (Tbl) 内にある場合、fsrmrmr は、その変数が logical ベクトル、順序付けのない categorical ベクトル、文字配列、string 配列または文字ベクトルの cell 配列のいずれかである場合に、変数を categorical であると見なします。予測子データが行列 (X) である場合、fsrmrmr はすべての予測子が連続的であると見なします。他の予測子をカテゴリカル予測子として指定するには、名前と値の引数 CategoricalPredictors を使用してそれらを指定します。

    例: "CategoricalPredictors","all"

    例: CategoricalPredictors=[1 5 6 8]

    データ型: single | double | logical | char | string | cell

    予測子内の欠損値を使用するかどうかを示すインジケーター。ランク付けに値を使用する場合は true、値を破棄する場合は false として指定します。

    fsrmrmr は、NaN'' (空の文字ベクトル)、"" (空の string)、<missing>、および <undefined> の値を欠損値と見なします。

    UseMissingtrue として指定した場合、fsrmrmr はランク付けに欠損値を使用します。カテゴリカル変数の場合、fsrmrmr は欠損値を追加のカテゴリとして扱います。連続変数の場合、fsrmrmr はビン化するために別個のビン内に NaN 値を配置します。

    UseMissingfalse として指定した場合、fsrmrmr はランク付けに欠損値を使用しません。fsrmrmr は変数の各ペアについて相互情報を計算するため、関数は行内の値が部分的に欠損している場合も行全体を破棄することはありません。fsrmrmr は、欠損値を含まないすべてのペアの値を使用します。

    例: "UseMissing",true

    例: UseMissing=true

    データ型: logical

    詳細レベル。非負の整数を指定します。Verbose の値は、コマンド ウィンドウに表示される診断情報の量を制御します。

    • 0 — fsrmrmr は診断情報を何も表示しません。

    • 1 — fsrmrmr は、相互情報の計算と予測子のランク付けにかかる経過時間を表示します。

    • ≥ 2 — fsrmrmr は、経過時間と相互情報の計算に関連する追加メッセージを表示します。情報の量は、Verbose 値が増加するにつれて増加します。

    例: Verbose=1

    データ型: single | double

    観測値の重み。スカラー値のベクトルまたは Tbl 内の変数の名前として指定します。関数は、X または Tbl の各行の観測値に、Weights の対応する値で重みを付けます。Weights のサイズは、X または Tbl の行数と同じでなければなりません。

    入力データをテーブル Tbl として指定した場合、Weights は数値ベクトルが含まれている Tbl 内の変数の名前にすることができます。この場合、Weights には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、重みベクトルが Tbl の列 W (Tbl.W) である場合、Weights="W" を指定します。

    fsrmrmr は、合計が 1 になるように重みを正規化します。

    データ型: single | double | char | string

    出力引数

    すべて折りたたむ

    予測子の重要度順に並べ替えられた X または Tbl の予測子のインデックス。1 行 r 列の数値ベクトルとして返されます。r はランク付けされた予測子の数です。

    fsrmrmrTbl 内の変数のサブセットを予測子として使用する場合、関数はサブセットのみを使用して予測子にインデックスを作成します。たとえば、Tbl に列が 10 個あり、formula を使用して Tbl の最後の 5 列を予測子変数として指定するとします。idx(3)5 である場合、3 番目に重要な予測子は Tbl の 10 列目 (サブセットの 5 番目の予測子) です。

    予測子スコア。1 行 r 列の数値ベクトルとして返されます。r はランク付けされた予測子の数です。

    大きなスコア値は、対応する予測子が重要であることを示します。また、特徴量の重要度スコアの下落は、特徴選択の信頼度を表します。たとえば、ソフトウェアが確実に特徴量 x を選択している場合、次に最も重要な特徴量のスコア値が x のスコア値よりさらに小さくなります。

    • X を使用して予測子を指定するか、Tbl 内のすべての変数を予測子として使用する場合、scores 内の値の順序は、X または Tbl 内の予測子と同じ順序です。

    • Tbl 内の変数のサブセットを予測子として指定する場合、scores 内の値の順序は、サブセットと同じ順序です。

    たとえば、Tbl に列が 10 個あり、formula を使用して Tbl の最後の 5 列を予測子変数として指定するとします。この場合、score(3) には Tbl 内の 8 番目の列のスコア値が含まれます。これは、サブセットの 3 番目の予測子です。

    詳細

    すべて折りたたむ

    相互情報

    2 つの変数間の相互情報は、ある変数の不確かさの度合いが、他の変数がわかるとどの程度削減できるかを測定します。

    離散確率変数 X と Z の相互情報 I は、

    I(X,Z)=i,jP(X=xi,Z=zj)logP(X=xi,Z=zj)P(X=xi)P(Z=zj).

    として定義されます。X と Z が独立している場合、I は 0 と等しくなります。X と Z が同じ確率変数である場合、I は X のエントロピーと等しくなります。

    関数 fsrmrmr は、この定義を使用して、カテゴリカル (離散) 変数および連続変数の両方の相互情報の値を計算します。応答を含む各連続変数について、fsrmrmr は、変数を 256 個のビンか、それが 256 個より少ない場合は変数内の独自の値の数に離散化させます。関数は、適応アルゴリズムを使用して変数の各ペアに最適な二変量ビンを求めます[2]

    アルゴリズム

    すべて折りたたむ

    Minimum Redundancy Maximum Relevance (MRMR) アルゴリズム

    MRMR アルゴリズム[1]は、相互に、最大に類似していない最適な特徴量のセットを求め、応答変数を効率的に表すことができます。このアルゴリズムにより、特徴セットの冗長性が最小化され、応答変数に対する特徴量セットの関連性が最大化されます。変数の相互情報を使用して、冗長性と関連性、つまり特徴量のペアワイズ相互情報と特徴量および応答の相互情報が定量化されます。このアルゴリズムを回帰問題に使用できます。

    MRMR アルゴリズムの目的は、応答変数 y に関して VS (S の関連性) を最大化し、WS (S の冗長性) を最小化する特徴量の最適なセット S を検出することです。ここで、VS と WS相互情報 I を使用して定義されます。

    VS=1|S|xSI(x,y),

    WS=1|S|2x,zSI(x,z).

    |S| は S 内の特徴量の数です。

    最適なセット S の検出には、すべての 2|Ω| の組み合わせを考慮することが必要です。ここで、Ω は特徴セット全体です。代わりに、MRMR アルゴリズムは前方追加方式により特徴量をランク付けします。これには、Mutual Information Quotient (MIQ) の値を使用した O(|Ω|·|S|) 計算が必要です。

    MIQx=VxWx,

    ここで Vx と Wx は、それぞれ特徴量の関連性と冗長性です。

    Vx=I(x,y),

    Wx=1|S|zSI(x,z).

    関数 fsrmrmr は MRMR アルゴリズムを使用して Ω 内のすべての特徴量をランク付けし、idx (特徴量の重要度順に並べ替えられた特徴量のインデックス) を返します。したがって、計算コストは O(|Ω|2) となります。関数は、ヒューリスティックなアルゴリズムを使用して特徴量の重要度を定量化し、スコア (scores) を返します。大きなスコア値は、対応する予測子が重要であることを示します。また、特徴量の重要度スコアの下落は、特徴選択の信頼度を表します。たとえば、ソフトウェアが確実に特徴量 x を選択している場合、次に最も重要な特徴量のスコア値が x のスコア値よりさらに小さくなります。出力を使用して、特徴量の特定の数の最適なセット S を検出します。

    fsrmrmr は次のように特徴量をランク付けします。

    1. 関連性が最も高い特徴量 maxxΩVx を選択します。選択した特徴量を空のセット S に追加します。

    2. S、Sc の補数の関連性が非ゼロで冗長性がゼロである特徴量を検出します。

      • 関連性が非ゼロで冗長性がゼロである特徴量が Sc に含まれていない場合、ステップ 4 に進みます。

      • それ以外の場合、関連性が最も高い特徴量 maxxSc,Wx=0Vx を選択します。選択した特徴量をセット S に追加します。

    3. Sc のすべての特徴量について冗長性がゼロではなくなるまでステップ 2 を繰り返します。

    4. Sc の関連性が非ゼロで冗長性が非ゼロの、MIQ の最大値をもつ特徴量を選択し、選択した特徴量をセット S に追加します。

      maxxScMIQx=maxxScI(x,y)1|S|zSI(x,z).

    5. Sc のすべての特徴量について関連性がゼロになるまでステップ 4 を繰り返します。

    6. 関連性がゼロである特徴量を無作為順で S に追加します。

    ソフトウェアでステップ内に記述されている条件を満たす特徴量を検出できない場合、任意のステップを省略できます。

    参照

    [1] Ding, C., and H. Peng. "Minimum redundancy feature selection from microarray gene expression data." Journal of Bioinformatics and Computational Biology. Vol. 3, Number 2, 2005, pp. 185–205.

    [2] Darbellay, G. A., and I. Vajda. "Estimation of the information by an adaptive partitioning of the observation space." IEEE Transactions on Information Theory. Vol. 45, Number 4, 1999, pp. 1315–1321.

    バージョン履歴

    R2022a で導入