SVDを実行して欠損値を代入する方法、具体例


8

SVDを適用する前に欠損値を処理する方法に関する素晴らしいコメントを読みましたが、簡単な例でどのように機能するか知りたいです。

        Movie1 Movie2 Movie3
User1     5             4
User2     2      5      5
User3            3      4
User4     1             5
User5     5      1      5

上記のマトリックスを考えると、NAの値を削除すると、User2とUser5しかなくなります。これは、私のUが2×kになることを意味します。しかし、欠損値を予測する場合、Uは5×kである必要があります。これは、特異値とVで乗算できます。

上記のマトリックスで、最初に欠損値のあるユーザーを削除してからSVDを適用して、欠損値を記入する人はいますか?数学記号を使いすぎずに、適用した手順の非常に簡単な説明を提供し、答えを実用的なものにしてください(つまり、数値に別の数値を掛けると答えが得られます)。

次のリンクを読みました。

stats.stackexchange.com/q/33142

stats.stackexchange.com/q/31096

stats.stackexchange.com/q/33103


誰もが少なくとも1本の映画を見ていませんでしたよね?したがって、データが欠落しているすべてのユーザーを削除すると、ユーザーがゼロになり、ユーティリティ(レーティング)マトリックスの行がゼロになります。したがって、一部のデータが欠落している行は削除できませんよね?SVDは、欠損値のあるデータセットには役立ちません。他の行列因数分解手法がありますが、それらを実装することができます。見て、SVDは事前に欠落データを補完する必要があります。古い定数を使用するだけで愚かな方法で代入を行うことができますが、そのようなガベージデータを使用する意味は何ですか。ゴミを出しますか?
ジェフリーアンダーソン

回答:


5

SVDは完全な行列に対してのみ定義されます。したがって、プレーンなSVDに固執する場合は、これらの欠損値を事前に入力する必要があります(SVD自体は代入アルゴリズムではありません)。導入したエラーは、マトリックス因数分解アプローチによって取り消されることが期待されます(一般的な仮定:データは低ランクモデルによって生成されます)。

あなたがやりたいように完全な行を削除することはただ悪いことです。欠損値をゼロに設定することもできます。

多くの代入戦略がありますが、この場合、列平均(またはおそらく行平均)で代入します。これは基本的に、2番目のリンクで推奨される戦略です。

        Movie1 Movie2 Movie3
User1   5             4
User2   2      5      5
User3          3      4
User4   1             5
User5   5      1      5

(列平均;映画の平均スコア)になります

        Movie1 Movie2 Movie3
User1   5      3      4
User2   2      5      5
User3   3      3      4
User4   1      3      5
User5   5      1      5

そしてもう1つ注意点として、データを前処理する必要があります。少なくともすべての値から平均を差し引いてください!

この紹介をご覧ください。それは、impute + SVDアプローチを強調し、欠損値のより直接的なモデリングについても話します。ただし、この場合、他のアルゴリズムが使用されます。


お返事ありがとうございます。こちらのブログリンクをご覧ください。サイモンは欠落していない評価のみを使用したようです。つまり、彼は欠落している評価を無視しました。これは私が提案しているのと同じではありませんか。お知らせ下さい。
Boro Dega

2
時間をかけて私のリンクを読んでください。それはあなたのブログリンクが説明する戦略を正確にカバーします。彼は何も帰属せず、SVDを使用していません。彼はSVDに動機付けられたアプローチの一部の確率的勾配降下法を使用しています(欠落しているすべてのエントリを無視する可能性があります)。詳細については、行列分解 + 確率的勾配の googleを使用してください。たくさんの仕事があります!
sascha 2016年

2

欠損値を予測する方法はたくさんありますが、従来のSVDはその1つではありません。良い点は、機械学習がこれを行うための多くの方法を提供することです。その一部は行列因数分解に基づいており、他は行列因数分解とは完全に異なります。完全にカスタムモデルを選択して作成することができます。これは、今日のツールが十分に強力であるため、現在一般的に行われています。行列分解は依然としてスパースデータの欠損値を予測する優れた方法ですが、SVD自体はそうではありません。

ここで受け入れられた答えは明らかに、質問者に、0または99または-3などの定数値を選択し、事前に欠損値に割り当ててから、その値に対してSVDを実行するようにアドバイスしているようです。目的がスパースデータセットで予測することである場合、これは悪い答えです。ただし、OPの目的がSVDの実行のみである場合は、定数値を事前に割り当てることで問題なく機能するため、任意の値を選択し、OPで結果が重要でない場合はSVDを実行します。すべてのまばらな場所で定数値を想定すると、最終的に既知の良好なデータポイントよりも多くのノイズポイントが導入される可能性があるため、SVDは欠損値の予測に適さないソリューションだと言いました。

ノイズを学ぶ意味は何ですか?そして、演習のポイントがそれらが何であるかを予測することであるときに、なぜあなたは欠損値が実際には同じ定数値であることを提案するでしょうか?欠損値がまったく同じであるとは思わないでしょう?これは、データセットに一定のデータが非常に広範に存在する場合に生じる主成分の数を過小評価することになります。また、これは非常に簡単な予測問題です。学習アルゴリズムも、因数分解アルゴリズムも必要ありません。欠損値は既知の定数であるとおっしゃいました。代入する必要はありません!昔ながらの方法を推測するだけで、手動ですでにそれを実行しました。

SVDを使いこなして、既知の(欠落していない)データから平均値と標準偏差を使用して経験的に導出されたランダム分布を使用して、欠落している値を事前に推定することができます。しかし、データのパターンの代わりにランダム性があり、おそらく、あなたが期待するパターンを見つけるために、その手法に固有の行列分解と次元削減が期待されています。ただし、ランダムノイズでの使用の多くのパターンを発見することはできないため、この方法を使用しても効果がありません。

結論として、SVD(または他のアルゴリズム)の出力は、調査者が提供するジャンクデータが圧倒的に大量に供給されると、ほとんどが不要になります。多数のジャンクデータから適切なモデルを学習できるアルゴリズムはありません。その「アプローチ」全体にノーと言ってください。

OPの目標は、予測し、学習アルゴリズムの一部として行列因数分解設計を使用することであると思われます。この場合の良い点は、コスト、欠落値に対して行われた予測を決定的に省略した独自のコスト関数を適切に記述できることです。この方法では、ジャンクデータが学習アルゴリズムに送られることはありません。Adamなど、優れた勾配降下法に基づくオプティマイザーを使用します(他にもあります)。優れた機械学習プロジェクトの方法論に従えば、トレーニング、開発、およびテストデータセットに関してある程度正確なソリューションを取得できます。ユーザーバイアス、アイテムバイアス、グローバルバイアス、正則化など、プロジェクトの要件と使用可能なデータセットに対するバイアスエラーと分散エラーを制御するために必要な用語や複雑さをモデルに追加してください。

最新の機械学習開発パッケージにより、これが現在実用的なアプローチになっています。たとえばTensorFlow(またはMicrosoft CNTKなど)は、行列分解モデルを使用して、スパースデータセットで説明したことを正確に実行するのに役立ちます。


素晴らしい反射。私はあなたの答えが本当に好きで、それはその場にあります。解決策を示すスクリプトを使用して、回答を拡張できますか?それが質問への答えになります。ありがとう
Boro Dega

2

このペーパーでは、探しているものを非常にエレガントな詳細で説明します(ソフトしきい値SVDを使用)。ジェフリーが指摘したように、彼らは、欠損値に対して行われた予測をコストから除外する独自のコスト関数を書くことによってこれを行います。

要約:Mazumdarらは、大規模な行列の完成問題に対して一連の正則化された低ランクのソリューションを提供するために、凸緩和法を使用しています。アルゴリズムSOFT-IMPUTEは、不足している要素をソフトしきい値のSVDから取得した要素で繰り返し置き換えます。彼らは問題の構造を利用して、行列次元で線形次数の複雑さでタスクを実行できることを示しています。このアルゴリズムは、大きな行列に容易に拡張できます。例えば、それは3.3時間でのNetflixトレーニングセット全体のランク95の近似に適合します。これらの方法は、優れたトレーニングおよびテストエラーを達成し、他の競合する最先端技術と比較した場合に優れたタイミングを実現します。

@article {mazumder2010spectral、title = {大きな不完全行列を学習するためのスペクトル正則化アルゴリズム}、author = {Mazumder、RahulとHastie、TrevorとTibshirani、Robert}、journal = {Journal of machine learning research}、volume = {11}、 number = {Aug}、pages = {2287--2322}、year = {2010}}

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