問題タブ [apache-spark-ml]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
apache-spark - spark.ml StringIndexer が fit() で「見えないラベル」をスローする
おもちゃのspark.ml
例を準備しています。、 pyspark、ipython ノートブックSpark version 1.6.0
の上で実行されます。Oracle JDK version 1.8.0_65
まず、 Spark、ML、StringIndexer: 目に見えないラベルの処理とはほとんど関係ありません。パイプラインを変換するのではなく、データセットに適合させるときに例外がスローされます。そして、例外を抑制することは、ここでは解決策ではないかもしれません。残念ながら、この場合、データセットがかなりめちゃくちゃになるからです。
私のデータセットは非圧縮で約 800Mb であるため、再現が難しい場合があります (サブセットが小さいほど、この問題を回避できるようです)。
データセットは次のようになります。
予測される値は ですlabel
。それに適用されるパイプライン全体:
そして、ここにスタックトレースがあります:
最も興味深い行は次のとおりです。
。編集されていません: @ zero323 のおかげで修正されたいくつかの性急な結託pl-PL
どの列の値がどのように列にlang
混同されたのかわかりませんlabel
float
string
さらに詳しく調べたところ、これpl-PL
はトレーニングではなく、データセットのテスト部分からの値であることがわかりました。そのため、どこで犯人を探すべきかさえわかりません。それはrandomSplit
コードではなくStringIndexer
、簡単にコードである可能性があり、他に何があるかは誰にもわかりません。
これを調査するにはどうすればよいですか?
python - params を ML Pipeline.fit メソッドに渡す方法は?
を使用してクラスタリングメカニズムを構築しようとしています
- Google Dataproc + Spark
- Google ビッグクエリ
- Spark ML KMeans+pipeline を使用してジョブを作成する
次のように:
bigquery でユーザー レベル ベースの機能テーブルを作成する
例: 機能テーブルはどのように表示されるかuserid |x1 |x2 |x3 |x4 |x5 |x6 |x7 |x8 |x9 |x10
00013 |0.01 | 0 |0 |0 |0 |0 |0 |0.06 |0.09 | 0.001- ここに示すように、デフォルト設定のクラスタを起動します。gcloud コマンドライン インターフェースを使用してクラスタを作成し、ジョブを実行します。
- 提供されたスターター コードを使用して、BQ テーブルを読み取り、RDD をデータフレームに変換して、KMeans モデル/パイプラインに渡します。
コンソールに出力するスキーマと head() は次のとおりです。
- 次の方法でクラスタリング KMeans アルゴリズムを実行します。
- モデルを複数回実行する
- 異なるパラメーターを使用 (つまり、#clusters と init_mode を変更)
- エラーまたはコスト指標を計算する
- 最適なモデルとパラメーターの組み合わせを選択する
- KMeans を推定量としてパイプラインを作成する
- paramMap を使用して複数のパラメーターを渡す
警告付きで次の出力が得られます
7:03:24 WARN org.apache.spark.mllib.clustering.KMeans: The input data was not directly cached, which may hurt performance if its parent RDDs are also uncached.
[PipelineModel_443dbf939b7bd3bf7bfc, PipelineModel_4b64bb761f4efe51da50, PipelineModel_4f858411ac19beacc1a4, PipelineModel_4f58b894f1d14d79b936, PipelineModel_4b8194f7a5e6be6eaf33, PipelineModel_4fc5b6370bff1b4d7dba, PipelineModel_43e0a196f16cfd3dae57, PipelineModel_47318a54000b6826b20e, PipelineModel_411bbe1c32db6bf0a92b, PipelineModel_421ea1364d8c4c9968c8, PipelineModel_4acf9cdbfda184b00328, PipelineModel_42d1a0c61c5e45cdb3cd, PipelineModel_4f0db3c394bcc2bb9352, PipelineModel_441697f2748328de251c, PipelineModel_4a64ae517d270a1e0d5a, PipelineModel_4372bc8db92b184c05b0]
出力:
[array([7.64676638e-07, 3.58531391e-01, 1.68879698e-03, 0.00000000e+00, 1.53477043e-02, 1.25822915e-02, 0.00000000e+00, 6.93060772e-07, 1.41766847e-03, 1.60941306e-02], array([2.36494105e-06, 1.87719732e-02, 3.73829379e-03, 0.00000000e+00, 4.20724542e-02, 2.28675684e-02, 0.00000000e+00, 5.45002249e-06, 1.17331153e-02, 1.24364600e-02])
ここに質問のリストがあり、ヘルプが必要です。
- すべてのモデルの配列として 2 つのクラスター センターのみを含むリストを取得します。
- パイプラインにアクセスしようとすると、KMeans モデルがデフォルトで k=2 になっているようです。なぜこれが起こるのでしょうか?
- 最後のループは、pipelineModel と 0 番目のステージにアクセスし、clusterCenter() メソッドを実行することになっていますか? これは正しい方法ですか?
- データがキャッシュされていないというエラーが表示されるのはなぜですか?
- パイプラインを使用する場合、WSSSE または .computeCost()(mllib 用) のような同等のメソッドを計算する方法が見つかりませんでした。異なるパラメーターに基づいて異なるモデルを比較するにはどうすればよいですか?
- ソースコードhereで定義されているように、次のコードを実行して .computeCost メソッドを実行しようとしました。
- これは、パイプラインを使用して KMeans モデルとモデル選択を並行して実行する目的に反しますが、次のコードを試しました。
これにより、ループの最後に次のように出力されます。
[ 634035.00294687 634035.00294687 634035.00294687 634035.00294687
634035.00294687 634035.00294687 634035.00294687 634035.00294687
634035.00294687 634035.00294687 634035.00294687 634035.00294687
634035.00294687 634035.00294687 634035.00294687 634035.00294687]
- 計算されたコスト/エラーは各モデルで同じですか? この場合も、正しいパラメーターを使用して pipelineModel にアクセスできません。
どんな助け/指導も大歓迎です! ありがとう!
scala - Spark のベクター列にメタデータをアタッチする
コンテキスト: ラベルと機能の 2 つの列を持つデータ フレームがあります。
featuresは、 VectorAssemblerを使用して構築された数値型の mllib.linalg.VectorUDT です。
質問: 特徴ベクトルにスキーマを割り当てる方法はありますか? 各機能の名前を追跡したいと思います。
これまでに試した:
しかし、これを既存のデータ フレームに適用する方法がわかりませんでした。
scala - Spark の機能ベクトルに IndexToString を適用する
コンテキスト: StringIndexer を使用してすべてのカテゴリ値にインデックスが付けられたデータ フレームがあります。
次に、VectorAssembler を使用して、すべての特徴列 (インデックス付きのカテゴリ列を含む) をベクトル化しました。
分類器といくつかの追加手順を適用すると、ラベル、特徴、および予測を含むデータ フレームが完成します。インデックス付きの値を元の文字列形式に変換するために、特徴ベクトルを個別の列に拡張したいと考えています。
質問:これを行う簡単な方法はありますか、または何らかの方法で予測列をテスト データ フレームにアタッチする最善の方法はありますか?
私が試したこと:
これを適用すると、必要な列が得られますが、それらは Vector 形式 (意図されているとおり) であり、Double 型ではありません。
編集: 目的の出力は、元のデータフレーム(つまり、インデックスではなく文字列としてのカテゴリ機能)であり、予測されたラベル(私の場合は0または1)を示す追加の列があります。
たとえば、分類子の出力が次のようになったとします。
各機能に VectorSlicer を適用すると、次のようになります。
これは素晴らしいことですが、次のものが必要です。
次に、IndexToString を使用して次のように変換できるようにします。
あるいは:
apache-spark - Spark でファイルなしで JavaRDD を作成する
私はスパークにまったく慣れていないので、ファイルから入力を読み取らずに、ラベル付きのポイントからプログラムで JavaRDD を作成したいと考えています。次のようにいくつかのラベル付きポイントを作成するとします。
次に、これらのベクトルを使用して JavaRDD を作成したいと考えています。どうやってやるの。