From 8144fda3898388c1d2163fa1969b04b190fcad2b Mon Sep 17 00:00:00 2001 From: Yanjun Qi / Jane Date: Fri, 14 Aug 2026 17:41:55 -0400 Subject: [PATCH] Fix SklearnModelWrapper: get_feature_names() removed in sklearn 1.2+ self.tokenizer.get_feature_names() (tokenizer here is actually a fitted CountVectorizer/TfidfVectorizer) was removed from scikit-learn in 1.2 (Dec 2022) in favor of get_feature_names_out(), added in 1.0. Any SklearnModelWrapper usage - including its own demo, docs/2notebook/Example_1_sklearn.ipynb - has been broken with any scikit-learn released in the last several years, raising AttributeError on the first real prediction call. Verified: reproduced the AttributeError against the currently pinned scikit-learn (1.7.2), confirmed get_feature_names_out() works end-to-end through the actual wrapper. Also fixed the notebook's `!pip install ... sklearn` to `scikit-learn`: the `sklearn` PyPI package name is deprecated and its installer now aborts with an explicit error directing users to scikit-learn instead. Kept the notebook's existing recorded outputs/execution counts intact (surgical text substitution rather than a full NotebookEdit cell replace, which would have wiped them). Co-Authored-By: Claude Sonnet 5 --- docs/2notebook/Example_1_sklearn.ipynb | 10 +++++----- textattack/models/wrappers/sklearn_model_wrapper.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/2notebook/Example_1_sklearn.ipynb b/docs/2notebook/Example_1_sklearn.ipynb index 7826f18ff..5600c52a1 100644 --- a/docs/2notebook/Example_1_sklearn.ipynb +++ b/docs/2notebook/Example_1_sklearn.ipynb @@ -72,7 +72,7 @@ } ], "source": [ - "!pip install datasets nltk sklearn" + "!pip install datasets nltk scikit-learn" ] }, { @@ -295,11 +295,11 @@ " vectFit = vect.fit(training[column_name])\n", " BOW_training = vectFit.transform(training[column_name])\n", " BOW_training_df = pd.DataFrame(\n", - " BOW_training.toarray(), columns=vect.get_feature_names()\n", + " BOW_training.toarray(), columns=vect.get_feature_names_out()\n", " )\n", " BOW_testing = vectFit.transform(testing[column_name])\n", " BOW_testing_Df = pd.DataFrame(\n", - " BOW_testing.toarray(), columns=vect.get_feature_names()\n", + " BOW_testing.toarray(), columns=vect.get_feature_names_out()\n", " )\n", " return vectFit, BOW_training_df, BOW_testing_Df\n", "\n", @@ -311,11 +311,11 @@ " Tfidf_fit = Tfidf.fit(training[column_name])\n", " Tfidf_training = Tfidf_fit.transform(training[column_name])\n", " Tfidf_training_df = pd.DataFrame(\n", - " Tfidf_training.toarray(), columns=Tfidf.get_feature_names()\n", + " Tfidf_training.toarray(), columns=Tfidf.get_feature_names_out()\n", " )\n", " Tfidf_testing = Tfidf_fit.transform(testing[column_name])\n", " Tfidf_testing_df = pd.DataFrame(\n", - " Tfidf_testing.toarray(), columns=Tfidf.get_feature_names()\n", + " Tfidf_testing.toarray(), columns=Tfidf.get_feature_names_out()\n", " )\n", " return Tfidf_fit, Tfidf_training_df, Tfidf_testing_df\n", "\n", diff --git a/textattack/models/wrappers/sklearn_model_wrapper.py b/textattack/models/wrappers/sklearn_model_wrapper.py index 9c9d80742..5e99ab584 100644 --- a/textattack/models/wrappers/sklearn_model_wrapper.py +++ b/textattack/models/wrappers/sklearn_model_wrapper.py @@ -23,7 +23,7 @@ def __init__(self, model, tokenizer): def __call__(self, text_input_list, batch_size=None): encoded_text_matrix = self.tokenizer.transform(text_input_list).toarray() tokenized_text_df = pd.DataFrame( - encoded_text_matrix, columns=self.tokenizer.get_feature_names() + encoded_text_matrix, columns=self.tokenizer.get_feature_names_out() ) return self.model.predict_proba(tokenized_text_df)