朴素贝叶斯、决策树及随机森林

朴素贝叶斯

相关理论

        在机器学习算法中,大多数的算法都是判别方法,如决策树、KNN、逻辑回归、支持向量机等。而朴素贝叶斯是生成方法,直接找出输出特征Y和特征X的联合分布P(Y\mid X),用P(Y\mid X)=P(X,Y)/P(X)得出。

                        如果X和Y条件独立,P(X,Y)=P(X)P(Y)

                条件概率公式:P(Y\mid X)=P(X,Y)/P(X),P(X\mid Y)=P(X,Y)/P(Y)

                P(Y\mid X)=P(X\mid Y)P(Y)/P(X)

                        全概率公式:P(X)=\sum_{k }^{}P(X\mid Y=Y_{k})P(Y_{k}),其中\sum_{k}^{}P(Y^{_{k}})=1

               贝叶斯公式为:P(Y_{k}\mid X)=P(X,X_{k})/p(X)=[P(X\mid Y=Y_{k})P(Y_{k})]/[\sum_{k}^{}P(X\mid Y=Y_{k})P(Y_{k})]

先验概率+数据=后验概率

也就是说我们在实际问题中要得到后验概率,可以通过先验概率和数据综合得。

sklearn API

sklearn . naive_bayes . MultinomialNB ()
estimator . fit ( x_train , y_train )
y_predict = estimator . predict ( x_test )

示例

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
#获取数据
iris=load_iris()
#划分数据集
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target)

estimator=MultinomialNB()
estimator.fit(x_train,y_train)


score=estimator.score(x_test,y_test)
print("准确率:\n",score)

index=estimator.predict([[1,1,2,2]])
print("预测:\n",index,iris.target_names,iris.target_names[index])

决策树

基本知识

决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。

组成

□——决策点,是对几种可能方案的选择,即最后选择的最佳方案。如果决策属于多级决策,则决策树的中间可以有多个决策点,以决策树根部的决策点为最终决策方案。

○——状态节点,代表备选方案的经济效果(期望值),通过各状态节点的经济效果的对比,按照一定的决策标准就可以选出最佳方案。由状态节点引出的分支称为概率枝,概率枝的数目表示可能出现的自然状态数目每个分枝上要注明该状态出现的概率。

△——结果节点,将每个方案在各种自然状态下取得的损益值标注于结果节点的右端。

画法

机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。

一个决策树包含三种类型的节点:

  1. 决策节点:通常用矩形框来表示
  2. 机会节点:通常用圆圈来表示
  3. 终结点:通常用三角形来表示

决策树如果依靠数学的计算方法可以取得更加理想的效果。 数据库已如下所示:

(x, y) = (x1, x2, x3…, xk, y)

相关的变量 Y 表示我们尝试去理解,分类或者更一般化的结果。 其他的变量x1, x2, x3 等则是帮助我们达到目的的变量。

决策树的剪枝

剪枝是决策树停止分支的方法之一,剪枝有分预先剪枝和后剪枝两种。预先剪枝是在树的生长过程中设定一个指标,当达到该指标时就停止生长,这样做容易产生“视界局限”,就是一旦停止分支,使得节点N成为叶节点,就断绝了其后继节点进行“好”的分支操作的任何可能性。不严格的说这些已停止的分支会误导学习算法,导致产生的树不纯度降差最大的地方过分靠近根节点。后剪枝中树首先要充分生长,直到叶节点都有最小的不纯度值为止,因而可以克服“视界局限”。然后对所有相邻的成对叶节点考虑是否消去它们,如果消去能引起令人满意的不纯度增长,那么执行消去,并令它们的公共父节点成为新的叶节点。这种“合并”叶节点的做法和节点分支的过程恰好相反,经过剪枝后叶节点常常会分布在很宽的层次上,树也变得非平衡。后剪枝技术的优点是克服了“视界局限”效应,而且无需保留部分样本用于交叉验证,所以可以充分利用全部训练集的信息。但后剪枝的计算量代价比预剪枝方法大得多,特别是在大样本集中,不过对于小样本的情况,后剪枝方法还是优于预剪枝方法的。

优点

决策树易于理解和实现,人们在在学习过程中不需要使用者了解很多的背景知识,这同时是它的能够直接体现数据的特点,只要通过解释后都有能力去理解决策树所表达的意义。[1]

对于决策树,数据的准备往往是简单或者是不必要的,而且能够同时处理数据型和常规型属性,在相对短的时间内能够对大型数据源做出可行且效果良好的结果。

易于通过静态测试来对模型进行评测,可以测定模型可信度;如果给定一个观察的模型,那么根据所产生的决策树很容易推出相应的逻辑表达式。

缺点

1)对连续性的字段比较难预测。

2)对有时间顺序的数据,需要很多预处理的工作。

3)当类别太多时,错误可能就会增加的比较快。

4)一般的算法分类的时候,只是根据一个字段来分类。

基于信息增益决策树的建立

信息熵
信息熵描述的是不确定性。信息熵越大,不确定性越大。信息熵的值越小,则 D 的纯度越高。
信息增益
信息增益是一个统计量,用来描述一个属性区分数据样本的能力。信息增益越大,那么决策树就会越简
洁。这里信息增益的程度用信息熵的变化程度来衡量
信息增益公式:

信息增益决策树建立步骤

第一步 , 计算根节点的信息熵
第二步 , 计算属性的信息增益
第三步 , 划分属性

API

class sklearn.tree.DecisionTreeClassifier(....)
参数:
criterion "gini" "entropy” 默认为="gini"
当criterion取值为"gini"时采用 基尼不纯度(Gini impurity)算法构造决策树,
当criterion取值为"entropy”时采用信息增益( information gain)算法构造决策树.
max_depth int, 默认为=None 树的最大深度
# 可视化决策树
function sklearn.tree.export_graphviz(estimator, out_file="iris_tree.dot",
feature_names=iris.feature_names)
参数:
estimator决策树预估器
out_file生成的文档
feature_names节点特征属性名
功能:
把生成的文档打开,复制出内容粘贴到"http://webgraphviz.com/"中,点击"generate
Graph"会生成一个树型的决策树图

示例

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier, export_graphviz

iris=load_iris()
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=22)
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)

estimator=DecisionTreeClassifier(criterion="entropy")
estimator.fit(x_train,y_train)
score=estimator.score(x_test,y_test)
print("准确率为:",score)

index=estimator.predict([[1,2,3,1]])
print("预测:",index,iris.target_names,iris.target_names[index])

export_graphviz(estimator,out_file="iris_tree.dot",feature_names=iris.feature_names)

运行结果:

随机森林

基础知识

随机 :
特征随机,训练集随机
        样本:
                对于一个总体训练集T, T 中共有 N 个样本,每次有放回地随机选择 n 个样本。用这 n 个样
        本来训练一个决策树。
        特征:
                假设训练集的特征个数为d,每次仅选择 k(k<d) 个来构建决策树。
森林:
多个决策树分类器构成的分类器 , 因为随机,所以可以生成多个决策树
处理具有高维特征的输入样本,而且不需要降维
使用平均或者投票来提高预测精度和控制过拟合

API

class sklearn.ensemble.RandomForestClassifier
参数:
n_estimators int, default=100
森林中树木的数量。 ( 决策树个数 )
criterion {“gini”, “entropy”}, default=”gini” 决策树属性划分算法选择
        当criterion 取值为 “gini” 时采用 基尼不纯度( Gini impurity )算法构造决策树,
        当criterion 取值为 “entropy” 时采用信息增益( information gain )算法构造决策树 .
ax_depth int, default=None 树的最大深度。

示例

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import export_graphviz
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
# 1、获取数据
titanic = pd.read_csv("src/titanic/titanic.csv")
titanic.head()
# 筛选特征值和目标值
x = titanic[["pclass", "age", "sex"]]
y = titanic["survived"]
#2、数据处理
# 1)缺失值处理
x["age"].fillna(x["age"].mean(), inplace=True)
# 2) 转换成字典
x = x.to_dict(orient="records")
# 3)、数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 4)、字典特征抽取
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
'''
#3 预估: 不加网格搜索与交叉验证的代码
estimator = RandomForestClassifier(n_estimators=120, max_depth=5)
# 训练
estimator.fit(x_train, y_train)
'''
#3 预估: 加网格搜索与交叉验证的代码
estimator = RandomForestClassifier()
# 参数准备 n_estimators树的数量, max_depth树的最大深度
param_dict = {"n_estimators": [120,200,300,500,800,1200], "max_depth":
[5,8,15,25,30]}
# 加入网格搜索与交叉验证, cv=3表示3次交叉验证
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
# 训练
estimator.fit(x_train, y_train)
# 5)模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值