Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

fscchi2

カイ二乗検定を使用した分類に向けた一変量の特徴量ランク付け

説明

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

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

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

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

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

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

すべて折りたたむ

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

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

load ionosphere

ionosphere には、予測子変数 (X) と応答変数 (Y) が含まれます。

カイ二乗検定を使用して予測子をランク付けします。

[idx,scores] = fscchi2(X,Y);

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')

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

idx(1:5)
ans = 1×5

     5     7     3     8     6

X の 5 列目が、Y の最も重要な予測子です。

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

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

census1994 データセットを読み込みます。

load census1994

census1994 内のテーブル adultdata には、個人の年収が $50,000 を超えるかどうかを予測するための、米国勢調査局の人口統計データが含まれています。テーブルの最初の 3 行を表示します。

head(adultdata,3)
ans=3×15 table
    age       workClass          fnlwgt      education    education_num      marital_status         occupation        relationship     race     sex     capital_gain    capital_loss    hours_per_week    native_country    salary
    ___    ________________    __________    _________    _____________    __________________    _________________    _____________    _____    ____    ____________    ____________    ______________    ______________    ______

    39     State-gov                77516    Bachelors         13          Never-married         Adm-clerical         Not-in-family    White    Male        2174             0                40          United-States     <=50K 
    50     Self-emp-not-inc         83311    Bachelors         13          Married-civ-spouse    Exec-managerial      Husband          White    Male           0             0                13          United-States     <=50K 
    38     Private             2.1565e+05    HS-grad            9          Divorced              Handlers-cleaners    Not-in-family    White    Male           0             0                40          United-States     <=50K 

テーブル adultdata では、3 番目の列 fnlwgt はサンプルの重みで、最後の列 salary は応答変数です。関数 movevars を使用して fnlwgtsalary の左側に移動します。

adultdata = movevars(adultdata,'fnlwgt','before','salary');
head(adultdata,3)
ans=3×15 table
    age       workClass        education    education_num      marital_status         occupation        relationship     race     sex     capital_gain    capital_loss    hours_per_week    native_country      fnlwgt      salary
    ___    ________________    _________    _____________    __________________    _________________    _____________    _____    ____    ____________    ____________    ______________    ______________    __________    ______

    39     State-gov           Bachelors         13          Never-married         Adm-clerical         Not-in-family    White    Male        2174             0                40          United-States          77516    <=50K 
    50     Self-emp-not-inc    Bachelors         13          Married-civ-spouse    Exec-managerial      Husband          White    Male           0             0                13          United-States          83311    <=50K 
    38     Private             HS-grad            9          Divorced              Handlers-cleaners    Not-in-family    White    Male           0             0                40          United-States     2.1565e+05    <=50K 

adultdata の予測子をランク付けします。列 salary を応答変数として指定し、列 fnlwgt を観測値の重みとして指定します。

[idx,scores] = fscchi2(adultdata,'salary','Weights','fnlwgt');

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

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

     1     3     4     5     6     7    10    12

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

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

figure
bar(scores(idx))
xlabel('Predictor rank')
ylabel('Predictor importance score')
xticklabels(strrep(adultdata.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 に応答変数用および観測値の重み用の追加列を含めることができます。

応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列にすることができます。応答変数が文字配列である場合、応答変数の各要素は配列の 1 つの行に対応しなければなりません。

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

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

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

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

fscchi2 は、応答変数の Tbl に含まれている NaN'' (空の文字ベクトル)、"" (空の string)、<missing>、および <undefined> の値を欠損値と見なします。fscchi2 は、応答変数に欠損値がある観測値を使用しません。

データ型: table

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

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

データ型: char | string

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

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

式の変数名は Tbl の変数名 (Tbl.Properties.VariableNames) であり、有効な MATLAB® 識別子でなければなりません。詳細については、ヒントを参照してください。

データ型: char | string

応答変数。数値ベクトル、categorical ベクトル、logical ベクトル、文字配列、string 配列、または文字ベクトルの cell 配列として指定します。Y の各行は、X の対応する行のラベルを表します。

fscchi2Y に含まれている NaN'' (空の文字ベクトル)、"" (空の string)、<missing> および <undefined> 値を欠損値と見なします。fscchi2 は、Y に対し欠損値がある観測値を使用しません。

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

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

データ型: single | double

名前と値のペアの引数

オプションの Name,Value 引数のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

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

カテゴリカル予測子のリスト。'CategoricalPredictors' と次の表のいずれかの値から構成されるコンマ区切りのペアとして指定します。

説明
正の整数のベクトルベクトルの各エントリは、カテゴリカル変数が含まれている予測子データ (X または Tbl) の列に対応するインデックス値です。
logical ベクトルtrue というエントリは、予測子データ (X または Tbl) の対応する列がカテゴリカル変数であることを意味します。
文字行列行列の各行は予測子変数の名前です。名前は Tbl の名前に一致しなくてはなりません。文字行列の各行が同じ長さになるように、名前を余分な空白で埋めてください。
文字ベクトルの cell 配列または string 配列配列の各要素は予測子変数の名前です。名前は Tbl の名前に一致しなくてはなりません。
'all'すべての予測子がカテゴリカルです。

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

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

例: 'CategoricalPredictors','all'

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

ランク付けに使用するクラスの名前。'ClassNames' と categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。ClassNames のデータ型は Y または Tbl 内の応答変数と同じでなければなりません。

ClassNames が文字配列の場合、各要素は配列の 1 つの "行" に対応しなければなりません。

'ClassNames' の使用目的は次のとおりです。

  • クラスの順序に対応する Prior の次元の順序を指定する。

  • ランク付け用にクラスのサブセットを選択する。たとえば、Y に含まれているすべての異なるクラス名の集合が {'a','b','c'} であるとします。クラス 'a' および 'c' のみの観測値を使用して予測子をランク付けするには、'ClassNames',{'a','c'} を指定します。

'ClassNames' の既定値は、Y または Tbl 内の応答変数に含まれているすべての異なるクラス名の集合です。応答変数に順序がある場合、既定値 'ClassNames' には数学的順序が設定されています。それ以外の場合、既定値にはアルファベット順が設定されています。

例: 'ClassNames',{'b','g'}

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

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

例: 'NumBins',50

データ型: single | double

各クラスの事前確率。'Prior' と以下のいずれかで構成されるコンマ区切りのペアとして指定します。

  • 文字ベクトルまたは string スカラー。

    • 'empirical'Y または Tbl の応答変数のクラスの頻度からクラス確率を決定します。観測値の重みを渡す場合、fscchi2 はこの重みを使用してクラス確率を計算します。

    • 'uniform' はすべてのクラス確率を均等に設定します。

  • ベクトル (クラスごとに 1 つのスカラー値)。'Prior' の対応する要素についてクラスの順序を指定するには、名前と値のペアの引数 ClassNames も指定します。

  • 次の 2 つのフィールドがある構造体 S

    • S.ClassNames には、Y または Tbl の応答変数と同じ型の変数のクラス名が格納されます。

    • S.ClassProbs には、対応する確率のベクトルが格納されます。

'Weights''Prior' の両方に値を設定する場合、fscchi2 は、合計がクラスの事前確率の値になるように各クラスの重みを正規化します。

例: 'Prior','uniform'

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

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

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

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

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

例: 'UseMissing',true

データ型: logical

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

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

fscchi2 は、合計がクラスの事前確率の値になるように各クラスの重みを正規化します。

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

出力引数

すべて折りたたむ

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

fscchi2Tbl 内の変数のサブセットを予測子として使用する場合、関数はサブセットのみを使用して予測子にインデックスを作成します。たとえば、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 番目の予測子です。

ヒント

  • 入力引数 formula を使用して応答変数と予測子変数を指定する場合、式の変数名は Tbl の変数名 (Tbl.Properties.VariableNames) であり、かつ有効な MATLAB 識別子でなければなりません。

    関数 isvarname を使用して Tbl の変数名を検証できます。次のコードは、有効な変数名をもつ各変数の logical 1 (true) を返します。

    cellfun(@isvarname,Tbl.Properties.VariableNames)
    Tbl の変数名が有効ではない場合、関数 matlab.lang.makeValidName を使用してそれらを変換します。
    Tbl.Properties.VariableNames = matlab.lang.makeValidName(Tbl.Properties.VariableNames);

アルゴリズム

すべて折りたたむ

カイ二乗検定を使用した一変量の特徴量ランク付け

  • fscchi2 は、個々のカイ二乗検定を使用して各予測子変数が応答変数から独立しているかどうかを調べます。検定統計量の p 値が小さければ、対応する予測子変数が応答変数に依存しており、したがって重要な特徴量であることを示します。

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

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

R2020a で導入