机器学习篇-day07-朴素贝叶斯和特征降维

news/2024/10/20 12:35:05/

一. 朴素贝叶斯算法

朴素贝叶斯算法介绍

利用概率值进行分类的一种机器学习算法

复习概率

相互独立:如果P(AB)= P(A)P(B),则称事件A与事件B相互独立

比如:女神喜欢程序员的概率,女神喜欢产品经理的概率,两个事件没有关系

简言之

  1. 条件概率:在去掉部分样本的情况下,计算某些样本的出现的概率,表示为:P(B|A)

  2. 联合概率:多个事件同时发生的概率是多少,表示为:P(AB) = P(B)*P(A|B)

贝叶斯公式

公式

举例解释

朴素贝叶斯

朴素贝叶斯在贝叶斯基础上增加:特征条件独立

假设,即:特征之间是互为独立的。此时,联合概率的计算即可简化为:

  1. P(程序员,超重|喜欢) = P(程序员|喜欢) * P(超重|喜欢)

  2. P(程序员,超重) = P(程序员) * P(超重)

条件不独立: P(AB) = P(A) * P(B|A) = P(B) * P(A|B)

条件独立: P(AB) = P(A) * P(B)

拉普拉斯平滑系数

为了避免概率值为 0,我们在分子和分母分别加上一个数值,这就是拉普拉斯平滑系数的作用

总结

案例-商品情感分类

API

流程

代码

import jieba  # 用来做分词
from sklearn.naive_bayes import MultinomialNB  # 贝叶斯模型
from sklearn.feature_extraction.text import CountVectorizer  # 词频统计
​
import numpy as np
import pandas as pd
​
​
def demo01_naive_bayes():# 数据获取data = pd.read_csv('data/书籍评价.csv', encoding='gbk')# data.info()
​# 数据基本处理# 处理标签      好评 1  差评 0data['评价'] = np.where(data['评价'] == '好评', 1, 0)y = data['评价']# print(data.head())# 停用词表stop_words = []with open('data/stopwords.txt', 'r', encoding='utf-8') as f:lines = f.readlines()stop_words = [line.strip() for line in lines]stop_words = list(set(stop_words))  # 去重# print(stop_words)# 评论文本分词comment_list = [','.join(jieba.lcut(line)) for line in data['内容']]# print(comment_list)# 统计词频, 作为特征transformer = CountVectorizer(stop_words=stop_words)x_train = transformer.fit_transform(comment_list)"""fit_transform(comment_list) 方法首先会对输入的 comment_list 进行拟合,学习其中的词汇表。然后将每条评论转换为一个词频向量,形成一个稀疏矩阵 x_train。稀疏矩阵是一种高效的存储方式,适用于大部分元素为零的情况。矩阵中的每一行代表一条评论,每一列代表词汇表中的一个单词,矩阵中的值表示该单词在这条评论中出现的次数"""# print(x_train)my_names = transformer.get_feature_names_out()# print(my_names)
​x = x_train.toarray()# 3-5 准备训练集测试集x_train = x[:10, :]         # 准备训练集y_train = y.values[0:10]x_test = x[10:, :]          # 准备测试集y_test = y.values[10:]print('x_train.shape-->',data.内容[10:])print('y_train.shape-->',y_test)
​# 4.模型训练# 4-1 实例化贝叶斯 # 添加拉普拉修正平滑参数mymultinomialnb = MultinomialNB()mymultinomialnb.fit(x_train, y_train)# 5.模型预测y_pred = mymultinomialnb.predict(x_test)print('预测值-->', y_pred)print('真实值-->', y_test)# 6.模型评估myscore = mymultinomialnb.score(x_test, y_test)print('myscore-->', myscore)
​
​
if __name__ == '__main__':demo01_naive_bayes()
​

二. 特征降维

特征降维

为什么要进行特征降维

特征对训练模型时非常重要的;用于训练的数据集包含一些不重要的特征,可能导致模型泛化性能不佳

  1. 某些特征的取值较为接近,其包含的信息较少

  2. 希望特征独立存在对预测产生影响,两个特征同增同减非常相关,不会给模型带来更多的信息

  3. 解决模型过拟合

目的

指在某些限定条件下,降低特征个数

特征降维涉及的知识面比较多,当前阶段常用的方法:

​ (1)低方差过滤法

​ (2)PCA(主成分分析)降维法

​ (3)相关系数(皮尔逊相关系数、斯皮尔曼相关系数)

低方差过滤法

低方差过滤法

指的是删除方差低于某些阈值的一些特征

  1. 特征方差小:特征值的波动范围小,包含的信息少,模型很难学习到信息

  2. 特征方差大:特征值的波动范围大,包含的信息相对丰富,便于模型进行学习

API

代码

# 1.导入依赖包
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
​
# 2. 读取数据集
data = pd.read_csv('data/垃圾邮件分类数据.csv')
print(data.shape) # (971, 25734)
​
​
# 3. 使用方差过滤法
transformer = VarianceThreshold(threshold=0.1)
data = transformer.fit_transform(data)
print(data.shape) # (971, 1044)
​

主成分分析法(PCA)

主成分分析

PCA 通过对数据维数进行压缩,尽可能降低原数据的维数(复杂度)损失少量信息,在此过程中可能会舍弃原有数据、创造新的变量。

API

代码

# 1.导入依赖包
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
​
# 2. 加载数据集
x, y = load_iris(return_X_y=True)
print(x[:5])
​
​
# 3. PCA,保留指定比例的信息
transformer = PCA(n_components=0.95)
x_pca = transformer.fit_transform(x)
print(x_pca[:5])
​
​
# 4. PCA,保留指定数量特征
transformer = PCA(n_components=2)
x_pca = transformer.fit_transform(x)
print(x_pca[:5])
​
​

相关系数法

相关系数:反映特征列之间(变量之间)密切相关程度的统计指标

常见2个相关系数:皮尔逊相关系数、斯皮尔曼相关系数

去掉高度相关的特征(相关系数)

相关系数

皮尔逊相关系数
斯皮尔曼相关系数

代码

先看显著性(不相关概率 => 相关系数的可信度, 低于显著性的阈值表示可信的.), 再看相关系数,

# 1.导入依赖包
import pandas as pd
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
from scipy.stats import spearmanr
from sklearn.datasets import load_iris
​
# 2.读取数据集(鸢尾花数据集)
data = load_iris()
data = pd.DataFrame(data.data, columns=data.feature_names)
​
# 3. 皮尔逊相关系数
corr = pearsonr(data['sepal length (cm)'], data['sepal width (cm)'])
print(corr, '皮尔逊相关系数:', corr[0], '不相关性概率:', corr[1])
# (-0.11756978413300204, 0.15189826071144918) 皮尔逊相关系数: -0.11756978413300204 不相关性概率: 0.15189826071144918
​
# 4. 斯皮尔曼相关系数
corr = spearmanr(data['sepal length (cm)'], data['sepal width (cm)'])
print(corr, '斯皮尔曼相关系数:', corr[0], '不相关性概率:', corr[1])
# SpearmanrResult(correlation=-0.166777658283235, pvalue=0.04136799424884587) 斯皮尔曼相关系数: -0.166777658283235 不相关性概率: 0.04136799424884587
​

总结


http://www.ppmy.cn/news/1539185.html

相关文章

Notepad++ 初学者指南

引言 对于初学者来说,选择合适的编程工具很重要,特别是考虑到易用性和计算机资源的需求。 虽然集成开发环境(IDE)如 Eclipse、IntelliJ IDEA 和 Visual Studio 提供了许多强大的功能,但对于刚开始学习编程的人来说&a…

大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

vue-router拦截器

在 Vue 项目中,vue-router 的路由拦截器和组件内部的路由拦截器(如 beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave)虽然都能拦截路由,但它们的作用范围和使用场景有所不同。下面是二者的区别总结: 1. 全局路…

电子电气架构 --- 智能网联汽车未来是什么样子?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

JAVA毕业设计191—基于Java+Springboot+vue的电子产品商城管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的电子产品商城管理系统(源代码数据库)191 一、系统介绍 本项目前后端不分离,分为用户、管理员两种角色 1、用户: 注册、登录、商品…

后端开发必知:BeanUtils 如何在 DTO 与 VO 间巧妙复制数据

作为一名后端开发者,我们深知数据安全的重要性,尤其是像手机号、身份证号等关键数据。 为了防止关键数据泄露,JAVA领域,基本都采用了 VO(Value Object)和 DTO(Data Transfer Object&#xff09…

数据分布过于集中 怎么办,python 人工智能 ,数据分析,机器学习pytorch tensorflow ,

数据分布过于集中,意味着数据的大部分值都聚集在某个特定区间内,这可能会导致统计分析的结果不够稳健,或者模型训练时出现过拟合等问题。针对这种情况,可以考虑以下几种方法来处理: 变换成 1. **数据转换**&#xff1…

Leetcode 2466. 统计构造好字符串的方案数 入门dp(取模) C++实现

问题:Leetcode 2466. 统计构造好字符串的方案数 给你整数 zero ,one ,low 和 high ,我们从空字符串开始构造一个字符串,每一步执行下面操作中的一种: 将 0 在字符串末尾添加 zero 次。将 1 在字符串末尾添…