2013-12-20 40 views
6

scikit-learnのクロスバリデーションのためのランダムフォールドを生成するにはどうすればよいですか?クロスバリデーションのための不均衡なデータのscikit-learnアンダーサンプリング

私たちは1つのクラスの20個のサンプルを持ち、80個のサンプルを持ち、N個のトレーニングセットとテストセットを生成する必要があると想像してください。各トレーニングセットには30個のトレーニングセットがあります。クラス1の50%、クラス2の50%です。

私はこのディスカッション(https://github.com/scikit-learn/scikit-learn/issues/1362)を見つけましたが、折り畳みを取得する方法を理解していません。理想的に私はそのような機能が必要だと思います:

cfolds = np.cross_validation.imaginaryfunction(
[list(itertools.repeat(1,20)), list(itertools.repeat(2,80))], 
n_iter=100, test_size=0.70) 

私は何が欠けていますか?

+0

なぜ 'random.sample()'を使用しないのですか? – Skyler

+0

他のすべてのcross_validation関数があるのと同じ理由で! – adrin

+2

独自のクロスバリデーションジェネレータを定義することができます。これは 'N 'を返す' __len__'と '' train_indices、test_indices''の 'N'ペアを生成する' __iter__'を持つオブジェクトでなければなりません。 –

答えて

1

scikitにアンダーとクロスバリデーションを行うには直接的な方法はありませんが、2つの回避策があります

1.

利用StratifiedCrossValidationデータの分布をミラーリング各折り目に分布して相互検証を達成するために、 class_weight paramを使用して分類器の不均衡を減らすことができます。これは、autoとアンダーサンプル/オーバーサンプルクラスのカウントに反比例するか、明示的な重み付きの辞書を渡すことができます。

2.

はかなりまっすぐ進むpandasを使用する必要があり、独自のクロス検証ルーチンを、書きます。

0

StratifiedCVは良い選択ですが、あなたはそれを簡単にすることができます。

  1. 実行クラス1に関連するデータのランダムサンプリング(あなたが15/20のサンプルを選択する必要があります)
  2. 同じクラス2のために(15/80)
  3. 100回または必要な回数を繰り返します。

それだけです。迅速かつ実行可能!

関連する問題