Среди различных библиотек с открытым исходным кодом, которые облегчают задачи классификации и регрессии и позволяют реализовывать проекты машинного обучения и машинного обучения,
scikit-learn, несомненно, является одним из самых универсальных и простых в использовании пакетов в любой ИТ-экосистеме.
На самом деле, scikit-learn демократизирует машинное обучение для (мл) непосвященного разработчика полного стека в большей степени, чем мы хотим признать.
Имея значительный репозиторий оценок и алгоритмов, он делает задачу НЛП или модуль машинного обучения удивительно быстр,
и достаточно эффективен для большого сегмента функциональных целей.
И хотя существует множество примеров текстовой классификации, имеющих дело с ограниченным корпусом и ограниченными категориями данных, в следующем фрагменте делается попытка пролить свет на внешнее обучение, т. е. обучающие данные, которые не помещаются в основную память рабочей станции, и как обрабатывать такие большие задачи классификации текстов корпуса с бесстрашным scikit-learn.
Итак, давайте быстро взглянем на scikit-learn во всей его синтаксической простоте и прямом подходе к эффективной классификации текстов с большими наборами данных.
Для иллюстрации мы возьмем набор данных обзора медицины, который содержит названия лекарств, состояния пациентов и обзоры первое.
Мы пропустим достаточно большой выборочный набор через реализованный оценщик skicit-learn и обучим модели учиться на обзорах, чтобы обратно предсказывать условие — не самое практическое применение этого набора данных, но оно подходит для нашей задачи. целей на данный момент.
Следует отметить, что именно этот набор данных был выбран из-за его высокой размерности, помимо размера корпуса, который как раз подходит
к нашему программному случаю.
Конкретный набор данных и цитаты для набора данных см. в конце статьи.
Теперь о самом коде; пожалуйста, обратитесь к репозиторию github https://github.com/kundanj/text-class-ooc-sk для соответствующего кода.
Необходимо: навыки работы с Python, см. README для установки скрипта в репозитории git.
Классификация крупного текста:
Для начала давайте перейдем непосредственно к pandas и позволим ему делать то, что у него получается лучше всего — нарезать CSV-файлы, чтобы получить нужные нам данные.
df=pd.read_csv(FILE_PATH + “/../data/drugsComTrain_raw.csv”) all_conditions = df[‘condition’] all_reviews = df[‘review’]
Возможно, беглый взгляд на данные подскажет нам, с чем мы имеем дело.
print(all_reviews.head(10)) print(all_conditions.head(10)) print(all_reviews.shape)
Итак, у нас есть корпус (весь словарный набор слов во всех образцах вместе) и классы, аккуратно размещенные в виде серий панд, которые составляют основу нашего тренировочного упражнения.
Для быстрого основного списка классов/условий
for category in all_conditions: if category not in classes: classes.append(category)
Мы будем использовать эти данные для проведения нашего обучения. Но перед этим нам нужно преобразовать данные в машиночитаемый формат.
Для тех, кто опоздал, оценщики машинного обучения работают с числовыми конструкциями, а не с текстовым бредом. Поэтому нам нужно преобразовать
тексты в числа и найти правильные взвешенные представления для слов в каждой выборке данных (обзоре), которые определят правильный применимый класс (условие).
Для меток это как проще сделать как сказано
y_all = [ classes.index(x) for x in all_conditions ]
Как принято упоминать в конвейере НЛП, перед извлечением признаков может быть проведена определенная предварительная обработка образцов текста, которая может включать токенизацию (слово/символ) с последующим удалением стоп-слов, лемматизацией и т. д. Большинство из них уже выполняются HashVectorizer (преобразование в нижний регистр, игнорирование пунктуации и т. д.)
Однако эффект пользовательской предварительной обработки (например, стоп-слова) может зависеть от конкретной проблемы и может быть включен в конвейер в каждом конкретном случае.
> Мы также обязаны сделать здесь еще одно предостережение — подход Bag of Words/n-gram игнорирует позиционную информацию в текстах, что означает, что контекстуальная релевантность, семантические значения и т. д. игнорируются.
Обратите внимание, что вместо разделения данных обучения вы можете использовать отдельные данные тестирования, которые поставляются с этим набором данных.
Большинство вызовов функций, описанных выше, являются семантикой параметров, за исключением n-граммы, о которой нужно кратко упомянуть — вместо этого из функций, состоящих только из одного слова, мы также берем двойные слова, например. чтобы потенциально учесть нюанс между «головной болью» и «хронической головной болью».
#as the name suggests, split training data X_train, X_test, Y_train, Y_test = train_test_split(clean_corpus(all_reviews), y_all, test_size=0.15, random_state=42) vectorizer = HashingVectorizer(ngram_range=(1,2), strip_accents='ascii', n_features=2**18) X_train_hashed = vectorizer.transform(X_train) tfidf_transformer=TfidfTransformer() X_train = tfidf_transformer.fit_transform(X_train_hashed) X_test_hashed = vectorizer.transform(X_test) X_test = tfidf_transformer.transform(X_test_hashed)
Наконец модель. Мы используем классификатор SGD, в данном случае оптимизатор линейного SVM. Мы будем использовать SGD как средство подбора линейного классификатора.
Не углубляясь в математику моделей, которая здесь выходит за рамки, линейная модель подразумевает форму алгебраического уравнения, в которой предполагаемая цель представляет собой линейную сумму. взвешенных функций — подумайте о коэффициентах и перехватах.
SGD выбран из-за его полезности при обработке большого количества выборок и функций. И это хорошо вписывается в механизм partial_fit для дополнительного обучения.
Мы используем линейный SVM для функции потерь, как указано параметром «шарнир».
Кроме того, программно SGD имеет удобную адаптируемость к инкрементной подгонке, как мы увидим в приведенном ниже блоке кода. SGD относится к определенному набору оценщиков, которые поддаются инкрементному обучению, т.е. когда весь корпус не загружается в алгоритм сразу.
Хотя большой размер корпуса, как в нашем случае, может не вписаться в модели за один раз, необходимы дополнительные шаги, когда мы используем partial_fit
с обучающими наборами, разделенными на пакеты.
Мы получаем точность 71%, что является хорошей отправной точкой. Если вам нужно поиграть с моделью, используйте model.predict для классификации заболеваний на основе симптомов или используйте приведенные ниже конструкции кода.
epoch = 5 batchsize = 1000 model = SGDClassifier(loss="hinge", penalty="l2") batches = int(X_train.shape[0]/batchsize) + 1 samples = X_train.shape[0] for i in range(epoch): for j in range(batches): #print('in j...', j, j*batchsize, '----2is:',samples, (j+1)*batchsize ) model.partial_fit(X_train[j*batchsize:min(samples,(j+1)*batchsize)], Y_train[j*batchsize:min(samples,(j+1)*batchsize)], classes=range(len(classes))) print ("Accuracy on testing data :", epoch, model.score(X_test, Y_test))
С тонкой настройкой гиперпараметров модели и итераций эпох можно поиграться, и это может помочь, однако увеличение размера пакетов обычно не помогает повысить точность, особенно в SGD.
test_stmt = [] test_stmt.append(input_statement) X_testing_counts = vectorizer.transform(clean_corpus(test_stmt)) X_testing = tfidf_transformer.transform(X_testing_counts) predicted = model.predict(X_testing) for doc, category in zip(test_stmt, predicted): return classes[category]
Вот и все, что нужно для краткого и быстрого знакомства с классификацией больших текстов с помощью обучения scikit. Удачного кодирования!
Набор данных и цитирование:
«https://www.kaggle.com/jessicali9530/kuc-hackathon-winter-2018?select=drugsComTest_raw.csv»
Благодарности за набор данных:
Набор данных изначально был опубликован в репозитории машинного обучения UCI. Образец цитирования: Феликс Грассер, Сурья Каллумади, Хаген Мальберг и Себастьян Заунседер. 2018. Аспектный анализ настроений в обзорах лекарств с применением междоменного обучения и перекрестного обучения. В материалах Международной конференции по цифровому здравоохранению 2018 г. (DH '18). ACM, Нью-Йорк, штат Нью-Йорк, США, 121–125.
«Предложения по подаче заявок на Mlearning.ai
Как стать писателем на Mlearning.aimedium.com»
Нестандартная текстовая классификация с несколькими метками с помощью scikit-learn