2017-02-26 5 views
-5

私は分類モデルを構築しようとしています。私は1000のテキスト文書をローカルフォルダに持っています。私は70:30の分割比(70 - >トレーニングと30 - >テスト)でトレーニングセットとテストセットに分割したいと思います。私はPythonを使用しています。文書をトレーニングセットとテストセットに分割する方法は?

注: - 理解を深めるために、理由を説明してください。この質問にいくつかのdownvotes後 - :

はあなたに

更新をありがとうございます。近くの完璧な答えが得られても、私はまだ質問を簡潔にしたい。

トレーニングセットとテストセットをプログラム的に分割するアプローチが必要でした。まずローカルディレクトリのファイルを読み込みます。次に、これらのファイルのリストを作成してシャッフルします。第3に、それらをトレーニングセットとテストセットに分割する。

初心者で初心者のpythonには、pythonのキーワードと関数を組み込み、いくつかの方法で失敗しました。最後に私はそれに近づく考えを得た。また、クロスバリデーションは、建物一般分類モデルのために考慮される良い選択肢です。答えをありがとう。

+0

あなたが例を挙げてやりたいために利用可能な多くの機能を持って学ぶScikit。あなたがそれらを適用する際に問題を見つける場合は、ネットを検索し、ここに投稿してください –

+0

質問に間違いありませんか?会員が質問を下落させる理由は? –

+1

Stackoverflowは意見を表明するためのものではありません。それはプログラミングのためです。あなたは単に何の努力もしないで尋ねているだけです。 –

答えて

3

わからない正確には私は包括的にしようとします。いくつかのステップがあります:

  1. ファイルのリストは、トレーニングとテストにファイルに
  2. 分割ファイルをランダム取得すること
  3. が事

1.取得を行います設定しますファイルのリスト

あなたのファイルはすべて、拡張子が.dataで、すべてがフォルダ0になっているとします。我々がしたいことは、これらのファイルすべてのリストを取得することです。これは、osモジュールで簡単に実行されます。私はサブディレクトリがないと仮定しています。もしあれば、これは変わるだろう。

import os 

def get_file_list_from_dir(datadir): 
    all_files = os.listdir(os.path.abspath(datadir)) 
    data_files = list(filter(lambda file: file.endswith('.data'), all_files)) 
    return data_files 

我々はget_file_list_from_dir('/ml/data')を呼び出すことだったのであれば、私たちは、そのディレクトリ内のすべてのファイル.data(グロブ/ml/data/*.dataへのシェルで相当)のリストを取り戻すでしょう。それはML分類器を訓練するために貧しい人々の道を考えられているよう

2.ランダム化ファイル

私たちは、サンプリングが予測可能になりたくありません。

from random import shuffle 

def randomize_files(file_list): 
    shuffle(file_list) 

random.shuffleインプレースシャッフリングを行うので、既存のリストを修正すること。

3分割ファイルトレーニングにとテストが

を設定します。(あなたはそれがより多くの意味を作る作るために別の関数にこれを書くことができます。もちろん、あなただけのrandomize_filesの代わりにshuffleを呼び出すことができますので、この機能はかなり愚かです)特定の数の文書の代わりに70:30の比率を仮定します。だから、:

from math import floor 

def get_training_and_testing_sets(file_list): 
    split = 0.7 
    split_index = floor(len(file_list) * split) 
    training = file_list[:split_index] 
    testing = file_list[split_index:] 
    return training, testing 

4.事

これは、各ファイルを開いて、あなたのトレーニングやテストを行うステップで行ってください。私はあなたにこれを残すよ!好奇心のうち


クロスバリデーション

、あなたはcross-validationを使用して検討していますか?これはデータを分割して、すべての文書をトレーニングとテストに使用する方法です。それぞれの「折りたたみ」で、トレーニングに使用するドキュメントの数をカスタマイズできます。私はあなたが好きならこれでもっと深く進むことができますが、あなたがそれをしたくなければ私はしません。

編集:申し訳ありませんが、私はこれをもう少し説明します。

私たちは1000文書のデータセットを持っています。クロスバリデーションの考え方は、すべてをトレーニングとテストの両方に使用できるということです。データセットを「折り畳み」と呼ぶものに分割しました。フォールドの数は、任意の時点でのトレーニングセットとテストセットのサイズを決定します。

10倍交差検証システムが必要だとします。つまり、トレーニングとテストのアルゴリズムは10回実行されます。初回は1-100のドキュメントを練習し、101-1000のテストを行います。 2番目のフォールドは101-200でトレーニングし、1-100と201-1000でテストします。

たとえば、40倍CVシステムの場合、最初の折り畳みは文書1-25で行い、26-1000でテストし、2番目の折り畳みは26-40で行い、1-25でテストし、 51-1000、およびそれ以降。

このようなシステムを実装するには、上記の手順(1)と(2)を実行する必要がありますが、手順(3)は異なります。トレーニング用とテスト用の2つのセットに分割する代わりに、関数をgeneratorにすることができます。この関数は、リストのように繰り返すことができます。

def cross_validate(data_files, folds): 
    if len(data_files) % folds != 0: 
     raise ValueError(
      "invalid number of folds ({}) for the number of " 
      "documents ({})".format(folds, len(data_files)) 
     ) 
    fold_size = len(data_files) // folds 
    for split_index in range(0, len(data_files), fold_size): 
     training = data_files[split_index:split_index + fold_size] 
     testing = data_files[:split_index] + data_files[split_index + fold_size:] 
     yield training, testing 

最後にキーワードyieldがこれを発電機にしています。

def ml_function(datadir, num_folds): 
    data_files = get_file_list_from_dir(datadir) 
    randomize_files(data_files) 
    for train_set, test_set in cross_validate(data_files, num_folds): 
     do_ml_training(train_set) 
     do_ml_testing(test_set) 

また、MLシステムの実際の機能を実装するのはあなた次第です。

免責事項として、私はいかなる専門家でもありません。しかし、私がここに書いたことについてあなたが何か質問があれば教えてください!

+0

私は1000のテキストドキュメント(.txt)をtf-idfを実装するためのトレーニングとテストセットに分割し、分類モデルを構築するためにalgoを適用したいと考えています。私の目的に合った2つのクラスにドキュメントを分類するもの。 –

+0

はい私はクロスバリデーションを考えました。しかし、初心者のために私はそれに行くことはないと思った。私もあなたにそれを説明するように依頼します。お願いします。 –

+0

@ BhabaniMohapatra私はいくつかのクロスバリデーションを行う方法を説明するために一番下の部分を更新しました。詳細はあなた次第ですが、私が書いたことはデータを適切にロードするのに役立ちます。ご質問がある場合はお知らせください。 –

0

os.listdir()を使用してファイル名のリストを作成するだけです。リストをシャッフルするcollections.shuffle()を使用して、training_files = filenames[:700]testing_files = filenames[700:]あなたはまず、文書をロードし、それらをnumpyの配列を作る、そして、numpyのを使用している場合は非常に簡単です

1

import numpy as np 

docs = np.array([ 
    'one', 'two', 'three', 'four', 'five', 
    'six', 'seven', 'eight', 'nine', 'ten', 
    ]) 

idx = np.hstack((np.ones(7), np.zeros(3))) # generate indexes 
np.random.shuffle(idx) # shuffle to make training data and test data random 

train = docs[idx == 1] 
test = docs[idx == 0] 

print(train) 
print(test) 

結果を:

['one' 'two' 'three' 'six' 'eight' 'nine' 'ten'] 
['four' 'five' 'seven'] 
関連する問題