Rewrite lab with BoW

This commit is contained in:
Chris Proctor
2026-06-07 08:55:58 -04:00
parent aaf5b17ad8
commit feeae0352b
4 changed files with 84 additions and 59 deletions

View File

@@ -4,8 +4,6 @@ from sklearn.feature_extraction import DictVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from cleaning.transformers import LowercaseTransformer
class FeatureExtractor(BaseEstimator, TransformerMixin):
def __init__(self, extract_fn):
@@ -24,10 +22,9 @@ class FeatureClassifier(BaseEstimator, ClassifierMixin):
def fit(self, X, y):
self._pipeline = Pipeline([
("lowercase", LowercaseTransformer()),
("features", FeatureExtractor(self.extract_features)),
("vec", DictVectorizer()),
("clf", LogisticRegression(C=self.C, max_iter=1000)),
("vectorizer", DictVectorizer()),
("classifier", LogisticRegression(C=self.C, max_iter=1000)),
])
y_binary = (np.array(y) == "spam").astype(int)
self._pipeline.fit(X, y_binary)
@@ -39,15 +36,15 @@ class FeatureClassifier(BaseEstimator, ClassifierMixin):
def extract_features(self, message):
return {
"contains_free": int("free" in message),
"contains_free": int("free" in message.lower()),
"num_exclamations": message.count("!"),
"length": len(message),
}
def feature_weights(self, top_n=10):
vec = self._pipeline.named_steps["vec"]
clf = self._pipeline.named_steps["clf"]
names = vec.get_feature_names_out()
weights = clf.coef_[0]
vectorizer = self._pipeline.named_steps["vectorizer"]
classifier = self._pipeline.named_steps["classifier"]
names = vectorizer.get_feature_names_out()
weights = classifier.coef_[0]
pairs = sorted(zip(names, weights), key=lambda x: abs(x[1]), reverse=True)
return pairs[:top_n]