Main Content

fsrftest

F 検定を使用した回帰のための一変量の特徴量ランク付け

R2020a 以降

説明

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

idx = fsrftest(Tbl,formula) は、formula を使用して Tbl 内の変数を考慮するために応答変数と予測子変数を指定します。

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

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

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

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

すべて折りたたむ

数値行列内の予測子をランク付けし、予測子の重要度スコアの棒グラフを作成します。

標本データを読み込みます。

load robotarm.mat

robotarm データ セットには、7168 個の学習観測値 (Xtrain および ytrain)、1024 個のテスト観測値 (Xtest および ytest)、32 個の特徴量が含まれています [1][2]

学習観測値を使用して予測子をランク付けします。

[idx,scores] = fsrftest(Xtrain,ytrain);

scores の値は、p 値の負の対数です。p 値が eps(0) よりも小さい場合、対応するスコア値は Inf です。棒グラフを作成する前に、scoresInf 値を含むかどうかを判断します。

find(isinf(scores))
ans =

  1x0 empty double row vector

scoresInf 値は含まれていません。scoresInf 値を含む場合、可視化のために、棒グラフを作成する前に大きな数値で Inf を置き換えることができます。詳細については、テーブル内の予測子のランク付けを参照してください。

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

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

Figure contains an axes object. The axes object with xlabel Predictor rank, ylabel Predictor importance score contains an object of type bar.

上位 5 つの最も重要な予測子を選択します。Xtrain におけるこれらの予測子の列を求めます。

idx(1:5)
ans = 1×5

    30    24    10     4     5

Xtrain の 30 列目が、ytrain の最も重要な予測子です。

テーブル内の予測子をランク付けし、予測子の重要度スコアの棒グラフを作成します。

データがテーブル内にあり、fsrftest がテーブル内の変数のサブセットをランク付けする場合、関数はサブセットのみを使用して変数にインデックスを作成します。そのため、ランク付けしない予測子をテーブルの最後に移動させることをお勧めします。応答変数、および観測値の重みベクトルも同様に移動させます。すると、出力引数のインデックスはテーブルのインデックスと一致します。関数 movevars を使用して、テーブル内の変数を移動できます。

この例では、UCI Machine Learning Repository [5] にあるアワビのデータ [3][4] を使用します。

データをダウンロードして、'abalone.csv' という名前で現在のフォルダに保存します。

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data';
websave('abalone.csv',url);

データを table に読み取ります。

tbl = readtable('abalone.csv','Filetype','text','ReadVariableNames',false);
tbl.Properties.VariableNames = {'Sex','Length','Diameter','Height', ...
    'WWeight','SWeight','VWeight','ShWeight','NoShellRings'};

テーブルの最初の数行をプレビューします。

head(tbl)
ans=8×9 table
     Sex     Length    Diameter    Height    WWeight    SWeight    VWeight    ShWeight    NoShellRings
    _____    ______    ________    ______    _______    _______    _______    ________    ____________

    {'M'}    0.455      0.365      0.095      0.514     0.2245      0.101       0.15           15     
    {'M'}     0.35      0.265       0.09     0.2255     0.0995     0.0485       0.07            7     
    {'F'}     0.53       0.42      0.135      0.677     0.2565     0.1415       0.21            9     
    {'M'}     0.44      0.365      0.125      0.516     0.2155      0.114      0.155           10     
    {'I'}     0.33      0.255       0.08      0.205     0.0895     0.0395      0.055            7     
    {'I'}    0.425        0.3      0.095     0.3515      0.141     0.0775       0.12            8     
    {'F'}     0.53      0.415       0.15     0.7775      0.237     0.1415       0.33           20     
    {'F'}    0.545      0.425      0.125      0.768      0.294     0.1495       0.26           16     

テーブルの最後の変数は応答変数です。

tbl の予測子をランク付けします。最後の列 NoShellRings を応答変数として指定します。

[idx,scores] = fsrftest(tbl,'NoShellRings')
idx = 1×8

     3     4     5     7     8     2     6     1

scores = 1×8

  447.6891  736.9619       Inf       Inf       Inf  604.6692       Inf       Inf

scores の値は、p 値の負の対数です。p 値が eps(0) よりも小さい場合、対応するスコア値は Inf です。棒グラフを作成する前に、scoresInf 値を含むかどうかを判断します。

idxInf = find(isinf(scores))
idxInf = 1×5

     3     4     5     7     8

scores には 5 つの Inf 値が含まれます。

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

bar(scores(idx))
xlabel('Predictor rank')
ylabel('Predictor importance score')
xticklabels(strrep(tbl.Properties.VariableNames(idx),'_','\_'))
xtickangle(45)

関数 barInf 値に関するバーをプロットすることはありません。Inf 値について、最も大きい有限のスコアと同じ長さのバーをプロットします。

hold on
bar(scores(idx(length(idxInf)+1))*ones(length(idxInf),1))
legend('Finite Scores','Inf Scores')
hold off

棒グラフでは、異なる色を使用して有限のスコアと Inf スコアを表示します。

入力引数

すべて折りたたむ

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

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

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

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

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

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

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

データ型: table

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

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

データ型: char | string

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

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

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

データ型: char | string

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

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

データ型: single | double

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

データ型: single | double

名前と値の引数

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

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: 'NumBins',20,'UseMissing',true は、ビンの数を 20 として設定し、ランク付けのために予測子内の欠損値を使用するように指定します。

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

説明
正の整数のベクトル

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

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

logical ベクトル

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

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

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

例: "CategoricalPredictors","all"

例: CategoricalPredictors=[1 5 6 8]

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

連続予測子をビン化するためのビンの数。'NumBins' と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。

例: 'NumBins',50

データ型: single | double

予測子内の欠損値を使用するか破棄するかを示すインジケーター。'UseMissing' と、ランク付けのために予測子内の欠損値を使用する (true) または破棄する (false) のいずれかから構成されるコンマ区切りのペアとして指定します。

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

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

'UseMissing',false を指定した場合、fsrftest はランク付けに欠損値を使用しません。fsrftest は各予測子について個別に重要度スコアを計算するため、関数は行内の値が部分的に欠損している場合も行全体を破棄することはありません。各変数について、fsrftest は欠損していないすべての値を使用します。

例: 'UseMissing',true

データ型: logical

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

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

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

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

出力引数

すべて折りたたむ

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

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

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

大きなスコア値は、対応する予測子が重要であることを示します。

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

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

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

アルゴリズム

すべて折りたたむ

F 検定を使用した一変量の特徴量ランク付け

  • fsrftest は F 検定を使用して各予測子の重要度を個別に調べます。各 F 検定は、予測子変数値でグループ化された応答値が、平均が同じである複数の母集団から抽出されたという仮説を、母集団の平均はすべて同じではないという対立仮説に対して検定します。検定統計量の p 値が小さければ、対応する予測子が重要であることを示します。

  • 出力 scores–log(p) です。そのため、スコア値が大きければ、対応する予測子が重要であることを示します。p 値が eps(0) よりも小さい場合、出力は Inf です。

  • fsrftest は変数をビン化または離散化した後で連続変数を調べます。名前と値のペアの引数 'NumBins' を使用してビンの数を指定できます。

参照

[1] Rasmussen, C. E., R. M. Neal, G. E. Hinton, D. van Camp, M. Revow, Z. Ghahramani, R. Kustra, and R. Tibshirani. The DELVE Manual, 1996.

[2] University of Toronto, Computer Science Department. Delve Datasets.

[3] Nash, W.J., T. L. Sellers, S. R. Talbot, A. J. Cawthorn, and W. B. Ford. "The Population Biology of Abalone (Haliotis species) in Tasmania. I. Blacklip Abalone (H. rubra) from the North Coast and Islands of Bass Strait." Sea Fisheries Division, Technical Report No. 48, 1994.

[4] Waugh, S. "Extending and Benchmarking Cascade-Correlation: Extensions to the Cascade-Correlation Architecture and Benchmarking of Feed-forward Supervised Artificial Neural Networks." University of Tasmania Department of Computer Science thesis, 1995.

[5] Lichman, M. UCI Machine Learning Repository. Irvine, CA: University of California, School of Information and Computer Science, 2013. http://archive.ics.uci.edu/ml.

バージョン履歴

R2020a で導入