目录
3)max_depth:决策树最大深度,最大层数(同决策树)
4)min_samples_split :非叶子节点最小样本数 (同决策树)
5)min_samples_leaf :最小叶子节点数样本数 (同决策树)
6)min_weight_fraction_leaf : (同决策树)
7)max_features : 最大特征数 (随机森林独有)
8)max_leaf_nodes:最大叶子结点数 (同决策树)
一、集成学习
1、含义
集成学习(Ensemble Learning)是一种通过将多个机器学习模型组合起来来解决问题的方法。在集成学习中,多个模型被训练并预测,然后通过一定的策略将它们的预测结果进行组合,从而得到最终的预测结果。
集成学习的基本理论基础是"集思广益",即通过结合多个模型的优点来提高整体的性能表现。通过集成学习,可以减小单一模型的局限性,降低模型的方差,提高模型的鲁棒性和预测稳定性。集成学习可以应用于分类问题、回归问题和聚类问题等多个领域。
2、集成学习代表
1)bagging方法
典型:随机森林
2)boosting方法
典型:Xgboost
3)stacking方法
典型:堆叠模型
二、随机森林
1、什么是随机森林
随机森林(Random Forest)是一种集成学习方法,基于决策树构建的模型。随机森林在训练过程中生成多个决策树,并通过投票或平均的方式来进行最终的预测。
如图所示,即为随机森林的模型:
2、特点
1)数据采样随机
在每个决策树的训练过程中,随机森林会从原始训练集中有放回地抽取样本,用于构建决策树。这样可以增加样本的多样性,减小过拟合的风险。
2)特征选取随机
在每个决策树的训练过程中,随机森林会从原始训练集中有放回地抽取样本,用于构建决策树。这样可以增加样本的多样性,减小过拟合的风险。
3)森林
在进行预测时,随机森林会对每个决策树的预测结果进行投票(分类问题)或求平均(回归问题),以得到最终的预测结果。
4)基分类器为决策树
随机森林由多个决策树构成,每个决策树都是独立训练的。每个决策树都对输入数据进行特征选择和分裂,通过递归地选择最佳分割特征和阈值来构建决策树。
3、为什么使用随机森林?
随机森林具有良好的泛化能力,对于处理高维数据和大规模数据集也有较好的效果。它可以用于分类和回归问题,并且能够给出特征的重要性评估,用于特征选择和特征工程。
随机森林的训练速度较快,并且对于缺失值和异常值具有较好的处理能力。因此,随机森林是机器学习中一种常用的集成学习方法。
4、随机森林生成步骤
5、库及参数介绍
class sklearn.ensemble.RandomForestClassifier(n_estimators=’warn’, criterion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)
1)n_estimators :(随机森林独有)
随机森林中决策树的个数。
在0.20版本中默认是10个决策树;
在0.22版本中默认是100个决策树;
2)criterion:节点分割依据(同决策树)
默认为基尼系数,可选entropy,信息增益
3)max_depth:决策树最大深度,最大层数(同决策树)
default=(None)设置决策树的最大深度,默认为None。
(1)数据少或者特征少的时候,可以不用管这个参数,按照默认的不限制生长即可
(2)如果数据比较多特征也比较多的情况下,可以限制这个参数,范围在10~100之间比较好
4)min_samples_split :非叶子节点最小样本数 (同决策树)
这个值限制了子树继续划分的条件,如果某节点的样本数少于设定值,则不会再继续分裂。默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则建议增大这个值。
5)min_samples_leaf :最小叶子节点数样本数 (同决策树)
这个值限制了叶子节点最少的样本数
6)min_weight_fraction_leaf : (同决策树)
这个值限制了叶子节点所有样本权重和的最小值,
7)max_features : 最大特征数 (随机森林独有)
随机森林允许单个决策树使用特征的最大数量。选择最适属性时划分的特征不能超过此值。
当为整数时,即最大特征数;当为小数时,训练集特征数*小数;
8)max_leaf_nodes:最大叶子结点数 (同决策树)
通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
9)min_impurity_split:(同决策树)
这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
10)bootstrap=True (随机森林独有)
是否有放回的采样,按默认,有放回采样
11)n_jobs=1:
并行job个数。这个在是bagging训练过程中有重要作用,可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job。
6、代码实现
import pandas as pd
from sklearn import tree
from sklearn.model_selection import train_test_split
# 回执混淆矩阵
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('data.csv')
df = pd.read_csv("spambase.csv") # 导入数据
x = df.iloc[:,:-1] # 切分特征集和标签集
y = df.iloc[:,-1]
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.2,random_state=100) # 对原始数据集进行切分
# 随机森林
from sklearn.ensemble import RandomForestClassifier # 导入随机森林库
# 定义参数
rf = RandomForestClassifier( # 定义模型并调整参数
n_estimators=100, # 决策树个数
max_features=0.8, # 最多传递多少个特征 80%
random_state=0 # 随机种子
)
rf.fit(xtrain,ytrain) # 对训练集进行训练
train_predicted = rf.predict(xtrain) # 预测训练集本身正确率
from sklearn import metrics
# 打印分类报告
print(metrics.classification_report(ytrain,train_predicted))
# 绘制混淆矩阵
cm_plot(ytrain,train_predicted).show()
test_predicted = rf.predict(xtest) # 对测试集进行测试,同时打印分类报告
print(metrics.classification_report(ytest,test_predicted))
cm_plot(ytest,test_predicted).show()
import matplotlib.pyplot as plt # 导入绘图库
importances = rf.feature_importances_ # 将rf模型中特征的重要性评估保存在importances变量中
im = pd.DataFrame(importances,columns=['importances']) # 将importances转换成DataFrame对象,并设置列名为importances
clos = df.columns # 将数据集df的列名保存在clos变量中
clos_1 = clos.values # 将clos转换成一个一维numpy数组,存放在clos_1中
clos_2 = clos_1.tolist() # 将clos_1转换成一个python列表
clos = clos_2[0:-1] # 取出除了最后一个的全部数据
im['clos'] = clos # 将处理后的特征列名增加到DataFrame im中
im = im.sort_values(by=['importances'],ascending=False)[:10] # 根据特征重要性的值对im进行降序排序,并选取前十个重要特征。
index = range(len(im)) # 生成一个范围对象,表示条形图的纵轴刻度
plt.yticks(index,im.clos) # 设置纵轴的刻度标签为im中的特征列名
plt.barh(index,im['importances']) # 绘制水平条形图,横轴表示特征重要性,纵轴表示特征名。
plt.show()
运行结果如下: