Je souhaite commencer à développer une application à l'aide du Machine Learning. Je veux classer le texte - spam ou non spam. J'ai 2 fichiers - spam.txt
, ham.txt
- qui contiennent des milliers de phrases par fichier. Si je veux utiliser un classificateur, disons LogisticRegression
.
Par exemple, comme je l'ai vu sur Internet, pour s'adapter à mon modèle, je dois faire comme ceci:
`lr = LogisticRegression()
model = lr.fit(X_train, y_train)`
Voici donc ma question, quels sont en fait X_train
et y_train
? Comment puis-je les obtenir de mes peines? J'ai cherché sur Internet, je n'ai pas compris, voici mon dernier appel, je suis assez nouveau sur ce sujet. Je vous remercie!
Selon la documentation (voir ici ):
X
correspond à votre matrice d'entités flottantes de forme (n_samples, n_features)
(aka. la matrice de conception de votre ensemble d'entraînement)y
est le vecteur cible flottant de la forme (n_samples,)
(le vecteur d'étiquette). Dans votre cas, étiquetez 0
pourrait correspondre à un exemple de spam et 1
à un jambonLa question est maintenant de savoir comment obtenir une matrice d'entités flottantes à partir de données texte.
Un schéma commun consiste à utiliser une vectorisation tf-idf (plus à ce sujet ici ), qui est disponible en sklearn
.
La vectorisation peut être chaînée à la régression logistique via l'API Pipeline
de sklearn
.
Voici à quoi ressemblerait le code à peu près
from itertools import chain
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
import numpy as np
# prepare string data
with open('spam.txt', 'r') as f:
spam = f.readlines()
with open('ham.txt', 'r') as f:
ham = f.readlines()
text_train = list(chain(spam, ham))
# prepare labels
labels_train = np.concatenate((np.zeros(len(spam)),np.ones(len(ham))))
# build pipeline
vectorizer = TfidfVectorizer()
regressor = LogisticRegression()
pipeline = Pipeline([('vectorizer', vectorizer), ('regressor', regressor)])
# fit pipeline
pipeline.fit(text_train, labels_train)
# test predict
test = ["Is this spam or ham?"]
pipeline.predict(test) # value in [0,1]