Полученные файлы данных имели формат json. Поэтому сначала он был преобразован с использованием следующего кода:
import json import numpy as np import pandas as pd with open('train.json') as file: train=json.load(file) file.close() train = pd.read_json('train.json')
Основная задача состоит в том, чтобы предсказать authorId или имя автора на основе предоставленных поясняющих факторов. Переменные включали идентификатор статьи, название, автора, имя автора, год и место проведения.
Для простоты мы будем рассматривать только абстрактные значения для предсказания authorId.
Выборка
Исключение авторов только с одной статьей из проверочного разделения может потенциально улучшить оценку производительности модели машинного обучения на тестовых данных. Это связано с тем, что тестовые данные обычно строятся таким образом, который отражает распределение данных, с которыми модель столкнется в реальном использовании.
Если разделение проверки включает большое количество авторов только с одной статьей, модель может плохо работать с этим подмножеством данных из-за ограниченного объема информации, доступной для обучения. Это может привести к переоценке производительности модели на тестовых данных, которые могут содержать аналогичное распределение авторов одной статьи.
С другой стороны, если разделение проверки исключает авторов только с одной статьей, модель будет оцениваться на более репрезентативном подмножестве данных, которые могут быть более похожими на тестовые данные. Это может дать более точную оценку производительности модели на тестовых данных и может помочь избежать чрезмерно оптимистичных оценок производительности.
Стоит отметить, что такой подход не всегда может быть уместным, а оптимальный способ разделения данных будет зависеть от конкретных характеристик данных и решаемой задачи. Возможно, потребуется поэкспериментировать с различными разбиениями проверки, чтобы найти тот, который дает наиболее надежные оценки производительности.
train['counts'] = train.groupby('authorId')['authorId'].transform('count') print(max(train["counts"])) train['counts'] train_n = train[train['counts'] > 2] train_n['authorId'] = train_n['authorId'].astype('category')
Извлечение признаков
В задаче классификации текста часто необходимо преобразовать необработанные текстовые данные в форму, которая может быть обработана и понята алгоритмами машинного обучения. Этот процесс известен как проектирование признаков и включает в себя извлечение соответствующих признаков из текстовых данных и представление их в числовой форме.
Есть несколько причин, по которым важно преобразовывать текстовые данные в задаче классификации текста:
Текстовые данные обычно неструктурированы, и алгоритмы машинного обучения ожидают в качестве входных данных структурированные данные. Преобразование текстовых данных в структурированную форму позволяет алгоритмам обрабатывать данные и учиться на них.
Текстовые данные часто бывают очень многомерными, с большим количеством уникальных слов или символов. Это может привести к «проклятию размерности», когда модели трудно учиться на данных из-за большого количества признаков. Преобразование текстовых данных в представление меньшего размера может помочь модели обучаться более эффективно.
Текстовые данные могут содержать много шума и нерелевантной информации, такой как орфографические ошибки, опечатки и стоп-слова (например, «the», «a», «an»). Удаление этого шума может помочь модели сосредоточиться на наиболее релевантных и прогностических функциях.
Существует множество различных методов преобразования текстовых данных в числовую форму, в том числе набор слов, частотно-обратная частота документа (TF-IDF) и встраивание слов. Выбор метода будет зависеть от конкретной задачи и требований используемого алгоритма машинного обучения.
Лучше всего в этом сценарии работал TF-IDF. TF-IDF — это числовая статистика, которая используется для отражения важности термина в документе или наборе документов. Он часто используется в задачах анализа текста и поиска информации как способ взвешивания и определения приоритета наиболее релевантных и важных слов или фраз в документе. Термины с более высоким баллом TF-IDF считаются более важными и релевантными для документа, в то время как термины с более низким баллом менее важны и менее релевантны.
from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer() vectorizer.fit(train_n['text']) features = vectorizer.transform(train_n['text']) print(type(features)) features.shape
Следующим шагом было разделение данных на тренировочный и тестовый наборы. Размер тестового набора составлял 30 % исходного набора данных.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(features, train_n['authorId'], test_size=0.3, random_state=42)
Обучение модели
Для обучения данных мы использовали SGDclassifier. Причины для его выбора заключаются в следующем;
Эффективность: SGD — это эффективный алгоритм, который может обрабатывать большие наборы данных и многомерные данные. Он особенно хорошо подходит для онлайн-обучения, когда данные обрабатываются постепенно небольшими партиями, а не все сразу.
Масштабируемость: SGD — это масштабируемый алгоритм, который можно использовать для обучения крупномасштабных моделей в распределенных системах.
Гибкость: SGD можно использовать для оптимизации широкого спектра функций потерь, в том числе используемых в линейной регрессии, логистической регрессии и машинах опорных векторов.
Регуляризация: SGD поддерживает различные типы регуляризации, такие как регуляризация L1 и L2, которые могут помочь предотвратить переоснащение и улучшить обобщение модели.
Настройка гиперпараметров: SGD имеет относительно мало гиперпараметров, что упрощает настройку и оптимизацию модели.
from sklearn.linear_model import SGDClassifier sgd_classifier = SGDClassifier(loss='modified_huber', penalty='l2', alpha=0.001, random_state=42) sgd_classifier.fit(X_train, y_train)
Обширная настройка гиперпараметров была важна для получения идеальной модели.
predictions = sgd_classifier.predict(X_test) from sklearn.metrics import accuracy_score accuracy_score(y_test, predictions)
Прогнозы были сделаны на тестовом наборе, и полученная точность составила 15,2 %. Чтобы получить более высокую точность на тестовом наборе, можно включить больше предикторов, таких как место проведения. Вы можете использовать функцию concat для объединения обоих фреймов данных.