决策树和集成算法
树的组成:
根节点:第一个选择点
非叶子节点与分支:中间过程
叶子节点:最终的决策结果
熵值:H(X)=- ∑ pi * logpi, i=1,2, ... , n
Gini(S) = 1 - Σ (pk^2)。取值(0,1)0最纯。
初始熵值:结果的熵值,结果有几个类别就有几个熵值相加
新熵值:一个特征分成有多个结果,每个结果的熵值和初始熵值计算方法一样,然后加权相加
信息增益ID3(如果一个特征分为很多结果的话,新熵就是0了,即未考虑分类数的影响):
(信息增益)InformationGain(S, A) = (熵)Entropy(S) - H(S|A)
(增益率)GainRatio(S, A) = InformationGain(S, A) / SplitInformation(A)
SplitInformation(A) = - Σ (p(t) * log2(p(t)))
信息增益率c4.5
CART:使用GINI系数来当做衡量标准,用法和信息增益一样
信息增益率越高,表示特征对于分类的贡献越大。
决策树剪枝:决策树过拟合风险很大(如果树足够庞大,每个叶子节点不就一个数据了嘛)
预剪枝:限制深度,叶子节点个数叶子节点样本数,信息增益量等
后剪枝:通过一定的衡量标准(叶子节点越多,损失越大。假设某个节点的子树被剪枝,将该节点替换为叶节点,并将其类别设置为该子树中样本最多的类别。提高泛化能力。
集成算法:Bagging:Stacking:Boosting
Bagging( bootstrap aggregation)多个并行分类器取平均。
首先对训练数据集进行多次采样,保证每次得到的采样数据都是不同的
分别训练多个模型,例如树模型
预测时需得到所有模型结果再进行集成
oob_score_
是基于袋装集成算法的袋外评估得分,它通过使用在训练过程中未使用的样本(每个决策树都没用过,有点像测试集,但是是类内验证)进行预测来评估分类器的性能
Adaboost(自适应增强算法)
提高分错样本的权重,(这次错了,下次别错了)
for i in range(5):
svm_clf = SVC(kernel='rbf',C=0.05,random_state=42)
svm_clf.fit(X_train,y_train,sample_weight = sample_weights)
y_pred = svm_clf.predict(X_train)
sample_weights[y_pred != y_train] *= (1+learning_rate)
plot_decision_boundary(svm_clf,X,y,alpha=0.2)
plt.title('learning_rate = {}'.format(learning_rate))
重要的是指出,Adaboost算法是一个迭代的过程,通过反复训练基础分类器并调整样本权重来逐步提升整体模型的性能。通过逐步调整样本权重,Adaboost能够对错误分类的样本加大关注,从而更有效地拟合数据集中的难以分类的样本。
Gradient Boosting
tree_reg1 = DecisionTreeRegressor(max_depth = 2)
tree_reg1.fit(X,y)
y2 = y - tree_reg1.predict(X)
tree_reg2 = DecisionTreeRegressor(max_depth = 2)
tree_reg2.fit(X,y2)
y3 = y2 - tree_reg2.predict(X)
tree_reg3 = DecisionTreeRegressor(max_depth = 2)
tree_reg3.fit(X,y3)
#多次计算残差,然后多个决策树叠加
确实有梯度下降那个味道了
gbrt = GradientBoostingRegressor(max_depth = 2,
n_estimators = 120,
learning_rate = 1.0
random_state = 42
)
多个模型图像叠加
Stacking(堆叠集成)
Stacking使用多层的结构进行模型组合。首先,原始训练集被用于训练一组初始的基础学习器。然后,使用基础学习器的预测结果作为输入数据,再训练一个学习器来对最终结果进行预测。
estimators = [random_forest_clf, extra_trees_clf, svm_clf, mlp_clf]
for estimator in estimators:
print("Training the", estimator)
estimator.fit(X_train, y_train)
X_val_predictions = np.empty((len(X_val), len(estimators)), dtype=np.float32)
for index, estimator in enumerate(estimators):
X_val_predictions[:, index] = estimator.predict(X_val)
rnd_forest_blender.fit(X_val_predictions, y_val)
提前停止策略
errors = [mean_squared_error(y_val,y_pred) for y_pred in gbrt.staged_predict(X_val)]
bst_n_estimators = np.argmin(errors)
min_error = np.min(errors)
plt.plot([bst_n_estimators,bst_n_estimators],[0,min_error],'k--')
plt.plot([0,120],[min_error,min_error],'k--')
此时就要中途停止了,之后就过拟合了
for n_estimators in range(1,120):
gbrt.n_estimators = n_estimators
gbrt.fit(X_train,y_train)
y_pred = gbrt.predict(X_val)
val_error = mean_squared_error(y_val,y_pred)
if val_error < min_val_error: #min_val_error初始值要非常大才行
min_val_error = val_error
error_going_up = 0
else:
error_going_up +=1
if error_going_up == 5:
break
loss连续五次增长,那就break。
随机森林实现逻辑
首先想想目的:对数据进行分类,并构建预测函数
目前有什么:数据集,特征,标签
方法是什么:计算每个特征的信息熵,找到最大的信息增益率(原来的熵值和分类后熵值的差),然后把这个特征作为第一个非叶子节点。以此类推
这是决策树最基础的一个构成:{'F2-WORK': {0: 'no', 1: 'yes'}}即F2-WORK取0,1时结果的样子
1.计算初始熵值,分别计算每一个特征的信息增益率,最大的那个就是根节点
2.递归,找下一个非叶子节点
3.最后只剩下一个特征,或者信息增益率都为负数,或者分类完全正确时停止。返回预测结果或类别标签。通常情况下,这个结果是当前节点中样本数量最多的类别。
4.得到这棵决策树
def createTree(dataset, labels, featLabels): #featLabels 是一个空列表
classList = [example[-1] for example in dataset]#取出结果
if classList.count(classList[0]) == len(classList):
return classList[0]
if len(dataset[0]) == 1:
return majorityCnt(classList) #停止条件
bestFeat = chooseBestFeatureToSplit(dataset)#返回一个索引
bestFeatLabel = labels[bestFeat] # 把最佳特征传入featLabels 列表
featLabels.append(bestFeatLabel)
myTree = {bestFeatLabel: {}} #标签进入树中
del labels[bestFeat] #labels 列表中删除已选择的特征
featValue = [example[bestFeat] for example in dataset]
uniqueVals = set(featValue)
#提取数据集中最佳特征的所有取值。 set 去除重复,得到一个包含唯一值的集合。
for value in uniqueVals:
sublabels = labels[:]
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataset, bestFeat, value),
sublabels, featLabels)
#把数据集分为value份,并删除bestFeatLabel这一列,然后继续向下延申
return myTree
5.集成多个决策树
随机森林通过集成学习的方式将多个决策树的结果联系在一起。具体来说,随机森林采用以下两个主要方法来整合多个决策树的预测结果:
1.投票(Voting):在多数投票策略下,每个决策树都对样本进行预测,并投票选择最常见的类别作为最终的预测结果。这通常适用于分类问题。
硬投票(Hard Voting):将每个决策树的预测结果进行简单的投票,即选择获得最高票数的类别作为最终预测结果。
软投票(Soft Voting):每个决策树会为每个类别给出一个概率或置信度(gini不纯度等求出来的),最后将所有决策树预测结果的概率进行平均并选取概率最高的类别作为最终预测结果
2.平均(Averaging):对于回归问题,每个决策树都会给出一个连续的预测值,随机森林通过取所有决策树预测值的平均值作为最终的预测结果。
( 决策树在回归问题中的应用)
隔了大半年回来看看:
根据算法,求出depth=0这条线在哪两个点之间时损失函数最小,得到第一个分界点。之后迭代并以此类推。
depth=0时maxdepth为1,此时时散点图被拟合为两条线段。每条线段的y坐标这这段线段中x散点y坐标的均值。
6.模型评估和优化:随机森林的性能可以通过交叉验证等方法进行评估。可以根据需要调整超参数,如决策树数量和每个决策树的最大深度等,以进一步优化随机森林模型的性能。