Полученные файлы данных имели формат 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 для объединения обоих фреймов данных.