机器学习基础DAY6

第六章 朴素贝叶斯算法

######朴素贝叶斯API:sklearn.naive_bayes.MultinomialNB
####sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
朴素贝叶斯分类
alpha:拉普拉斯平滑系数
优点:
不需要调参
朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
对缺失数据不太敏感,算法也比较简单,常用于文本分类。
分类准确度高,速度快
缺点:
需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

分类模型的评估:

一般最常见使用的是准确率,即预测结果正确的百分比
####estimator.score()
在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
在这里插入图片描述
其他分类标准,F1-score,反映了模型的稳健性
在这里插入图片描述
######分类模型评估API:sklearn.metrics.classification_report
####sklearn.metrics.classification_report(y_true, y_pred, target_names=None)
y_true:真实目标值

y_pred:估计器预测目标值

target_names:目标类别名称

return:每个类别精确率与召回率

模型选择与调优

1、交叉验证:为了让被评估的模型更加准确可信
比如4折交叉验证:
在这里插入图片描述
2.网格搜索:调参数
通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。
######API:sklearn.model_selection.GridSearchCV
####sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
对估计器的指定参数值进行详尽搜索
estimator:估计器对象
param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
cv:指定几折交叉验证
fit:输入训练数据
score:准确率
结果分析:
best_score_:在交叉验证中测试的最好结果
best_estimator_:最好的参数模型
cv_results_:每次交叉验证后的测试集准确率结果和训练集准确率结果
作业:将前面的k-近邻算法案例改成网格搜索

def knncls():
    """
    作业:K-近邻预测鸢尾花类别,使用网格搜索
    :return:None
    """
    # 读取数据
    li = load_iris()

    x_train, x_test, y_train, y_test = train_test_split(li.data, li.target, test_size=0.25)

    # 特征工程(标准化)
    std = StandardScaler()

    # 对测试集和训练集的特征值进行标准化
    x_train = std.fit_transform(x_train)

    x_test = std.transform(x_test)

    # 进行算法流程 # 超参数
    knn = KNeighborsClassifier()

     # 构造一些参数的值进行搜索
    param = {"n_neighbors": [3, 5, 10]}

    # 进行网格搜索
    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
if __name__ == "__main__":
    knncls()

结果:

在测试集上准确率: 0.8947368421052632
在交叉验证当中最好的结果: 0.9821428571428571
选择最好的模型是: KNeighborsClassifier(n_neighbors=3)
每个超参数每次交叉验证的结果: {'mean_fit_time': array([0.0009104 , 0.        , 0.00049841]), 'std_fit_time': array([8.71419907e-05, 0.00000000e+00, 4.98414040e-04]), 'mean_score_time': array([0.00160289, 0.00199497, 0.00199473]), 'std_score_time': array([6.05344772e-04, 1.19209290e-07, 1.19209290e-07]), 'param_n_neighbors': masked_array(data=[3, 5, 10],
             mask=[False, False, False],
       fill_value='?',
            dtype=object), 'params': [{'n_neighbors': 3}, {'n_neighbors': 5}, {'n_neighbors': 10}], 'split0_test_score': array([0.98214286, 0.98214286, 0.96428571]), 'split1_test_score': array([0.98214286, 0.98214286, 0.94642857]), 'mean_test_score': array([0.98214286, 0.98214286, 0.95535714]), 'std_test_score': array([0.        , 0.        , 0.00892857]), 'rank_test_score': array([1, 1, 3])}

进程已结束,退出代码0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值