2017-06-02 2 views
0

シンプルなNaive Bayesを使ってScikitを学習しています。Scikit-Learnでデータをロードするときにサンプルを持ち出すsklearn.datasets.load_files

本質的に、それぞれCat AとCat Bという名前の2つのフォルダがあり、それぞれが1,500個のテキストファイルで構成されています。

私はそうのような分類器を訓練するためにこれらのファイルをロードしています:

# Declare the categories 
categories = ['CatA', 'CatB'] 

# Load the dataset 
docs_to_train = sklearn.datasets.load_files("/Users/dh/Documents/Development/Python/Test_Data", description=None, categories=categories, load_content=True, shuffle=True, encoding='utf-8', decode_error='strict', random_state=0) 

私は、例えば、テキストの短い文字列で分類器をテストしています

docs_new = ['This is test string 1.', 'This is test string 2.', 'This is test string 3.'] 
X_new_counts = count_vect.transform(docs_new) 
X_new_tfidf = tfidf_transformer.transform(X_new_counts) 

predicted = clf.predict(X_new_tfidf) 

for doc, category in zip(docs_new, predicted): 
    print('%r => %s' % (doc, docs_to_train.target_names[category])) 

すべてはそれがあるべきように動作しますが、私が本当にしたいことは密接にトレーニングデータに類似しているいくつかのデータに分類器をテストしています。理想的には、分類器を列車で使用しているデータ内にサンプルを保持し、それをクロスバリデーションしたいと思っています。

トレーニングデータセットのそれぞれから500奇数のドキュメントを別のフォルダに移動することができますが、サンプルを作成するより良い方法があるかどうかは疑問でした。

documentationは、これに関するガイダンスでは提示されていません。

完全なコードは次のとおりです。

import sklearn 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.pipeline import Pipeline 
import numpy as np 
from sklearn import datasets 
from pprint import pprint 

# Declare the categories 
categories = ['CatA', 'CatB'] 

# Load the dataset 
docs_to_train = sklearn.datasets.load_files("/Users/dh/Documents/Development/Python/Test_Data", description=None, categories=categories, load_content=True, shuffle=True, encoding='utf-8', decode_error='strict', random_state=0) 

print len(docs_to_train.data) 

# Vectorise the dataset 

count_vect = CountVectorizer() 
X_train_counts = count_vect.fit_transform(docs_to_train.data) 

# Fit the estimator and transform the vector to tf-idf 

tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts) 
X_train_tf = tf_transformer.transform(X_train_counts) 
X_train_tf.shape 

tfidf_transformer = TfidfTransformer() 
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts) 
print X_train_tfidf.shape 

clf = MultinomialNB().fit(X_train_tfidf, docs_to_train.target) 

docs_new = ['I am test string 1.', 'I am test string 2', 'I am test string 3'] 
X_new_counts = count_vect.transform(docs_new) 
X_new_tfidf = tfidf_transformer.transform(X_new_counts) 

predicted = clf.predict(X_new_tfidf) 

for doc, category in zip(docs_new, predicted): 
    print('%r => %s' % (doc, docs_to_train.target_names[category])) 
+1

私はあなたがこのために探していると思う:[ 'sklearn.model_selection.train_test_split' '](http://scikit-learn.org/stable/modules/generated/sklearn .model_selection.train_test_split.html) – blacksite

+0

ありがとうございます@not_a_robot、私はそれが私が後にしていることかもしれないと思う! – DanielH

+0

完全な例が以下に掲載されています。 – blacksite

答えて

1

あなたが探しているのは「トレインテストスプリット」です。

使用sklearn.model_selection.train_test_split

from sklearn.model_selection import train_test_split 

train_X, test_X, train_y, test_y = train_test_split(docs_to_train.data, 
           docs_to_train.target, 
           test_size = 500) 
+0

素晴らしい!助けてくれてありがとう。 – DanielH

関連する問題