首先需要安装的几个包:
pip install python-graphviz
pip install seaborn
带着问题学习,事半功倍。
1、决策树ID3,C4.5, CART的区别
2、掌握Bagging 和Boosting
3、掌握随机森林,XGBoost原理
4、随机森林,XGB,LGB的各自区别
5、GBDT和XGB的区别。
决策树
在现在的相亲或者择偶额过程中,下面的这种方式就是人的决策过程。而这种过程用图的形式表达出来就像一颗倒着的树的形状。所以这种结构就叫做决策树。
观察这个决策流程图,你会发现,
第一重要的是: 房
第二重要的是: 车
第三重要的是: 稳定工作。。。。。
把对于你最重要的作为最优先选择,如果都没房,直接不用谈了,the Next。。。
如果满足你的第一要求,再继续去了解其他你在乎的方面。
在我们构建树的根节点与叶子节点时,我们需要从N维特征种去筛选,而这种筛选就是决策树的核心。如下图所示,我们该以什么样的规则选择根节点特征与叶子节点特征??
**
解决方案来啦… 它就是,熵
**
说到决策树就要知道如下概念:
熵:表示一个随机变量的复杂性或者不确定性。
假如双十一我要剁手买一件衣服,但是我一直犹豫着要不要买,我决定买这件事的不确定性(熵)为2.6。
条件熵:表示在直到某一条件后,某一随机变量的复杂性或不确定性。
我在看了这件衣服的评价后,我决定买衣服这件事的不确定性是1.2。
我在线下实体店试穿衣服后,我决定买衣服这件事的不确定性是0.9。
信息增益:表示在知道某一条件后,某一随机变量的不确定性的减少量。信息增益的计算方式如下。
上面条件熵给出了两个:
一个是看了网上的评价,此时的信息增益是Gain1=2.6−1.2=1.4Gain1=2.6−1.2=1.4。
另一个是线下试穿了衣服,此时的信息增益
Gain2=2.6−0.9=1.7Gain2=2.6−0.9=1.7。
很显然我在线下试穿衣服之后对于决定买这件衣服的不确定度下降更多,更通俗的说就是我试穿衣服之后买这件衣服的可能性更大了。所以如果有看买家评价和线下试穿两个属性,首先应该选择线下试穿来构建内部节点。
信息增益比:
信息增益值得大小是相对于训练数据集而言得,并没有绝对得意义。在分类问题困难时,也就是说在训练数据集得经验熵大得时候,信息增益值也会偏大,反之亦然。这时使用信息增益比可以对这一问题进行矫正。即,在信息增益得基础上再除以经验熵。
前方高能。C4.5与ID3得算法区别就在于,在生成树时,是用信息增益,或者信息增益比来选择特征。
集成学习方法, bagging + Boosting
本段引用自 常用得模型集成方法介绍(bagging, boosting, stacking)
何为集成方法?
集成学习是一种机器学习范式。在集成学习中,我们会训练多个模型(通常称为「弱学习器」)解决相同的问题,并将它们结合起来以获得更好的结果。最重要的假设是:当弱模型被正确组合时,我们可以得到更精确和/或更鲁棒的模型。
在集成学习理论中,我们将弱学习器(或基础模型)称为「模型」,这些模型可用作设计更复杂模型的构件。在大多数情况下,这些基本模型本身的性能并不是非常好,这要么是因为它们具有较高的偏置(例如,低自由度模型),要么是因为他们的方差太大导致鲁棒性不强(例如,高自由度模型)。
集成方法的思想是通过将这些弱学习器的偏置和/或方差结合起来,从而创建一个「强学习器」(或「集成模型」),从而获得更好的性能。
组合弱学习器
为了建立一个集成学习方法,我们首先要选择待聚合的基础模型。在大多数情况下(包括在众所周知的 bagging 和 boosting 方法中),我们会使用单一的基础学习算法,这样一来我们就有了以不同方式训练的同质弱学习器。
这样得到的集成模型被称为「同质的」。然而,也有一些方法使用不同种类的基础学习算法:将一些异质的弱学习器组合成「异质集成模型」。
很重要的一点是:我们对弱学习器的选择应该和我们聚合这些模型的方式相一致。如果我们选择具有低偏置高方差的基础模型,我们应该使用一种倾向于减小方差的聚合方法;而如果我们选择具有低方差高偏置的基础模型,我们应该使用一种倾向于减小偏置的聚合方法。
这就引出了如何组合这些模型的问题。我们可以用三种主要的旨在组合弱学习器的「元算法」:
bagging,该方法通常考虑的是同质弱学习器,相互独立地并行学习这些弱学习器,并按照某种确定性的平均过程将它们组合起来。boosting,该方法通常考虑的也是同质弱学习器。它以一种高度自适应的方法顺序地学习这些弱学习器(每个基础模型都依赖于前面的模型),并按照某种确定性的策略将它们组合起来。stacking,该方法通常考虑的是异质弱学习器,并行地学习它们,并通过训练一个「元模型」将它们组合起来,根据不同弱模型的预测结果输出一个最终的预测结果。非常粗略地说,我们可以说 bagging 的重点在于获得一个方差比其组成部分更小的集成模型,而 boosting 和 stacking 则将主要生成偏置比其组成部分更低的强模型(即使方差也可以被减小)。
一旦选定了弱学习器,我们仍需要定义它们的拟合方式(在拟合当前模型时,要考虑之前模型的哪些信息?)和聚合方式(如何将当前的模型聚合到之前的模型中?)在接下来的两小节中,我们将讨论这些问题,尤其是介绍两个重要的 boosting 算法:自适应提升(adaboost )和梯度提升(gradient boosting)。
简而言之,这两种元算法在顺序化的过程中创建和聚合弱学习器的方式存在差异。自适应增强算法会更新附加给每个训练数据集中观测数据的权重,而梯度提升算法则会更新这些观测数据的值。这里产生差异的主要原因是:两种算法解决优化问题(寻找最佳模型——弱学习器的加权和)的方式不同。
建议如下链接,详细得介绍了bagging 方法与Boosting 方法。
集成学习法之bagging方法和boosting方法
Random Forest,GBDT
这里推荐一个很详细得专栏。
【机器学习】决策树(中)——Random Forest、Adaboost、GBDT (非常详细)
打卡一下今天的决策树任务。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
data = pd.read_csv('penguins_raw.csv')
data = data[['Species', 'Culmen Length (mm)', 'Culmen Depth (mm)', 'Flipper Length (mm)','Body Mass (g)']]
# data = data[['Species', 'Culmen Length (mm)', 'Culmen Depth (mm)', 'Flipper Length (mm)','Body Mass (g)']]
data = data.fillna(-1)
def trans(x):
if x == data['Species'].unique()[0]:
return 0
if x == data['Species'].unique()[1]:
return 1
if x == data['Species'].unique()[2]:
return 2
data['Species'] = data['Species'].apply(trans)
from sklearn.model_selection import train_test_split
# data_target_part = data[data['Species'].isin([0,1])][['Species']]
# data_features_part = data[data['Species'].isin([0,1])][['Species', 'Culmen Length (mm)', 'Culmen Depth (mm)', 'Flipper Length (mm)','Body Mass (g)']]
# x_train,x_test, y_train, y_test = train_test_split(data_features_part,data_target_part,test_size = 0.2, random_state=2020)
x_train,x_test, y_train, y_test = train_test_split(data[[ 'Culmen Length (mm)', 'Culmen Depth (mm)', 'Flipper Length (mm)','Body Mass (g)']],data[['Species']],test_size = 0.2, random_state=2020)
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
clf = DecisionTreeClassifier(criterion = 'entropy')
clf.fit(x_train, y_train)
train_predict = clf.predict(x_train)
test_predict =clf.predict(x_test)
train_predict_proba = clf.predict_proba(x_train)
test_predict_proba = clf.predict_proba(x_test)
print('test predict proba of each class',test_predict_proba)
from sklearn import metrics
print('tree train acurracy', metrics.accuracy_score(y_train, train_predict))
print('test acurracy', metrics.accuracy_score(y_test,test_predict))
confusion_matrix = metrics.confusion_matrix(test_predict,y_test)
print('confusion matrix\n',confusion_matrix)
plt.figure(figsize=(8,6))
sns.heatmap(confusion_matrix,annot=True,cmap='Blues')
plt.xlabel('predict label')
plt.ylabel('true label')
plt.show()