0、前言:
机器学习中的贝叶斯的理论基础是数学当中的贝叶斯公式。 这篇博客强调使用方法,至于理论未作深究。 机器学习中三种类型的贝叶斯公式:高斯分布(多分类)、多项式分布(文本分类)、伯努利分布(二分类任务) 贝叶斯算法优点:对小规模数据表现好,能处理多分类任务,常用于文本分类 。缺点:只能用于分类问题。
1、高斯分布的贝叶斯算法:
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 = np. linspace( data2[ : , 0 ] . min ( ) , data2[ : , 0 ] . max ( ) , 1000 )
Y = np. linspace( data2[ : , 1 ] . min ( ) , data2[ : , 1 ] . max ( ) , 1000 )
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 ) )
plt. scatter( data2[ : , 0 ] , data2[ : , 1 ] , c= target, cmap= 'rainbow' )
在这个应用中,用多项式分布的贝叶斯分类效果没有高斯分布好,而伯努利分布的贝叶斯只能用于二分类任务。
2、三种贝叶斯算法的文本分类应用效果:
import numpy as np
import pandas as pd
import matplotlib. pyplot as plt
from sklearn. naive_bayes import GaussianNB, MultinomialNB, BernoulliNB
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
'''
1、TfidfVectorizer将文本数据转换为特征向量形式,每个词表示一个特征维度,每个维度的值是这个词在文本中的权重(出现的次数)
2、这个库是文本数据用于机器学习模型的关键步骤
3、导入后使用方法和机器学习算法非常类似,要先创建对象,然后fit()
'''
tf = TfidfVectorizer( )
tf. fit( a_data)
X = tf. transform( a_data) . toarray( )
GS = GaussianNB( )
GS. fit( X, target)
GS. score( X, target)
MT = MultinomialNB( )
MT. fit( X, target)
MT. score( X, target)
BE = BernoulliNB( )
BE. fit( X, target)
BE. score( X, target)
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)
MT. predict( m)
BE. predict( m)
总结: 1、在进行文本分类时调用贝叶斯算法的方式还是中规中矩,其中一个难点是读数据时要先知道数据的格式,然后才能通过pandas来读取 2、非常重要的一个工具就是sklearn库提供的分词工具from sklearn.feature_extraction.text import TfidfVectorizer,它可以把一个一维的文本数据(每个元素是一个句子文本的列表或者其他一维数据)通过fit方法将其特征词提取出来,进行分词,之后通过transform方法再次输入数据就可以把数据变成稀疏矩阵,然后再次通过toarray方法将数据变成真真的numpy二维数组。 3、从文本分类结果看,多项式分布更适合做文本分类,但是对于二分类文本分类任务伯努利效果更佳。