Sklearn 朴素贝叶斯sklearn.naive_bayes提供高斯、多项式、伯努利、补集、分类朴素贝叶斯分类器。 高斯朴素贝叶斯GaussianNB⭐适用于连续特征假设每个类别的每个特征服从高斯分布。fromsklearn.naive_bayesimportGaussianNB modelGaussianNB(priorsNone,# 先验概率None从数据中学习var_smoothing1e-9# 方差平滑防止零方差)model.fit(X,y)# 关键属性print(model.class_count_)# 每类的样本数print(model.class_prior_)# 每类的先验概率print(model.classes_)# 类别标签print(model.epsilon_)# 方差平滑值print(model.n_features_in_)# 特征数print(model.feature_names_in_)# 特征名DataFrame 输入时print(model.theta_)# 每类每个特征的均值 (n_classes, n_features)print(model.var_)# 每类每个特征的方差 (n_classes, n_features)print(model.sigma_)# 每类每个特征的方差已平滑# 预测y_predmodel.predict(X)y_probmodel.predict_proba(X)# 各类别概率y_log_probmodel.predict_log_proba(X)# 更新模型部分拟合model.partial_fit(X_batch,y_batch,classesnp.unique(y)) 多项式朴素贝叶斯MultinomialNB⭐适用于离散特征如文本的词频/TF-IDF经典应用是文档分类。fromsklearn.naive_bayesimportMultinomialNB modelMultinomialNB(alpha1.0,# 拉普拉斯/利德斯通平滑参数# alpha0 → 不平滑# alpha1 → 拉普拉斯平滑# alpha1 → 利德斯通平滑force_alphaTrue,# 1.2: 强制 alpha 参数为真fit_priorTrue,# 是否学习先验概率class_priorNone# 固定先验概率)model.fit(X,y)# 关键属性print(model.class_count_)# 每类样本数print(model.class_log_prior_)# 每类的对数先验概率print(model.classes_)# 类别print(model.feature_count_)# 每类每个特征的计数 (n_classes, n_features)print(model.feature_log_prob_)# 经验对数概率 P(x_i|y)print(model.n_features_in_)# 特征数print(model.n_iter_)# 达到精度所需的迭代次数在线学习# 预测y_predmodel.predict(X)y_probmodel.predict_proba(X)y_log_probmodel.predict_log_proba(X)# 部分拟合在线学习model.partial_fit(X_batch,y_batch,classesnp.unique(y))文本分类示例:fromsklearn.feature_extraction.textimportCountVectorizer,TfidfTransformerfromsklearn.pipelineimportPipeline pipelinePipeline([(vect,CountVectorizer()),(tfidf,TfidfTransformer()),(clf,MultinomialNB())])pipeline.fit(texts,labels)predictedpipeline.predict(new_texts) 伯努利朴素贝叶斯BernoulliNB适用于二值/布尔特征每个特征只有 0/1 两种取值。fromsklearn.naive_bayesimportBernoulliNB modelBernoulliNB(alpha1.0,# 平滑参数force_alphaTrue,binarize0.0,# 二值化阈值小于等于0大于1# None假设数据已二值化fit_priorTrue,class_priorNone)model.fit(X,y)# 关键属性print(model.class_count_)print(model.class_log_prior_)print(model.feature_count_)# 每类每个特征计数print(model.feature_log_prob_)# log P(x_i|y)含负值不出现时的概率补项# 预测y_predmodel.predict(X)y_probmodel.predict_proba(X) 补集朴素贝叶斯ComplementNB多项式 NB 的改进版对不平衡数据集效果更好。fromsklearn.naive_bayesimportComplementNB modelComplementNB(alpha1.0,force_alphaTrue,fit_priorTrue,class_priorNone,normFalse# 是否对权重做 L2 归一化)model.fit(X,y)# 关键属性与 MultinomialNB 类似但权重计算方式不同print(model.class_count_)print(model.class_log_prior_)print(model.feature_count_)print(model.feature_log_prob_)# 补集特征权重print(model.feature_all_)# 全部特征计数# 预测y_predmodel.predict(X)y_probmodel.predict_proba(X)️ 分类朴素贝叶斯CategoricalNB适用于分类非数值特征每个特征有有限个离散取值类别。fromsklearn.naive_bayesimportCategoricalNB modelCategoricalNB(alpha1.0,force_alphaTrue,fit_priorTrue,class_priorNone,min_categoriesNone# 每个特征的最小类别数# 或 array-like: 指定每个特征的最小类别数)model.fit(X,y)# 关键属性print(model.class_count_)print(model.class_log_prior_)print(model.category_count_)# 每类每个特征每类别的计数# 形状: (n_classes, n_features, max_category_per_feature)print(model.feature_log_prob_)# 对数概率print(model.n_categories_)# 每个特征的类别数# 预测y_predmodel.predict(X)y_probmodel.predict_proba(X)使用示例:importnumpyasnpfromsklearn.naive_bayesimportCategoricalNB# 每个特征取值为 0 到 max_val 的整数rngnp.random.RandomState(42)Xrng.randint(5,size(100,3))# 3 个特征每个取值 0~4yrng.randint(2,size100)# 二分类modelCategoricalNB(min_categories[5,5,5])model.fit(X,y) 模型对比模型特征类型典型应用概率公式GaussianNB连续值通用分类、鸢尾花高斯似然MultinomialNB计数/频率文本分类、文档多项式似然BernoulliNB二值 (0/1)短文本、出现/不出现伯努利似然ComplementNB计数/频率不平衡文本分类补集权重CategoricalNB离散类别调查数据、评级类别概率 实践指导文本分类完整流程fromsklearn.naive_bayesimportMultinomialNB,ComplementNBfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportclassification_report# 1. 文本向量化vectorizerTfidfVectorizer(max_features5000,stop_wordsenglish,ngram_range(1,2))Xvectorizer.fit_transform(texts)# 2. 分割X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 3. 训练比较两种 NBforname,modelin[(MultinomialNB,MultinomialNB(alpha0.1)),(ComplementNB,ComplementNB(alpha0.1))]:model.fit(X_train,y_train)y_predmodel.predict(X_test)accmodel.score(X_test,y_test)print(f{name}: accuracy {acc:.3f})print(classification_report(y_test,y_pred))增量学习大数据/流式数据fromsklearn.naive_bayesimportGaussianNB modelGaussianNB()classesnp.unique(y)# 需要提前知道所有类别# 分批训练batch_size100foriinrange(0,len(X),batch_size):X_batchX[i:ibatch_size]y_batchy[i:ibatch_size]# 第一批用 fit后续用 partial_fitifi0:model.fit(X_batch,y_batch)else:model.partial_fit(X_batch,y_batch,classesclasses)print(fProcessed{ilen(X_batch)}/{len(X)}samples)特征概率检查importpandasaspd# 查看每类最显著的特征feature_probspd.DataFrame(model.feature_log_prob_,columnsfeature_names# 或 range(n_features))# 对于 BernoulliNB/MultinomialNB# 找出每类最决定性的特征fori,class_nameinenumerate(model.classes_):top_featuresnp.argsort(model.feature_log_prob_[i])[::-1][:10]print(f\nClass{class_name}:)forfeat_idxintop_features:probnp.exp(model.feature_log_prob_[i][feat_idx])print(f P({feat_idx}|class) {prob:.4f}) 优点与局限优点局限极快的训练和预测条件独立假设实践中常不成立少量训练数据也有效概率估计通常不校准天然处理高维数据GaussianNB 对分布假设敏感对无关特征鲁棒特征尺度需合理处理支持增量学习partial_fit无法学习特征交互[[sklearn-总览|← 返回总览]]