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

一、集成学习的随机森林

1.集成学习的含义:

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

2.集成学习的方法:

  • bagging方法:典型的是随机森林(我们要学习的)
  • boosting方法:典型的是Xgboost
  • stacking方法:堆叠模型

3.集成学习的应用:

  • 分类问题集成
  • 回归问题集成
  • 特征选取集成(特征选取,也就是分辨出哪些特征是有效的哪些是无效的)

4.随机森林

1)什么是随机森林

很多个决策树,把数据给每个决策树,但是这个数据是随机选择一些数据给一个决策树,下一个决策树在进行随机选取,每个决策树得到的数据不是百分百,且是随机的,很多个决策树虽然没有学百分百,但很多个一共就学了全部的数据,,除此之外,也不是所有特征都给一个决策树,特征也随机

随机森林的特点:

  • 数据采样随机
  • 特征选取随机
  • 森林
  • 基学习器为决策树

2)随机森林的优缺点

优点:

  • 具有极高的准确率
  • 随机性的引入,使得随机森林的抗噪声能力很强。(噪声也就是异常数据,在某一个类别中会出现其他类的,有可能是人为统计结果时出错)
  • 随机性的引入,使得随机森林不容易过拟合
  • 能够处理很高维度的数据,不用做特征选择
  • 容易实现并行化
  • 缺点:
  1. 当随机森林中的决策树个数很多时,训练需要的空间和时间会比较大

3)随机森林生成步骤

4)构造随机森林

还有

  • min_impurity_split(同决策树):这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值则该点不再生成了节点,即为叶子节点。一般不改动默认值1e-7
  • bootstrap=True(随机森林独有):是否又放回的采样,按默认,有放回采样
  • n_jobs=1:并行job个数,这个在是bagging训练过程中有重要作用可以并行从而提高性能。1=不并行;n为n个并行,为-1的时候cpu有多少core就启动多少job,但有时候为-1会报错。

等有很多参数,其中最重要的是

5)垃圾邮件的识别(随机森林)

数据:

这里word_freq_xxx表示某个单词出现的百分比,例如这里address词出现的百分比

char_freq_1~6,匹配的电子邮件中字符的百分比

Capital_run_length_xxx中有三个,分别是Capital_run_length,Capital_run_length_average,Capital_run_length_total,这三个意思分别为最长不间断大写字母序列的长度、不间断大写字母序列的平均长度、电子邮件中大写字母的总数。

最后一列就是label,标签

代码:

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
df=pd.read_csv("D:\learn\代码所用文本\spambase.csv")
data=df.iloc[:,:-1]
result=df.iloc[:,-1]

from sklearn.model_selection import train_test_split
data_train,data_test,result_train,result_test=train_test_split(data,result,
                                                               test_size=0.2,random_state=100)
from sklearn.ensemble import RandomForestClassifier
forest=RandomForestClassifier(n_estimators=100,max_features=0.8,random_state=0)
forest.fit(data_train,result_train)
from sklearn import  metrics

train_pre=forest.predict(data_train)
print(metrics.classification_report(result_train,train_pre,digits=6))
# cm_plot(result_train,train_pre).show()

test_pre=forest.predict(data_test)
print(metrics.classification_report(result_test,test_pre))
# cm_plot(result_test,test_pre).show()
# forest.score(data_test,result_test)

也有很高的准确率和召回率

在上面代码最后加入以下代码,就可以得到重要特征的排名,这里是只取了前十的排名。并绘图站输出排名的条形统计图

python 复制代码
'''特征重要程度排名'''
import matplotlib.pyplot as plt
importances=forest.feature_importances_#这个属性保存了模型中特征的重要性
im=pd.DataFrame(importances,columns=['importances'])
clos=df.columns
clos_1=clos.values
clos_2=clos_1.tolist()
clos=clos_2[0:-1]
im['clos']=clos
'''排序并只选择前十的'''
im=im.sort_values(by=['importances'],ascending=False)[:10]
'''画图画出排列前十的重要特征'''
index=range(len(im))
plt.yticks(index,im.clos)#用于获取或设置y轴的刻度和标签
plt.barh(index,im['importances'])#用于创建水平条形图
plt.show()

得到图形:

二、贝叶斯算法

1.贝叶斯的原理

贝叶斯算法一般运用于自然原处理。

贝叶斯处理数学问题:

一个学校里面有60%的男生,40%的女生

100%的男生穿长裤,50%的女生穿长裤,50%穿裙子

此时一个穿长裤的学生走过来,出于高度近视看不清,判断一下这个长裤学生是女生的概率?

贝叶斯用于实例:

也就是我们输入一个数据,数据中中没有这种情况,此时就要求出这条数据是某个类别的概率,也就是为1的概率,和为0的概率,谁概率大就可能属于哪个类别,上图得到的两个式子分母一样,比较分子就行。

2.构建一个贝叶斯算法模型

参数很少,没什么需要控制的

3.鸢尾花判断(贝叶斯分类)

鸢尾花数据之前使用过,但是我这里使用的是没有表头的

如果使用之前的数据就需要注意这里数据的处理

代码:

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
data=pd.read_csv("D:\learn\代码所用文本\iris.csv",header=None)#None表示文件无表头
data=data.drop(0,axis=1)#把第一列删除
X=data.iloc[:,:-1]
Y=data.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=0)

from sklearn.naive_bayes import MultinomialNB#导入贝叶斯分类器
bayes=MultinomialNB(alpha=1)
bayes.fit(x_train,y_train)

from sklearn import metrics

train_pre=bayes.predict(x_train)
# cm_plot(y_train,train_pre).show()
print(metrics.classification_report(y_train, train_pre))

test_pre=bayes.predict(x_test)
# cm_plot(y_test,test_pre).show()
print(metrics.classification_report(y_test, test_pre))

结果:

结果看似很高,但其实贝叶斯算法应用到实际问题中准确率不是很高,这里是数据的原因才会使得准确率很高。

相关推荐
一匹电信狗7 小时前
【LeetCode_547_990】并查集的应用——省份数量 + 等式方程的可满足性
c++·算法·leetcode·职场和发展·stl
鱼跃鹰飞8 小时前
Leetcode会员尊享100题:270.最接近的二叉树值
数据结构·算法·leetcode
梵刹古音9 小时前
【C语言】 函数基础与定义
c语言·开发语言·算法
筵陌9 小时前
算法:模拟
算法
万事ONES9 小时前
ONES 签约北京高级别自动驾驶示范区专设国有运营平台——北京车网
人工智能·机器学习·自动驾驶
We་ct9 小时前
LeetCode 205. 同构字符串:解题思路+代码优化全解析
前端·算法·leetcode·typescript
renhongxia110 小时前
AI算法实战:逻辑回归在风控场景中的应用
人工智能·深度学习·算法·机器学习·信息可视化·语言模型·逻辑回归
CoderCodingNo10 小时前
【GESP】C++四级/五级练习题 luogu-P1223 排队接水
开发语言·c++·算法
民乐团扒谱机10 小时前
【AI笔记】精密光时频传递技术核心内容总结
人工智能·算法·光学频率梳
CoderCodingNo10 小时前
【GESP】C++五级/四级练习题 luogu-P1413 坚果保龄球
开发语言·c++·算法