LinearSVC on text, with probabilities added
Frequently edges out logistic regression on TF-IDF. Its one gap is that it has no predict_proba — calibration fixes that.
from sklearn.svm import LinearSVC
from sklearn.calibration import CalibratedClassifierCV
from sklearn.pipeline import Pipeline
# Fast, handles sparse input directly, scales to large vocabularies
svc = LinearSVC(C=1.0, class_weight="balanced", max_iter=5000, dual="auto")
# LinearSVC gives decision_function, not predict_proba. If you need to
# threshold on a probability, wrap it.
clf = CalibratedClassifierCV(svc, method="sigmoid", cv=5)
pipe = Pipeline([("tfidf", TfidfVectorizer(ngram_range=(1, 2), min_df=3)),
("clf", clf)])
pipe.fit(X_train, y_train)
print(pipe.predict_proba(X_test[:3]).round(3))