Вопрос или проблема
Я хотел бы настроить некоторые параметры для моего линейного 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
, нужно сначала понять природу этих ошибок и корректно подготовить данные.
Понимание ошибок
-
ValueError: could not convert string to float:
Эта ошибка возникает, когда ваша модель пытается обработать строковые данные там, где ожидаются числовые значения. Ваша модель не может принимать текстовые строки в качестве входных данных для параметров, которые должны быть числовыми. -
FitFailedWarning:
Это предупреждение происходит, когда произойдет ошибка в процессе подгонки модели на некоторых комбинациях параметров, приведенной вGridSearchCV
. ЕслиGridSearchCV
не может адаптировать модель к данным, он устанавливает значение для этих параметров какnan
, что делает их неблагоприятными для оценки.
Шаги к решению проблемы
-
Проверка данных:
Как правильно указано, начните с проверки информации о ваших DataFrame. Это можно сделать с помощью:print(train_df.info()) print(test_df.info())
Вам нужно проверить, что все столбцы, используемые в модели, имеют правильные типы данных. Убедитесь, что целевая переменная (
truth
) и любые другие числовые столбцы не имеют строкового типа. -
Предобработка текста:
Если ваша текстовая колонка содержит строки, необходимо использовать соответствующие методы в пайплайне, чтобы преобразовать текстовые данные в числовые. Один из способов, который вы используете, этоTfidfVectorizer
, и это хорошее начало. -
Модификация 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
Заключение
Следуя предложенным шагам, вы будете способны устранить возникающие ошибки и улучшить качество своей модели. Важно внимательно подходить к каждому этапу обработки данных и проверять типы данных, чтобы избежать подобных проблем в будущем. Удачи в ваших исследованиях и разработках в области машинного обучения!