3

missForest というパッケージを使用して、データ セットの欠損値を推定しています。私の質問は、このプロセスをどのように並列化して、結果が得られるまでの時間を短縮できるかということです。この例を参照してください (missForest パッケージから):

 data(iris)
 summary(iris)

データには、4 つの連続変数と 1 つのカテゴリ変数が含まれています。prodNA関数を使用して人為的に欠損値を生成します。

set.seed(81)
iris.mis <- prodNA(iris, noNA = 0.2)
summary(iris.mis)

欠損値を代入して、説明用の完全な行列を提供します。'verbose' を使用して、反復間で何が起こるかを確認します。

iris.imp <- missForest(iris.mis, xtrue = iris, verbose = TRUE)
4

2 に答える 2

4

昨日、missForest のバージョン 1.4 を CRAN に提出しました。Windows と Linux のパッケージは準備ができており、Mac 版はすぐに続きます。

新しい関数には追加の引数 "parallelize" があり、単一のフォレストを並列に計算する (parallelize="forests") か、複数の変数で複数のフォレストを同時に計算する (parallelize="variables") ことができます。デフォルト設定は、並列計算なし (parallelize="no") です。

初めて試す前に、パッケージ「doParallel」などを使用して、適切な並列バックエンドを登録することを忘れないでください。「doParallel」ビネットは、セクション 4 で説明的な例を示しています。

他の詳細のために、パッケージから「missForest」ビネットを一時的に削除する必要がありました。しかし、この問題はいずれ解決し、バージョン 1.4-1 としてリリースします。

于 2014-01-01T12:15:17.960 に答える
1

missForest 関数を適切に並列化するのは少し難しいです。それを行うには2つの基本的な方法があるようです:

  1. randomForest モデル オブジェクトを並行して作成します。
  2. NA を含むデータ フレームの列ごとに、複数の randomForest 操作 (モデルの作成と予測) を並行して実行します。

方法 1 はかなり簡単に実装できますが、randomForestcombine関数では推定誤差が計算されないため、自分で推定誤差を計算する必要があります。ただし、randomForest オブジェクトの計算にそれほど時間がかからず、NA を含む列が多数ある場合は、集計操作の計算に長い時間がかかる場合でも、速度が向上する可能性はほとんどありません。

xmis方法 2 は、 randomForest 操作のたびにシーケンシャル アルゴリズムがデータ フレームの列を更新するため、実装が少し難しくなります。nこれを並列化する正しい方法は、一度に列を並列に処理することだと思います(nワーカー プロセスの数はどこですか)。したがってn、データ フレームのすべての列を処理するには、列の周りに別のループが必要です。私の実験では、これが行われない限り、外側のループの収束に時間がかかり、並列実行の利点が失われることが示唆されています。

一般に、パフォーマンスを向上させるには、これらの両方の方法を実装し、入力データに基づいてどちらを使用するかを選択する必要があります。NA を持つ列がいくつかあるだけで、randomForest モデルの計算に時間がかかる場合は、方法 1 を選択する必要があります。外側の while ループの余分な反復が必要になる可能性はありますが、これはより効率的に実行できるため、計算にかかる時間は短縮されます。


missForest を試す過程で、最終的にパッケージの並列バージョンを開発しました。library.R の修正版をGitHub Gistに置きましたが、特にドキュメントがなければ、その形式で使用するのは簡単ではありません。そこで、missForest の作成者に連絡を取りました。彼は、私の変更の少なくとも一部を公式パッケージに組み込むことに非常に関心を持っているので、CRAN に投稿される次のバージョンの missForest で並列実行がサポートされることを願っています。

于 2013-11-26T19:06:27.830 に答える