В предыдущей статье использовался алгоритм кластеризации, чтобы судить об авторе «Сон о красных особняках» без предположений.В этой статье предполагается использовать байесовскую классификацию метода обучения с учителем.Предполагается, что последние 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
После многих вычислений и усреднения средние баллы, полученные последними, ниже, чем у первых, и предположение в начале статьи верно.