一. 朴素贝叶斯算法
朴素贝叶斯算法介绍
利用概率值进行分类的一种机器学习算法
复习概率
相互独立:如果P(AB)= P(A)P(B),则称事件A与事件B相互独立
比如:女神喜欢程序员的概率,女神喜欢产品经理的概率,两个事件没有关系
简言之
-
条件概率:在去掉部分样本的情况下,计算某些样本的出现的概率,表示为:P(B|A)
-
联合概率:多个事件同时发生的概率是多少,表示为:P(AB) = P(B)*P(A|B)
贝叶斯公式
公式
举例解释
朴素贝叶斯
朴素贝叶斯在贝叶斯基础上增加:特征条件独立
假设,即:特征之间是互为独立的。此时,联合概率的计算即可简化为:
-
P(程序员,超重|喜欢) = P(程序员|喜欢) * P(超重|喜欢)
-
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 差评 0 data['评价'] = 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)PCA(主成分分析)降维法
(3)相关系数(皮尔逊相关系数、斯皮尔曼相关系数)
低方差过滤法
低方差过滤法
指的是删除方差低于某些阈值的一些特征
-
特征方差小:特征值的波动范围小,包含的信息少,模型很难学习到信息
-
特征方差大:特征值的波动范围大,包含的信息相对丰富,便于模型进行学习
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