目录
概率基础
•概率定义为一件事情发生的可能性
•扔出一个硬币,结果头像朝上
•某天是晴天
联合概率
包含多个条件,且所有条件同时成立的概率
记作P(A,B),P(A,B)=P(A)P(B)
条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率
记作:P(A|B)
特性:P(A1,A2|B) = P(A1|B)P(A2|B)
注意:此条件概率的成立,是由于A1,A2相互独立的结果
朴素贝叶斯-贝叶斯公式
例子
拉普拉斯平滑
问题:从上面的例子我们得到娱乐概率为0,这是不合理的,如果词频列表里面
有很多出现次数都为0,很可能计算结果都为零。
解决方法:拉普拉斯平滑系数
𝑃𝐹1𝐶=𝑁𝑖+𝛼𝑁+𝛼𝑚P(F1│C)=(Ni+α)/(N+αm)
𝛼为指定的系数α为指定的系数一般为1,m为训练文档中统计出的特征词个数
sklearn朴素贝叶斯实现API
MultinomialNB
朴素贝叶斯算法案例
def naviebayes():
"""
朴素贝叶斯进行文本分类
:return: None
"""
news = fetch_20newsgroups(subset='all')#获取数据
# 进行数据分割 参数(一篇文章 文章所属类别 测试集大小)
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 对数据集进行特征抽取
tf = TfidfVectorizer()
# 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
x_train = tf.fit_transform(x_train)
print(tf.get_feature_names())
x_test = tf.transform(x_test)
# 进行朴素贝叶斯算法的预测
mlt = MultinomialNB(alpha=1.0)
print(x_train.toarray())
mlt.fit(x_train, y_train)
y_predict = mlt.predict(x_test)
print("预测的文章类别为:", y_predict)
# 得出准确率
print("准确率为:", mlt.score(x_test, y_test))
# print("每个类别的精确率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names))
return None
朴素贝叶斯分类优缺点
•优点:
•缺点:
模型的原因导致预测效果不佳。假设了文章中一些词语与另外一些是独立没关系,在训练集中去进行统计词这些工作,会对结果造成干扰。
模型的选择与调优
混淆矩阵
•在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)。
精确率(Precision)与召回率(Recall)
分类模型评估API
•sklearn.metrics.classification_report
•sklearn.metrics.classification_report(y_true, y_pred, target_names=None)
•y_true:真实目标值
•y_pred:估计器预测目标值
•target_names:目标类别名称
•return:每个类别精确率与召回率
print("每个类别的精确率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names))
交叉验证
为了让被评估的模型更加准确可信
交叉验证:将拿到的数据,分为训练和验证集。以下图为例:将数据分
成5份,其中一份作为验证集。然后经过5次(组)的测试,每次都更换不同
的验证集。即得到5组模型的结果,取平均值作为最终结果。又称5折交叉
验证。
超参数搜索-网格搜索
通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),
这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组
合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建
立模型。
K值 | K=3 | K=5 | K=7 |
模型 | 模型1 | 模型2 | 模型3 |
超参数搜索-网格搜索API
•sklearn.model_selection.GridSearchCV
GridSearchCV
K-近邻网格搜索案例
即可以将下列代码注释掉
# knn.fit(x_train, y_train)
#
# # 得出预测结果
# y_predict = knn.predict(x_test)#参数测试集的特征值
#
# print("预测的目标签到位置为:", y_predict)
#
# # 得出准确率
# print("预测的准确率:", knn.score(x_test, y_test))
导入网格模型搜索
from sklearn.model_selection import GridSearchCV
# 构造一些参数的值进行搜索
param = {"n_neighbors": [3, 5, 10]}
# 进行网格搜索 param_grid构造一些参数的值,进行搜索 cv:交叉验证次数
gc = GridSearchCV(knn, param_grid=param, cv=2)
gc.fit(x_train, y_train)#训练数据集
# 预测准确率
print("在测试集上准确率:", gc.score(x_test, y_test))
print("在交叉验证当中最好的结果:", gc.best_score_)
print("选择最好的模型是:", gc.best_estimator_)
print("每个超参数每次交叉验证的结果:", gc.cv_results_)
return None