2016-11-15 7 views
2

私はcolorsexcluded_colorsの2つのデータを持っています。トレーニングセットデータからアイテムを除外します

colorsすべての色が含まれています excluded_colorsは私のtrainingsetから除外したいいくつかの色が含まれています。

データをトレーニングとテストのセットに分割し、excluded_colorsの色がトレーニングセットに含まれていないが、テストセットに存在することを確認しています。

は、上記目的を達成するためには、私が excluded_colorsの色の上に行って、完全に無視されていることを実現しています。しかし、この

var colors = spark.sql(""" 
    select colors.* 
    from colors 
    LEFT JOIN excluded_colors 
    ON excluded_colors.color_id = colors.color_id 
    where excluded_colors.color_id IS NULL 
""" 
) 
val trainer: (Int => Int) = (arg:Int) => 0 
val sqlTrainer = udf(trainer) 
val tester: (Int => Int) = (arg:Int) => 1 
val sqlTester = udf(tester) 

val rsplit = colors.randomSplit(Array(0.7, 0.3)) 
val train_colors = splits(0).select("color_id").withColumn("test",sqlTrainer(col("color_id"))) 
val test_colors = splits(1).select("color_id").withColumn("test",sqlTester(col("color_id"))) 

をしました。彼らは私のテストセットでさえありません。またexcluded_colorsの色は訓練ではありませんが、テスト中に存在していることを保証しながら、私は70/30でデータを分割するにはどうすればよい

質問

答えて

1

私たちがしたいことは、トレーニングセットから「除外された色」を削除することですが、テストに参加させ、トレーニング/テスト分割を70/30にすることです。

私たちに必要なのは、少しの数学です。

|Tr| = x * (|TD|-|E|) 
|Ts| = |E| + (1-x) * |TD| 

我々はまた、その|Tr| = 0.7 |TD|

を知っている:私たちは列車のデータセット(TR)とテストデータセット(TS)そのためと言うことができ、全データセット(TD)、除外色データセット(E)を考えると

したがってx = 0.7 |TD|/(|TD| - |E|)

今、私たちは、サンプリングファクタxを知っていることを、私たちは言うことができる:

Tr = (TD-E).sample(withReplacement = false, fraction = x) 
// where (TD - E) is the result of the SQL expr above 

Ts = TD.sample(withReplacement = false, fraction = 0.3) 
// we sample the test set from the original dataset 
+0

あなたの例では 'x'とは何ですか? – Anthony

+0

'x'はあなたの質問で' 0.7'や '0.3'のようなサンプリング確率です。そのアイデアは、質問で尋ねられた70/30の比率を維持するために、より小さなデータセットから大きなサンプルを必要とするということです。 – maasg

+0

私は理解していると思います。私はあなたの数学をコードに変換し、それが成功しているかどうかを確認します。私はそれに応じて質問を更新します。ありがとう – Anthony

関連する問題