GridSearchCV() для тонкой настройки выводов ValueError и FitFailedWarning

Вопрос или проблема

Я хотел бы настроить некоторые параметры для моего линейного SVM. Вот код:
class SVMSentiment(Base):
“””Предсказывает оценки настроения с помощью линейной машины опорных векторов (SVM).
Использует конвейер sklearn.
“””
def __init__(self, model_file: str=None) -> None:
super().__init__()
# pip install sklearn
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidfVectorizer
from sklearn.linear_model import SGDClassifier
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
self.pipeline = Pipeline(
[
#(‘vect’, CountVectorizer()),
#(‘tfidf’, TfidfTransformer()),
(‘tfidf’, TfidfVectorizer()),
(‘clf’, LinearSVC(
#(‘clf’, SGDClassifier(
# loss=”hinge”,
# penalty=’l2′,
#alpha=1e-4,
#random_state=42,
#max_iter=100,
#learning_rate=”optimal”,
#tol=None,
)),
]
)

def predict(self, train_file: str, test_file: str, lower_case: bool) -> pd.DataFrame:
“Обучает модель, используя конвейер sklearn”
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
train_df = self.read_data(train_file, lower_case)
parameters = {‘C’: [1, 10],
‘gamma’: [0.001, 0.01, 1]}
model = SVC()
grid = GridSearchCV(estimator=model, param_grid=parameters)
grid.fit(train_df[‘text’], train_df[‘truth’])
print(grid)
# обобщить результаты поиска по сетке
print(grid.best_params_)
print(grid.best_estimator_)

learner = self.pipeline.fit(train_df[‘text’], train_df[‘truth’])
# Обучить модель на тестовых данных
test_df = self.read_data(test_file, lower_case)

test_df[‘pred’] = learner.predict(test_df[‘text’])
return test_df

Тем не менее, у меня возникают некоторые проблемы, так как была выдана ошибка ValueErrors:
ValueError: невозможно преобразовать строку в число с плавающей запятой

и я не знаю, как справиться с этой информацией. А также:
FitFailedWarning: Ожидание оценщика не удалось. Оценка на этом разделе “обучение-тест”
для этих параметров будет установлена в nan

Как я могу это решить?

Проблема заключается в том, что данные train_df или test_df, откуда бы ни возникла ошибка, имеют столбец, который имеет строковый (объектный) тип данных. Вы не можете подгонять строковые данные под модель. Разрешены только численные данные.

Попробуйте вывести:
print(train_df.info())
print(test_df.info())

чтобы увидеть, какой столбец должен быть типа float, но является строкой.

Ответ или решение

Чтобы наладить процесс обучения модели с использованием GridSearchCV() и устранить возникающие ошибки, такие как ValueError: could not convert string to float и FitFailedWarning, нужно сначала понять природу этих ошибок и корректно подготовить данные.

Понимание ошибок

  1. ValueError: could not convert string to float:
    Эта ошибка возникает, когда ваша модель пытается обработать строковые данные там, где ожидаются числовые значения. Ваша модель не может принимать текстовые строки в качестве входных данных для параметров, которые должны быть числовыми.

  2. FitFailedWarning:
    Это предупреждение происходит, когда произойдет ошибка в процессе подгонки модели на некоторых комбинациях параметров, приведенной в GridSearchCV. Если GridSearchCV не может адаптировать модель к данным, он устанавливает значение для этих параметров как nan, что делает их неблагоприятными для оценки.

Шаги к решению проблемы

  1. Проверка данных:
    Как правильно указано, начните с проверки информации о ваших DataFrame. Это можно сделать с помощью:

    print(train_df.info())
    print(test_df.info())

    Вам нужно проверить, что все столбцы, используемые в модели, имеют правильные типы данных. Убедитесь, что целевая переменная (truth) и любые другие числовые столбцы не имеют строкового типа.

  2. Предобработка текста:
    Если ваша текстовая колонка содержит строки, необходимо использовать соответствующие методы в пайплайне, чтобы преобразовать текстовые данные в числовые. Один из способов, который вы используете, это TfidfVectorizer, и это хорошее начало.

  3. Модификация Pipeline:
    Вам нужно быть уверенным, что ваш GridSearchCV использует правильный пайплайн, а не отдельный классификатор, когда выполняется поиск гиперпараметров. В вашем случае, SVC() не должен использоваться отдельно. Вместо этого следует настроить использование TfidfVectorizer вместе с LinearSVC в GridSearchCV. Это можно сделать следующим образом:

    parameters = {'clf__C': [1, 10],
                 'clf__gamma': [0.001, 0.01, 1]}
    grid = GridSearchCV(estimator=self.pipeline, param_grid=parameters)
    grid.fit(train_df['text'], train_df['truth'])

Полный пример кода

Обновите метод predict следующим образом:

def predict(self, train_file: str, test_file: str, lower_case: bool) -> pd.DataFrame:
    "Train model using sklearn pipeline"
    from sklearn.model_selection import GridSearchCV
    from sklearn.svm import LinearSVC
    train_df = self.read_data(train_file, lower_case)

    # Параметры для настройки
    parameters = {
        'clf__C': [1, 10],
    }

    grid = GridSearchCV(estimator=self.pipeline, param_grid=parameters, scoring='accuracy', n_jobs=-1)
    grid.fit(train_df['text'], train_df['truth'])
    print(grid.best_params_)
    print(grid.best_estimator_)

    test_df = self.read_data(test_file, lower_case)
    test_df['pred'] = grid.predict(test_df['text'])  # Используем модель из GridSearchCV
    return test_df

Заключение

Следуя предложенным шагам, вы будете способны устранить возникающие ошибки и улучшить качество своей модели. Важно внимательно подходить к каждому этапу обработки данных и проверять типы данных, чтобы избежать подобных проблем в будущем. Удачи в ваших исследованиях и разработках в области машинного обучения!

Оцените материал
Добавить комментарий

Капча загружается...