贝叶斯分类技术是一种基于贝叶斯定理的简单但强大的预测建模算法,适用于监督学习算法。这种技术的基本原理易于理解,并且在处理大量数据点时具有高准确性和速度。贝叶斯分类技术主要分为三种模型:高斯贝叶斯、多项式贝叶斯和伯努利贝叶斯。
高斯贝叶斯是一种支持连续值的贝叶斯分类变体,它假设每个类别都是正态分布的。例如,在决定是否批准贷款申请时,可能会考虑申请人的收入、年龄、之前的贷款记录、位置和交易历史等因素。虽然在现实生活中数据点之间不太可能完全独立,但高斯贝叶斯在这种情况下的表现却出奇地好,这种假设被称为类条件独立。
多项式贝叶斯是另一种基于事件的模型,它将特征表示为向量,其中样本(特征)表示特定事件的发生频率。
伯努利贝叶斯也是一种基于事件的模型,其中特征是独立的布尔值,以二进制形式存在。
高斯贝叶斯基于贝叶斯定理,并且有一个强烈的假设,即预测变量应该彼此独立。例如,如果考虑两个骰子的事件,事件A是第一个骰子掷出1,事件B是第二个骰子掷出1,这两个事件是相互独立的。因此,如果计算两个事件同时发生的概率,可以使用条件概率和乘法规则来计算。
import numpy as np
import pandas as pd
from sklearn.model_selection import cross_val_score, train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.naive_bayes import GaussianNB
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("whitegrid")
import warnings
warnings.filterwarnings("ignore")
import scipy.stats as stats
%matplotlib inline
# 加载数据集
data = pd.read_csv('diabetes.csv')
X = data.drop(columns=['Outcome'], axis=1)
Y = data['Outcome']
# 数据预处理
from sklearn.impute import SimpleImputer
rep_0 = SimpleImputer(missing_values=0, strategy="mean")
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
X_train = pd.DataFrame(rep_0.fit_transform(X_train), columns=X_train.columns)
X_test = pd.DataFrame(rep_0.fit_transform(X_test), columns=X_test.columns)
# 训练模型并预测
model = GaussianNB()
model.fit(X_train, y_train)
predict_train = model.predict(X_train)
accuracy_train = accuracy_score(y_train, predict_train)
print('训练集上的准确率:', accuracy_train)
predict_test = model.predict(X_test)
accuracy_test = accuracy_score(y_test, predict_test)
print('测试集上的准确率:', accuracy_test)
# 超参数调优以提高准确率
params_NB = {'var_smoothing': np.logspace(0, -9, num=100)}
gs_NB = GridSearchCV(estimator=model, param_grid=params_NB, cv=5, verbose=1, scoring='accuracy')
gs_NB.fit(X_test, y_test)
results_NB = pd.DataFrame(gs_NB.cv_results_['params'])
results_NB['test_score'] = gs_NB.cv_results_['mean_test_score']
predict_test = gs_NB.predict(X_test)
accuracy_test = accuracy_score(y_test, predict_test)
print('测试集上的准确率:', accuracy_test)