マルチクラスLDAトレーニングの共線変数


16

8クラスのデータでマルチクラスLDA分類器をトレーニングしています。

トレーニングを行っている間、私は警告が出ます:「変数が同一直線上にあります

私は取得しています訓練オーバーの精度90%

Pythonでscikits-learnライブラリを使用して、マルチクラスデータのトレーニングとテストを行っています。

私はまともなテスト精度も得ています(約85%-95%)。

エラー/警告の意味がわかりません。私を助けてください。

回答:


29

多重共線性とは、予測変数が相関していることを意味します。なぜこれが悪いのですか?

LDAは回帰手法と同様に行列式の計算を伴うため、行列式が0に近い場合は不正確です(つまり、 2つ以上の変数が互いにほぼ線形結合している)。

さらに重要なことは、推定された係数を解釈できないようにすることです。増加した場合、たとえば、の減少と関連しているX 2と、彼らの両方が増加変数Y、内のすべての変更X 1は、の変化によって補償されるX 2、あなたはの影響を過小評価しますX 1Yを。LDAでは、分類に対するX 1の影響を過小評価します。X1X2YX1X2X1YX1

必要なのは分類そのものだけで、データの半分でモデルをトレーニングし、残りの半分でモデルをテストした後、85-95%の精度が得られるとしたら、それは問題ないと思います。


それで、テスト精度が低い場合、特徴ベクトルの特徴X1は良い選択ではないと解釈できますか?
ガラク

1
テストの精度が低い場合、良い選択はないと思います。
gui11aume

興味深いのは、LDAでこの問題が発生していることですが、QDAを使用しているときではありません。そこで何が違うのだろうか?
ガラク

1
答えは+1ですが、「行列の反転の計算」は正確ではない場合があります。明示的にコンピュータ化することはありません。LU、QR、反復法などの直接法が使用されます。
ハイタオデュ

@ hxd1011正しい!記録については、マトリックスが「ほぼ特異」である場合にLU / QRなどで何が起こるかについて、いくつかの言葉を与えることができますか、それを説明するドキュメントを指し示すことができますか?
gui11aume

12

gui11aumeがすばらしい答えを与えたと思うので、照明となるかもしれないわずかに異なる角度から例を挙げたいと思います。判別関数の共変量は次のように見えることを考慮してください。

バツ1=5バツ2+3バツ3バツ4

最適なLDAに次の線形境界があると仮定します。

バツ1+2バツ2+バツ32バツ4=5

5バツ2+3バツ3バツ4バツ1

5バツ2+3バツ3バツ4+2バツ2+バツ32バツ4=5

または

7バツ2+4バツ33バツ4=5

これら2つの境界は同一ですが、最初の境界には係数があります 1212 にとって バツ1バツ2バツ3、そして バツ4 それぞれ、他方には係数があります 0731

したがって、係数はまったく異なりますが、2つの式は同じ境界と同じ予測ルールを提供します。1つの形式が適切であれば、もう1つの形式も適切です。しかし、gui11ameが係数が解釈不能であると言っている理由を見ることができます。

この境界を表現する他の方法もいくつかあります。 バツ2 それを与えるために 0 係数と同じことができる バツ3 または バツ4。しかし実際には、共線性は近似値です。ノイズにより一意の答えが得られるため、これは事態を悪化させます。データのごくわずかな摂動により、係数が大幅に変化します。しかし、予測では、各方程式がほぼ同じ境界を定義し、LDAがほぼ同一の予測を行うため、大丈夫です。


1

ここでマークされた答えは正しいですが、コードで何が起こったのかを知るために別の説明を探していたと思います。モデルを実行しているときとまったく同じ問題がありました。

進行状況は次のとおりです。データセットの一部として予測変数を使用してモデルをトレーニングしています。気付かないうちに私に起こったことの例を次に示します。

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL3']
train_X = train[train.columns[:-1]]

このコードでは、「COL3」の値を予測したいのですが、train_Xを見ると、最後の列を除くすべての列を取得するように指示しているため、COL4ではなくCOL1、COL2、COL3を入力します。 train_Xの一部であるCOL3を予測しようとしています。

列を移動するだけでこれを修正し、ExcelのCOL3をデータセットの最後の列に移動して(COL4の代わりになります)、次に:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL4']
train_X = train[train.columns[:-1]]

Excelで移動したくなく、コードで移動したい場合:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL3']
train_X = train[train.columns['COL1','COL2','COL4']]

train_Xを宣言して、train_Yの一部であるCOL3を除くすべての列を含める方法に注意してください。

それがお役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.