机器学习--集成学习之随机森林&贝叶斯算法

一、集成学习

1、含义

集成学习就是将多个基学习器进行组合,来实现比单一学习器显著优越的学习性能

2、代表

.bagging方法:典型的是随机森林

.boosting方法:典型的是Xgboost

.stacking方法:堆叠模型

3、应用

1、分类问题集成

2、回归问题集成

3、特征选取集成

4、Bagging之随机森林

随机森林:

1.什么是随机森林?

随机森林(Random Forest)是一种集成学习(Ensemble Learning) 算法,属于机器学习中的监督学习方法。它通过构建多个决策树并将它们的预测结果结合起来,以提高模型的准确性和稳定性。

2.随机森林的特点?

(1)数据采样随机

(2)特征选取随机

(3)森林

(4)基学习器为决策树

3.为什么使用随机森林?

使用随机森林的主要原因可以总结为它在准确性、稳定性和易用性方面的卓越表现

4、随机森林的优点

1.具有极高的准确率。

2.随机性的引入,使得随机森林的抗噪声能力很强。

3.随机性的引入,使得随机森林不容易过拟合。

4.能够处理很高维度的数据,不用做特征选择。

5.容易实现并行化计算。

5、随机森林缺点

1.当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大。

2.随机森林模型还有许多不好解释的地方,有点算个黑盒模型。

5、随机森林相关参数

class sklearn.ensemble.RandomForestClassifier(n_estimators='warn' , criterion='gini' , max_depth=None , min_samples_split=2 , min_samples_leaf=1)

随机森林重要的一些参数:

1)n_estimators :(随机森林独有)

随机森林中决策树的个数。

在0.20版本中默认是10个决策树;

在0.22版本中默认是100个决策树;

2)criterion :(同决策树)

节点分割依据,默认为基尼系数。

可选【entropy:信息增益】

3)max_depth:(同决策树)【重要】

default=(None)设置决策树的最大深度,默认为None。

【(1)数据少或者特征少的时候,可以不用管这个参数,按照默认的不限制生长即可

(2)如果数据比较多特征也比较多的情况下,可以限制这个参数,范围在10~100之间比较好】

4)min_samples_split : (同决策树)【重要】

这个值限制了子树继续划分的条件,如果某节点的样本数少于设定值,则不会再继续分裂。默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则建议增大这个值。

5)min_samples_leaf :(同决策树)【重要】

这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

【叶是决策树的末端节点。 较小的叶子使模型更容易捕捉训练数据中的噪声。 一般来说,我更偏向于将最小叶子节点数目设置为大于50。在你自己的情况中,你应该尽量尝试多种叶子大小种类,以找到最优的那个。】

【比如,设定为50,此时,上一个节点(100个样本)进行分裂,分裂为两个节点,其中一个节点的样本数小于50个,那么这两个节点都会被剪枝】

6、案例

垃圾邮件的识别

通过网盘分享的文件:spambase.csv

链接: https://pan.baidu.com/s/1Kb7X4jsvQH91TGqzM3uDug 提取码: 6ksn

python 复制代码
import pandas as pd
def cm_plot(y, yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt

    cm = confusion_matrix(y, yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',
                         verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt
datas = pd.read_csv("spambase.csv")
# 将变量与结果划分开
x = datas.iloc[:, :-1]
y = datas.iloc[:, -1]
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test =train_test_split(x,y, test_size=0.2, random_state=50)
from sklearn.ensemble import RandomForestClassifier
dtr=RandomForestClassifier(n_estimators=100,max_features=0.8,random_state=0)
dtr.fit(x_train, y_train)

"""
训练集混淆矩阵
"""
# 训练集预测值
train_predicted = dtr.predict(x_train)

from sklearn import metrics

print(metrics.classification_report(y_train, train_predicted,digits=7))
cm_plot(y_train, train_predicted).show()

"""
测试集混淆矩阵
"""
test_predicted = dtr.predict(x_test)
print(metrics.classification_report(y_test, test_predicted,digits=7))
cm_plot(y_test, test_predicted).show()


'''重要特征'''
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus']=False
importances=dtr.feature_importances_#这个属性保存了模型中特征的重要性
im=pd.DataFrame(importances,columns=["importances"])
name=x.columns

# 2. 创建包含特征名和重要性值的DataFrame
a=pd.DataFrame({'name':name,'importances':importances
})

# 3. 按重要性降序排序
feature_importance_sorted = a.sort_values(
    by='importances',
    ascending=False
).reset_index(drop=True)

# 4、取出最大的10个特征
max_10 = feature_importance_sorted.head(10)

# 5、进行可视化处理
fig=plt.figure()
plt.barh(max_10['name'], max_10['importances'],
         color='b',  height=0.7)
a=max_10['importances'].max()
plt.xlim(0,a*1.2)
plt.xlabel('重要属性值')
plt.ylabel('特征名称')
plt.title('name-importances')
plt.show()

二、贝叶斯算法

1、核心

思考方式的转变,"逆概"问题

2、定理

3、贝叶斯算法相关参数

贝叶斯分类器的代码使用: 朴素贝叶斯算法,中文处理

class sklearn.naive_bayes.MultinomialNB (alpha=1.0 , fit_prior=True , class_prior=None )

参数:

1) MultinomialNB:多项式分布的朴素贝叶斯。
2)alpha: 控制模型拟合时的平滑度.

定义:alpha是一个浮点数,表示添加剂(拉普拉斯/Lidstone)平滑参数。它控制了模型估计概率中的平滑程度。

作用:平滑是一种防止过拟合的技术,特别是在处理稀疏数据集或未出现在训练集中的特征时。当alpha设置为0时,表示不进行平滑;alpha设置为1时,称为Laplace平滑;当0<alpha<1时,称为Lidstone平滑。

影响:alpha值的大小会影响模型的复杂度。如果alpha值过大,模型估计出来的概率会减少,可能导致分类器更加稳定但准确率降低;反之,如果alpha值被设置的过低,会导致准确率提升,但可能会引起模型的过拟合问题。

3)fit_prior: 是否去学习类的先验概率。

当fit_prior设置为True时,模型会根据训练数据集计算出每个类的先验概率。如果训练数据集中某个类的样本数量较少,计算出的先验概率可能非常小,这可能导致该类样本在分类时被忽略,从而影响模型的分类效果。

使用建议:在有样本不均衡的情况下,建议谨慎使用fit_prior参数,以避免分类效果变差。

4)class_prior: 各个类别的先验概率,

如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。

4、案例

python 复制代码
import pandas as pd
def cm_plot(y, yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt

    cm = confusion_matrix(y, yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',
                         verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt
datas=pd.read_excel('鸢尾花训练数据.xlsx')
x=datas.iloc[:,:-1]
y=datas.iloc[:,-1]
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)
from sklearn.naive_bayes import MultinomialNB
ml=MultinomialNB(alpha=1.0)
ml.fit(x_train,y_train)
train_predict=ml.predict(x_train)
from sklearn import metrics
print(metrics.classification_report(y_train,train_predict,digits=5))
cm_plot(y_train,train_predict).show()

test_predict=ml.predict(x_test)
print(metrics.classification_report(y_test,test_predict,digits=5))
cm_plot(y_test,test_predict).show()

data=pd.read_csv('../集成学习之随机森林/iris.csv', header=None)
x1=data.iloc[:,:-1]
y1=data.iloc[:,-1]
from sklearn.model_selection import train_test_split
x1_train,x1_test,y1_train,y1_test=train_test_split(x1,y1,test_size=0.3,random_state=0)
from sklearn.naive_bayes import MultinomialNB
ml1=MultinomialNB(alpha=1)

ml1.fit(x1_train,y1_train)
from sklearn import metrics
train1_predict=ml1.predict(x1_train)
print(metrics.classification_report(y1_train,train1_predict,digits=5))
cm_plot(y1_train,train1_predict).show()

test1_predict=ml1.predict(x1_test)
print(metrics.classification_report(y1_test,test1_predict,digits=5))
cm_plot(y1_test,test1_predict).show()
相关推荐
大头流矢2 小时前
《数据结构·排序·进阶:希尔、堆、快排核心解析》——为何希尔是插入进阶?堆排序时间复杂度的关键?
c语言·数据结构·算法
reasonsummer2 小时前
【人工智能-03-06】20251227 人工智能第二学期课程 下载课件《教育设计中的信息化》中的“多人编辑文件” 的图片,然后合并PDF
python
hunteritself2 小时前
Adobe 把 Photoshop 搬进了 ChatGPT,免费的
gpt·机器学习·ui·adobe·chatgpt·智能手机·photoshop
睡醒了叭2 小时前
图像分割-传统算法-聚类算法
opencv·算法·计算机视觉·聚类
子枫秋月2 小时前
模拟C++string实现
数据结构·c++·算法
~央千澈~2 小时前
人工智能AI算法推荐之番茄算法推荐证实其算法推荐规则技术解析·卓伊凡
人工智能·算法·机器学习
羚羊角uou2 小时前
【数据结构】常见排序
数据结构·算法·排序算法
.似水2 小时前
Python面向对象
开发语言·python
无限进步_2 小时前
C++ STL容器适配器深度解析:stack、queue与priority_queue
开发语言·c++·ide·windows·算法·github·visual studio