基本含义:
朴素贝叶斯分类是一种基于贝叶斯定理的分类算法,贝叶斯定理是朴素贝叶斯算法的基础,用于计算在已知某些证据的情况下某一事件发生的概率。
公式参数:
贝叶斯定理的数学表达式如下:
朴素贝叶斯的关键假设是 特征之间相互独立。这意味着在给定类别标签的情况下,每个特征的出现与其他特征的出现是独立的。这一假设简化了计算,但在现实世界中很少完全成立。
即使特征之间并不独立,朴素贝叶斯仍然能提供很好的分类结果。
注意点:先验概率的解释
计算步骤:
1.数据准备
首先,需要有一组己标记的训练样本,每个样本都有一组特征和对应的类别
标签。这些样本将被用来构建分类模型。
2.计算先验概率
根据训练样本中每个类别出现的频率,计算每个类别的先验概率。先验
概率表示在没有其他信息的情况下,某个样本属于某个类别的概率。
3.计算条件概率
对于每个特征,计算在每个类别下的条件概率。条件概率表示在给定某
个类别的情况下,某个特征出现的概率。
4.计算后验概率
对于一个待分类的样本,根据已计算的先验概率和条件概率,计算它属
于每个类别的后验概率。后验概率表示在给定样本的情况下,某个类别的概率。
5.选择最大后验概率
根据计算得到的后验概率,选择具有最大后验概率的类别作为待分
类样本的类别。
6.输出结果
将待分类样本归为具有最大后验概率的类别,作为最终的分类结果。
朴素贝叶斯分类算法的核心假设是特征之间相互独立,即每个特征对于分类结果的贡献
是相互独立的
。这个假设使得计算条件概率变得简单,可以通过对每个特征的概率进行独立
估计来得到整体的条件概率。
朴素贝叶斯分类算法的优点包括简单易用、计算效率高、对于小样本数据也能表现良好
等。
代码实现:
示例
现在我以"电信银行卡诈骗的数据分析"为例,通过使用“精确率”,“准确率”,“召回率”和“F1分数”来评估。
①训练模型
模型保存为:naive_bayes_model.joblib
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import joblib # 用于保存和加载模型
# 1. 读取数据
file_path = '电信银行卡诈骗的数据分析.csv'
data = pd.read_csv(file_path)
# 2. 特征和目标变量
X = data.drop(columns=['Fraud']) # 假设 'Fraud' 是目标列
y = data['Fraud']
# 3. 划分训练集、验证集和测试集 (60% train, 20% val, 20% test)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
# 4. 训练朴素贝叶斯模型
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)
# 保存训练好的模型
model_filename = 'naive_bayes_model.joblib'
joblib.dump(nb_model, model_filename)
print(f"Model saved to {model_filename}")
# 5. 评估模型
def calculate_metrics(y_true, y_pred):
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
specificity = tn / (tn + fp)
return accuracy, precision, recall, f1, specificity
# 在训练集、验证集和测试集上进行预测
y_train_pred = nb_model.predict(X_train)
y_val_pred = nb_model.predict(X_val)
y_test_pred = nb_model.predict(X_test)
# 计算每个数据集的评估指标
train_metrics = calculate_metrics(y_train, y_train_pred)
val_metrics = calculate_metrics(y_val, y_val_pred)
test_metrics = calculate_metrics(y_test, y_test_pred)
# 6. 创建 DataFrame 来展示评估结果
metrics_df = pd.DataFrame({
'Dataset': ['训练集', '验证集', '测试集'],
'Accuracy': [train_metrics[0], val_metrics[0], test_metrics[0]],
'Precision': [train_metrics[1], val_metrics[1], test_metrics[1]],
'Recall': [train_metrics[2], val_metrics[2], test_metrics[2]],
'F1 Score': [train_metrics[3], val_metrics[3], test_metrics[3]],
'Specificity': [train_metrics[4], val_metrics[4], test_metrics[4]]
})
# 打印结果
print(metrics_df)
②测试
import numpy as np
import joblib # 用于加载模型
# 加载保存的模型
model_filename = 'naive_bayes_model.joblib'
loaded_model = joblib.load(model_filename)
print("Model loaded successfully.")
# 假设新数据的格式和训练数据一致
# 新数据的特征顺序为: Distance1, Distance2, Ratio, Repeat, Card, Pin, Online
new_data = np.array([[57.877857, 0.31114, 1.94594, 1, 1, 1, 0], # 样本 1
[44.199036, 0.566463, 2.222763, 1, 1, 1, 0]]) # 样本 2
# 使用加载的模型进行预测
new_predictions = loaded_model.predict(new_data)
# 打印预测结果
print("Predicted classes for new data:", new_predictions)
Predicted classes for new data: [0 0]
:表示模型对你提供的两条新数据样本都预测为0
- 第一个样本的预测结果是
0
- 第二个样本的预测结果也是
0
- 第一个样本的预测结果是
在这个二分类问题中,如果 0
代表“非欺诈”(正常行为),1
代表“欺诈”(异常行为),那么模型认为这两条新数据都属于“非欺诈”。
因此,这两个预测结果表示模型认为这两个新样本都是“非欺诈”的交易。
资源获取:
上述使用的表格如下:
通过网盘分享的文件:电信银行卡诈骗的数据分析.zip
链接: https://pan.baidu.com/s/1w6OrRLrpUeb7SL1XYEgR3g?pwd=capu 提取码: capu
--来自百度网盘超级会员v5的分享
好啦,希望能够帮助到大家!