python
复制代码
# 导入基础库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
# 导入贝叶斯(高斯分布、多项式分布、伯努利分布)
from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB
data,target = load_iris(return_X_y=True)
display(data.shape, target.shape)
data2 = data[:,2:].copy()
# 训练模型
GS_nb = GaussianNB()
GS_nb.fit(data2,target)
# 画分界图
# 先生成x坐标和y坐标
X = np.linspace(data2[:,0].min(),data2[:,0].max(),1000)
Y = np.linspace(data2[:,1].min(),data2[:,1].max(),1000)
# 然后将x坐标和y坐标对应的网格坐标对应出来
nx,ny = np.meshgrid(X,Y)
# 扁平化
nx = nx.ravel()
ny = ny.ravel()
# 组合堆积成新的数据集
disdata = np.c_[nx,ny]
pd.DataFrame(disdata).head(3)
# 预测
disdata_pred = GS_nb.predict(disdata)
# 绘制分界图(这种速度比较慢)
plt.scatter(disdata[:,0],disdata[:,1],c=disdata_pred)
plt.scatter(data2[:,0],data2[:,1],c=target,cmap='rainbow')
# 绘制分界图(这种速度快)
plt.pcolormesh(X,Y,disdata_pred.reshape(1000,-1)) # 将'disdata_pred'的值以伪彩色图(plt.pcolormesh)的形式在二维网格上显示出来。
plt.scatter(data2[:,0],data2[:,1],c=target,cmap='rainbow') # cmap='rainbow'是matplotlib库中plt.scatter函数的一个参数。这个参数用于指定色彩映射(colormap)。在这种情况下,'rainbow'是一种色彩映射,它会从红色开始,逐渐过渡到橙色、黄色、绿色、青色、蓝色和紫色。
python
复制代码
# 老三件
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入三种贝叶斯算法
from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB
# 导入数据(5571条数据,有两列,其中第一列为标签,第二列为短信内容)
data = pd.read_table('./data2/SMSSpamCollection',header=None)
pd.DataFrame(data).head(2)
# 从数据中分词,并且统计每个短信中分词的出现频率,最终呈现一个稀疏矩阵作为贝叶斯算法的输入
a_data = data[1].copy()
target = data[0].copy()
a_data.shape # 一维
from sklearn.feature_extraction.text import TfidfVectorizer # 特征提取库中的Tfid~是用于文本数据的特征提取
'''
1、TfidfVectorizer将文本数据转换为特征向量形式,每个词表示一个特征维度,每个维度的值是这个词在文本中的权重(出现的次数)
2、这个库是文本数据用于机器学习模型的关键步骤
3、导入后使用方法和机器学习算法非常类似,要先创建对象,然后fit()
'''
# 创建特征词向量的对象
tf = TfidfVectorizer()
tf.fit(a_data) # 输入一维的源文本数据即可,这一步会统计分词信息
X = tf.transform(a_data).toarray() # 这一步会根据上面统计的分词信息构建稀疏矩阵
# tf.transform(a_data):
# <5572x8713 sparse(稀疏) matrix of type '<class 'numpy.float64'>'
# with 74169 stored elements in Compressed Sparse Row format>
# .toarray(),就是将结果转换为array数组
# 高斯分布贝叶斯
GS = GaussianNB()
GS.fit(X,target)
GS.score(X,target) # 0.9414931801866475
# 多项式分布贝叶斯
MT = MultinomialNB()
MT.fit(X,target)
MT.score(X,target) # 0.9761306532663316
# 伯努利分布贝叶斯
BE = BernoulliNB()
BE.fit(X,target)
BE.score(X,target) # 0.9881550610193827
# 预测数据处理,要按照之前特征词向量对象模型转换(不能重新设置特征词向量对象后fit,会导致测试数据维度和训练模型的输入数据维度不匹配)
m = [
'hello, nice to meet you',
'Free lunch, please call 09999912313',
'Free lunch, please call 080900031 9am - 11pm as a $1000 or $5000 price'
]
m = tf.transform(m).toarray()
# 测试预测
GS.predict(m) # array(['ham', 'ham', 'ham'], dtype='<U4')
MT.predict(m) # array(['ham', 'ham', 'spam'], dtype='<U4')
BE.predict(m) # array(['ham', 'ham', 'spam'], dtype='<U4')