Куора: –

Quora — это место, где можно получить и поделиться знаниями. Это платформа, на которой вы можете задать любой вопрос и получить ответы от разных людей с уникальными идеями. В то же время важно обращаться с токсичным содержимым, чтобы пользователи могли безопасно делиться своими знаниями.

Quora выступила с kaggle-челленджом, чтобы решить проблему токсичного контента, ничего, кроме удаления неискренних вопросов (тех, которые основаны на ложных предпосылках или направлены на то, чтобы сделать заявление, а не искать полезные ответы).

Постановка задачи:-

Создайте модель для предсказания того, искренен ли вопрос, заданный на Quora, или нет.

Понимание данных: -

Quora предоставила хороший объем обучающих и тестовых данных для выявления неискренних вопросов, неискренний вопрос определяется как вопрос, предназначенный для утверждения, а не для поиска полезных ответов.

Поля данных: -

  • qid — уникальный идентификатор вопроса
  • question_text — Текст вопроса Quora
  • цель — вопрос с пометкой «неискренний» имеет значение 1, иначе 0

Загрузка данных:-

Используя apk Kaggle, мы можем загрузить данные непосредственно из kaggle, используя приведенный ниже код, перед которым вам необходимо аутентифицировать свою учетную запись с помощью файла kaggle.json.

!pip install -q kaggle
!mkdir -p ~/.kaggle
!cp kaggle.json ~/.kaggle/

!chmod 600 ~/.kaggle/kaggle.json

!kaggle соревнования загрузить quora-incere-questions-classification -f train.csv

Мой подход: -

Поскольку цель модели состоит в том, чтобы предсказать метку заданного вопроса, я решил начать с самого простого и прямого подхода применения алгоритма классификации Наивного Байеса к приведенным выше данным для предсказания неискренних вопросов.

Наивный Байес: -

Работа самого популярного алгоритма на простом решении и навье-байесовском алгоритме — хорошее тому доказательство.

Алгоритм наивного Байеса называется «navie», потому что он предполагает, что появление определенного признака не зависит от появления других признаков.

Работая над решением проблемы обработки естественного языка, наивный байесовский метод отлично работает для быстрых, точных и надежных решений. Наивный байесовский классификатор — это вероятностная модель машинного обучения. Исходя из семейства вероятностных алгоритмов, наивный байесовский классификатор основан на очень известной теореме Байеса, которая также известна как правило Байеса или закон Байеса. Это дает нам метод расчета условной вероятности, то есть вероятности события, основанной на предыдущих знаниях, доступных для событий.

Теорема Байеса:-

Теорема Байя формулируется следующим образом: Вероятность события B при данном A равна вероятности события A при данном B, умноженной на вероятность A при вероятности B.

Используя теорему Байеса, мы можем найти вероятность того, что произойдет А, при условии, что произошло Б. B — это свидетельство, а A — гипотеза.

scikit Learn (библиотека Python) поможет здесь построить наивную байесовскую модель в Python. В библиотеке обучения scikit есть три типа наивной байесовской модели:

Гауссов: он используется в классификации и предполагает, что признаки следуют нормальному распределению.

Полиномиальный: используется для дискретных подсчетов. Например, допустим, у нас есть задача классификации текста. Здесь мы можем рассмотреть испытания Бернулли, которые на один шаг дальше, и вместо «слово, встречающееся в документе», мы имеем «подсчет того, как часто слово встречается в документе», вы можете думать об этом как о «количество раз, когда число результата x_i наблюдается над русскими испытаниями».

Бернулли: Биномиальная модель полезна, если ваши векторы признаков являются бинарными (то есть нулями и единицами). Одним из приложений может быть классификация текста с моделью «мешка слов», где 1 и 0 означают «слово встречается в документе» и «слово не встречается в документе» соответственно.

Основываясь на вашем наборе данных, вы можете выбрать любую из рассмотренных выше моделей. Ниже приведен пример модели Гаусса.

Обработка данных:-

Мы не можем применить алгоритм Нави-Байеса непосредственно к данным поезда, поскольку данные, которые у нас есть, представляют собой текстовые данные, которые алгоритм не сможет понять. Поэтому мы преобразуем текст в вектор и перед применением любого алгоритма машинного обучения на очистка текстовых данных, такая как дублирование данных и предварительная обработка текста, должна выполняться с использованием ниже

  1. Удаление пунктуации
  2. Токенизация
  3. Стемминг
  4. лемматизация
  5. Орфографическая коррекция

Теперь мы готовы преобразовать текст в вектор, и есть разные способы сделать это. Ниже приведены популярные подходы, которые мы используем.

  1. ЛУК (униграмм и биграмм)
  2. tf-idf
  3. word2Vec
  4. Среднее слово2Vec

Для работы над проблемой Quora, поскольку внешние источники данных не допускаются для этого конкурса, мы используем вложение GoogleNews-vectors-negative300, которое было предоставлено вместе с данными.

Кодирование:-

Использование Google Новостей Word2Vectors:-

Это предварительно обученная модель, предоставленная Google. В этом репозитории размещена word2vec предварительно обученная модель векторов слов Google News (3 миллиарда повторяющихся слов) (3 миллиона 300-мерных векторов английских слов).

из gensim.models импортировать KeyedVectors

w2v_model_google = KeyedVectors.load_word2vec_format(‘/content/embeddings/GoogleNews-vectors-negative300/GoogleNews-vectors-negative300.bin’, binary=True)

используя приведенную выше модель и Avgword2Vec, мы преобразуем наш текст в вектор и создаем обучающие и тестовые данные из выборочных данных.

Теперь, используя приведенный ниже код, мы можем применить наивный байесовский метод Бернулли для создания необходимой модели для прогнозирования меток вопроса.

%time
из sklearn.model_selection импортировать GridSearchCV
из sklearn.naive_bayes импортировать BernoulliNB

bnb = BernoulliNB()
param_grid = {'alpha':[1000,500,100,50,10,5,1,0.5,0.1,0.05,0.01,0.005,0.001,0.0005,0.0001]} # параметры, которые нам нужны попробовать классификатор
tscv = TimeSeriesSplit(n_splits=10) #Для разделения по времени
gsv = GridSearchCV(bnb,param_grid,cv=tscv,verbose=1)
gsv.fit(X_train ,y_train)

print("Лучший гиперпараметр: ",gsv.best_params_)
print("Лучшая точность: %.2f%%"%(gsv.best_score_*100))

И для проверки точности тестовых данных мы используем f1_score

# Проверка точности на тестовых данных
из sklearn.naive_bayes import BernoulliNB
из sklearn.metrics import f1_score
bnb = BernoulliNB(alpha=0,001)
bnb.fit(X_train,y_train)
y_pred = bnb.predict(X_test)
print("Оценка F1 на тестовом наборе: %0.3f"%(f1_score(y_test, y_pred,pos_label='positive')))
print("Матрица путаницы тестового набора:\n [[TN FP]\n [FN TP] ]\n")
df_cm = pd.DataFrame(confusion_matrix(y_test, y_pred), range(2),range (2))
sns.set(font_scale=1.4)#для размера метки
sns.heatmap(df_cm, annot=True,annot_kws={"size": 16}, fmt='g')