Машинное обучение: решение автора мечты о красных особняках (Байесовская классификация)

машинное обучение искусственный интеллект алгоритм

В предыдущей статье использовался алгоритм кластеризации, чтобы судить об авторе «Сон о красных особняках» без предположений.В этой статье предполагается использовать байесовскую классификацию метода обучения с учителем.Предполагается, что последние 40 глав не были написаны Цао Сюэцинь, поэтому я сделает проверку.

О лучшем байесовском объяснении, которое я читал: простое объяснение наивной байесовской классификации

основной процесс

Давайте сначала введем предположение, что первые 80 глав и последние 40 глав написаны разными авторами. Используя вектор слов, построенный в предыдущей статье, выполните стратифицированную случайную выборку набора данных, например, случайным образом выберите 60 из первых 80 раз и 30 из последних 40 раз для обучения, а затем сделайте прогнозы. Если прогнозы работают хорошо, наши предположения верны. Последующая проверка может быть выполнена, используются только первые 80 раундов, а 40 раундов до и после помечаются метками 0 и 1. Проведите такую ​​же тренировку. Поскольку он написан одним и тем же человеком, предсказание усложняется.Если точность не так хороша, как на предыдущем шаге, предположение оказывается верным.

Готов к работе

import os
import numpy as np
import pandas as pd
import re
import sys  
import matplotlib.pyplot as plt

text = pd.read_csv("./datasets/hongloumeng.csv")
import jieba
import jieba.analyse

vorc = [jieba.analyse.extract_tags(i, topK=1000) for i in text["text"]]
vorc = [" ".join(i) for i in vorc]

from  sklearn.feature_extraction.text import CountVectorizer
vertorizer = CountVectorizer(max_features=5000)
train_data_features = vertorizer.fit_transform(vorc)

train_data_features = train_data_features.toarray()

train_data_features.shape

Вышеизложенное является подготовительной работой для генерации векторов слов.

генерация этикеток

labels = np.array([[0] * 80 + [1] * 40]).reshape(-1 ,1) # 目标值
labels.shape

На этом этапе создаются целевые метки.

Стратифицированная случайная выборка

# 分层抽样
from sklearn.model_selection import train_test_split
# train_data_features = train_data_features[0:80]
X_train, X_test, Y_train, Y_test = train_test_split(train_data_features, labels, 
                                                    test_size = 0.2, stratify=labels)

Здесь слишком много объяснений, stratify=labels означает случайную выборку в соответствии с целевой категорией.

Обучение модели и прогнозирование

from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression

gnb = GaussianNB()
gnb.fit(X_train, Y_train)

y_pred = gnb.predict(X_test)

Выполните расчет точности полученного прогнозируемого значения:

from sklearn.metrics import accuracy_score
accuracy_score(Y_test, y_pred)
# 0.875

Иерархическая перекрестная проверка

from sklearn.model_selection import StratifiedShuffleSplit
sss = StratifiedShuffleSplit(n_splits=10,test_size=0.2)
for train_index, test_index in sss.split(train_data_features, labels):
    X_train, X_test = train_data_features[train_index], train_data_features[test_index]
    Y_train, Y_test = labels[train_index], labels[test_index]
    gnb = GaussianNB()
    gnb.fit(X_train, Y_train)
    Y_pred = gnb.predict(X_test)
    scores.append(accuracy_score(Y_test, Y_pred))
print(scores)
print(np.array(scores).mean())

Результат выглядит следующим образом:

[0.9166666666666666, 0.8333333333333334, 1.0, 0.875, 0.75, 0.8333333333333334, 0.8333333333333334, 0.9583333333333334, 0.875, 0.8333333333333334]
0.8708333333333333

Как и выше, мы можем объяснить гипотезу в начале статьи и предварительно судить о том, что наша гипотеза верна.

Перекрестная проверка

labels_val = np.array([[0] * 40 + [1] * 40]).reshape(-1 ,1) # 目标值
sss_val = StratifiedShuffleSplit(n_splits=5,test_size=0.2)#分成5组,测试比例为0.25,训练比例是0.75
scores = []
train_data_features_val = train_data_features[0:80]
for train_index, test_index in sss_val.split(train_data_features_val, labels_val):
    X_train, X_test = train_data_features_val[train_index], train_data_features_val[test_index]
    Y_train, Y_test = labels_val[train_index], labels_val[test_index]
    gnb = GaussianNB()
    gnb.fit(X_train, Y_train)
    Y_pred = gnb.predict(X_test)
    scores.append(accuracy_score(Y_test, Y_pred))
print(scores)
print(np.array(scores).mean())

Результат выглядит следующим образом:

[0.8125, 0.875, 0.75, 0.875, 0.75]
0.8125

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

Полный код: гитхаб