核心:决策树+两个随机
1 算法内容
随机森林借鉴了集思广益的思想,是一种集成学习的方法,预测时建立多棵CART决策树,再综合判断(分类:最大投票;回归:取均值。如图所示)。为了增强其泛化能力,在选取基学习器训练集和结点特征选择时加入随机性。
a) 基学习训练集选取
对每个待训练的基学习器,n为基学习器数量, 在原训练集X中,逐一有放回地随机抽取m个样本(一般和原训练集样本量一致),共进行n轮抽样,将各轮抽出的样本集分别作为各个基学习器的训练集。
b) 结点特征选择
传统决策树在选择划分属性时是在当前结点的属性集合中(假设共有d个结点)基于信息纯度准则(最大信息增益、最大信息增益率、最小基尼指数)选择一个最优属性,而在随机森林中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,再对该子集进行基于信息准则的划分属性选择。这里的k控制了随机性的引入程度;若令k=d,则基决策树的构建与传统决策树相同;若令k=1,则每次的属性选择纯属随机,与信息准则无关;一般情况下,推荐 。
c) 关于调参
(1) 如何选取k,可以考虑有d个属性,取;
(2) 最大深度(不超过8层)
(3) 棵数
(4) 最小分裂样本数
(5) 类别比例
2 算法描述
输入:样本集,弱分类器迭代次数n。
输出:强学习器f(x).
(1) 对于i=1,2...,n:
a) 对训练集进行第i次逐一随机采样,得到包含m个样本的采样集;
b) 用采样集训练第i个决策树模型
,在训练决策树模型的节点的时候, 在节点上所有的样本特征中选择k个样本特征, 在这随机选择的k个特征中选择一个最优的特征来做决策树的左右子树划分,建立CART决策树。
(2) 如果是分类算法预测,则n个弱学习器投出最多票数的类别或者类别之一为最终类别。如果是回归算法,n个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出。
3 python示例
由sklearn实现样本分类。使用的数据有两种方式:一种是csv格式的数据文件(iris,与程序文件置于同一目录下即可),,需先拆分成训练集和测试集;另一种是sklearn库中自带的数据集(iris和康辛州乳腺癌数据集).均已注释在代码中。
完整代码:
#encoding:utf-8
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix as con
#------1.以csv文件为数据,若标签为float可直接分离训练集与测试集合,若标签为striing,则需先将其转化为浮点型---------------------
#【导入相应的库(对数据库进行切分需要用到的库是sklearn.model_selection 中的 train_test_split)】
import numpy as np
from sklearn.model_selection import train_test_split
#【首先,读取.CSV文件成矩阵的形式。】
#若标签为浮点,直接使用下面一行即可
#data = np.loadtxt(open("iris.csv"),delimiter=",",skiprows=0)
#--------------------若标签为Striing,先将标签转化为浮点型----------------------------------------------------------
def iris_type(s):
class_label={b'Iris-setosa':0,b'Iris-versicolor':1,b'Iris-virginica':2}
return class_label[s]
#使用numpy中的loadtxt读入数据文件(csv格式的iris数据,也可直接换成txt格式)
filepath='iris_data.csv' # 数据文件路径
data=np.loadtxt(filepath,dtype=float,delimiter=',',converters={4:iris_type})
#-------------------------------------------------------------------------------------------------------------
#【对于矩阵而言,将矩阵倒数第一列之前的数值给了X(输入数据),将矩阵大最后一列的数值给了y(标签)】
X, y = data[:,:-1],data[:,-1]
#【利用train_test_split方法,将X,y随机划分为训练集(X_train),训练集标签(y_train),测试集(X_test),测试集标签(y_test),按训练集:测试集=7:3的概率划分,到此步骤,可以直接对数据进行处理】
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
#------------【此步骤,是为了将训练集与数据集的数据分别保存为CSV文件】----------------------------------------------
# #np.column_stack将两个矩阵进行组合连接,numpy.savetxt 将txt文件保存为csv格式的文件
# train= np.column_stack((X_train,y_train))
# np.savetxt('train_usual.csv',train, delimiter = ',')
#
# test = np.column_stack((X_test, y_test))
# np.savetxt('test_usual.csv', test, delimiter = ',')
#-----------------------------------------------------------------------------------------------------------------
#---------2.用sklearn库中自带的iris数据集----------------------------------------------------------------------------
#from sklearn.datasets import load_iris
# iris = load_iris()
# X_train, X_test, y_train, y_test = train_test_split(iris['data'], iris['target'], random_state=0)
#---------------------------------------------------------------------------------------------------------------
#---------3.用sklearn中自带的康辛州乳腺癌数据集------------------------------------------------------------------
# ###载入威斯康辛州乳腺癌数据
#from sklearn import datasets
# X,y = datasets.load_breast_cancer(return_X_y=True)
#
# ###分割训练集与测试集
# X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)
#------------------------------------------------------------------------------
###初始化随机森林分类器,这里为类别做平衡处理
clf = RandomForestClassifier(class_weight='balanced',random_state=1)
###返回由训练集训练成的模型对验证集预测的结果
result = clf.fit(X_train,y_train).predict(X_test)
###输出混淆矩阵
print('\n'+'混淆矩阵:')
print(con(y_test,result))
###输出测试准确率
print('\n'+'Accuracy:')
print(clf.score(X_test,y_test))
参考
- 周志华. 《机器学习》. 清华大学出版社.
- https://www.cnblogs.com/pinard/p/6156009.html
- https://www.cnblogs.com/fionacai/p/5894142.html
- http://www.cnblogs.com/maybe2030/p/4585705.html
- https://blog.csdn.net/qq547276542/article/details/78304454
- https://www.cnblogs.com/feffery/p/881050html