2017-06-02 2 views
0

J'expérimente avec un simple Naive Bayes avec Scikit-learn. Essentiellement, j'ai deux dossiers, respectivement nommés Cat A et Cat B, dont chacun se compose d'environ 1 500 fichiers texte.Tenir l'échantillon lors du chargement des données dans Scikit-Learn avec sklearn.datasets.load_files

Je chargement de ces fichiers afin de former le classificateur comme ceci:

# 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) 

Je teste le classificateur avec des chaînes courtes de texte, par exemple

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])) 

Tout fonctionne comme il se doit, mais ce que je voudrais vraiment faire est de tester le classificateur sur certaines données qui ressemble étroitement aux données de formation. Idéalement, je voudrais sculpter un échantillon dans les données que j'utilise pour former le classificateur, puis effectuer une validation croisée avec cela. Je suppose que je pourrais simplement déplacer 500 documents impairs de chacun des ensembles de données d'entraînement dans des dossiers différents, mais je me demandais s'il y avait une meilleure façon de créer l'échantillon de rétention? Le documentation ne semble pas offrir de conseils sur ce sujet.

Le code est entièrement suivi.

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

Je pense que vous cherchez ceci: [ 'sklearn.model_selection.train_test_split' '] (http://scikit-learn.org/stable/modules/generated/sklearn .model_selection.train_test_split.html) – blacksite

+0

Merci @not_a_robot, je pense que c'est peut-être juste ce que je cherche! – DanielH

+0

Exemple complet posté ci-dessous. – blacksite

Répondre

1

Ce que vous recherchez est appelé «partage de train-test».

Utilisation 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

Super! Merci pour l'aide. – DanielH