决策树(DecisionTree)和随机森林
1. 决策树
1.1 概念
决策树是⼀种树形结构,为⼈们提供决策依据,决策树可以⽤来回答yes和no问题,它通过树形结构将各种情况组合都表⽰出来,每个分⽀表⽰⼀次选择(选择yes还是no),直到所有选择都进⾏完毕,最终给出正确答案。决策树是⼀种贪⼼算法,它要在给定时间内做出最佳选择,但 并不关⼼能否达到全局最优 。
决策树(decision tree)是⼀个树结构(可以是⼆叉树或⾮⼆叉树)。在实际构造决策树时,通常要进⾏剪枝,这是为了处理由于数据中的噪声和离群点导致的过分拟合问题。剪枝有两种:
先剪枝——在构造过程中,当某个节点满⾜剪枝条件,则直接停⽌此分⽀的构造。
后剪枝——先构造完成完整的决策树,再通过某些条件遍历树进⾏剪枝。
1.2 划分准则
决策树学习的关键:如何选择最优划分属性
划分数据集的⼤原则是:将⽆序的数据变得更加有序
划分数据集,构建决策树时将对每个特征划分数据集的结果计算⼀次信息增益/基尼指数/增益率,然后判断按照哪个特征划分数据集是最好的划分⽅式。
(1)信息增益
信息增益越⼤,则意味着使⽤属性 α 来进⾏划分所获得的"纯度提升"越⼤。信息增益准则对可取值数⽬较多的属性有所偏好。
飘逸的头发
(2)增益率
属性 α 的可能取值数⽬越多(即 V 越⼤),则 IV(α) 的值通常会越⼤,增益率越⼩。增益率准则对可取值数⽬较少的属性有所偏好。
(3)基尼指数
基尼值:
基尼指数:
Gini(D) 反映了从数据集 D 中随机抽取两个样本,其类别标记不⼀致的概率。 因此, Gini(D) 越⼩,两个样本的类别越⼀致,则数据集 D 的纯度越⾼。
1.3 决策树算法
(1)ID3
以信息增益为准则来选择划分属性,⽤于划分离散型数据集。
做法:
每次选取当前最佳的特征来分割数据,并按照该特征的所有可能取值来切分。⼀旦按某特征切分后,该特征在之后的算法执⾏过程中将不会再起作⽤,所以有观点认为这种切分⽅式过于迅速。
缺点:
切分⽅式过于迅速;
不能直接处理连续型特征。只有事先将连续型特征转换成离散型,才能使⽤。这种转换过程会破坏连续型变量的内在性质。
ID3算法⽆法直接处理数值型数据,尽管我们可以通过量化的⽅法将数值型数据转化为离散型数值,但是如果存在太多的特征划分,ID3算法仍然会⾯临其他问题。
(2)C4.5
以增益率为准则来选择划分属性,核⼼算法ID3的改进算法。
C4.5⽐ID3改进的地⽅:
(3)CART
CART决策树(分类回归决策树):使⽤"基尼指数" 来选择划分属性。
CART是⼗分著名且⼴泛记载的树构建算法,它使⽤⼆元切分来处理连续型变量:
⼆元切分法:每次把数据集切成两份
做法:如果特征值⼤于给定值就⾛左⼦树, 否则就⾛右⼦树。
优点:易于对树构建过程进⾏调整以处理连续型特征; ⼆元切分法也节省了树的构建时间。
1.4 代码实现
ID3选择属性⽤的是⼦树的信息增益,即熵的变化值;⽽C4.5⽤的是信息增益率。⼀般来说率就是⽤
来取平衡⽤的,⽐如有两个跑步的⼈,⼀个起点是10m/s的⼈、其1s后为20m/s;另⼀个⼈起速是1m/s、其1s后为2m/s。如果紧紧算差值那么两个差距就很⼤了,如果使⽤速度增加率(加速度)来衡量,2个⼈就是⼀样了。在这⾥,其克服了⽤信息增益选择属性时偏向选择取值多的属性的不⾜。
在树构造过程中进⾏剪枝。有些节点只挂着⼏个元素,对于这种节点,⼲脆不考虑最好,不然很容易导致overfitting。
对⾮离散数据都能处理,也就是把连续性的数据转化为离散的值进⾏处理。这个其实就是⼀个个式,看对于连续型的值在哪⾥分裂好。
能够对不完整数据进⾏处理。这个重要也重要,其实也没那么重要,缺失数据采⽤⼀些⽅法补上去就是了。
决策树主要是调⽤sklearn⾥⾯函数,这个⾥⾯包含了DecisionTreeClassifier,不需要我们⾃⼰去实现。
import numpy as np
import matplotlib.pyplot as plt
import DecisionTreeRegressor
福利礼品>妨碍的意思
if __name__ == "__main__":
n = 500
x = np.random.rand(n) * 8 - 3
x.sort()
y = np.cos(x) + np.sin(x) + np.random.randn(n) * 0.4
x = x.reshape(-1, 1)
reg = DecisionTreeRegressor(criterion='m')
# reg1 = RandomForestRegressor(criterion='m')
dt = reg.fit(x, y)
# dt1 = reg1.fit(x, y)
x_test = np.linspace(-3, 5, 100).reshape(-1, 1)
y_hat = dt.predict(x_test)
america怎么读
plt.figure(facecolor="w")
plt.plot(x, y, 'ro', label="actual")
plt.plot(x_test, y_hat, 'k*', label="predict")
plt.legend(loc="best")
plt.title(u'Decision Tree', fontsize=17)
plt.tight_layout()
plt.show()
2. 随机森林
2.1 Bagging策略
开球失机
Bagging( bootstrap aggregation)的策略:从样本集中进⾏有放回地选出n个样本;在样本的所有特征上,对这n个样本建⽴分类器;重复上述两步m次,获得m个样本分类器;最后将测试数据都放在这m个样本分类器上,最终得到m个分类结果,再从这m个分类结果中决定数据属于哪⼀类(多数投票制)。
Bootstrap:⼀种有放回的抽样⽅法。
随机森林采⽤了Bagging策略,且在其基础上进⾏了⼀些修改,采⽤了两个随机:
1. 从训练样本集中使⽤Bootstrap采样(随机有放回)选出n个样本。
2. 设样本共有b个特征,从这b个特征中只随机选择k个特征来分割样本,通过计算选择最优划分特征作为节点来划分样本集合来建⽴决
策树。(与Bagging的不同之处:没有使⽤全部的特征,这样可以避免⼀些过拟合的特征,不再对决策树进⾏任何剪枝)
雍正的皇后是谁
3. 重复以上两步m次,可建⽴m棵决策树
4. 这m棵决策树形成了森林,可通过简单多数投票法(或其他投票机制)来决定森林的输出,决定属于哪⼀类型。(针对解决回归问
题,可以采⽤单棵树输出结果总和的平均值)
随机森林在⼀定程序上提⾼了泛化能⼒,⽽且可以并⾏地⽣成单棵树。
2.2 代码⽰例
体积计算使⽤决策树和随机森林进⾏⼿写数字(sklearn中的digits数据)的预测
from sklearn import datats
del_lection import cross_val_score
import datetime
from sklearn import tree
ble import RandomForestClassifier
digits = datats.load_digits();
X = digits.data # 特征矩阵
y = digits.target # 标签矩阵
del_lection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3., random_state=8) # 分割训练集和测试集
estimators = {}
# criterion: 分⽀的标准(gini/entropy)
# 1.决策树
estimators['tree'] = tree.DecisionTreeClassifier(criterion='gini',random_state=8)
# 2.随机森林
# n_estimators: 树的数量
# bootstrap: 是否随机有放回
# n_jobs: 可并⾏运⾏的数量
estimators['forest'] = RandomForestClassifier(n_estimators=20,criterion='gini',bootstrap=True,n_jobs=2,random_state=8)
for k in estimators.keys():
start_time = w()
# print '----%s----' % k
estimators[k] = estimators[k].fit(X_train, y_train)
pred = estimators[k].predict(X_test)
# print pred[:10]
print("%s Score: %0.2f" % (k, estimators[k].score(X_test, y_test)))
scores = cross_val_score(estimators[k], X_train, y_train,scoring='accuracy' ,cv=10)
print("%s Cross Avg. Score: %0.2f (+/- %0.2f)" % (k, an(), scores.std() * 2))主板硬盘接口
end_time = w()
time_spend = end_time - start_time
print("%s Time: %0.2f" % (k, al_conds()))
未完待续。。。