# sklearn学习记录(菜菜——随机森林RandomForestClassifier)
sklearn学习记录(菜菜——随机森林RandomForestClassifier)
- # sklearn学习记录(菜菜——随机森林RandomForestClassifier)
- 一、准备数据
- 二、 随机森林和决策树对比
- 三、随机森林参数n_estimators的学习曲线
- 四、随机森林中的参数random_state
- 五、其他随机性bootstrap & oob_score
一、准备数据
#导入库
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_wine
'''
ensemble:sklearn中的集成算法模块
'''
'''
随机森林的本质是一种装袋集成算法(bagging),
装袋集成算法是对基评估器的预测结果进行平均或用多数表决原则来决定集成评估器的结果。
'''
from sklearn.ensemble import RandomForestClassifier
#导入需要的数据集
wine=load_wine()
二、 随机森林和决策树对比
#建模
from sklearn.model_selection import train_test_split
xtrain,xtest,ytrain,ytest=train_test_split(wine.data,wine.target,test_size=0.3)
dtc=DecisionTreeClassifier(random_state=0)
rfc=RandomForestClassifier(random_state=0)
dtc=dtc.fit(xtrain,ytrain)
rfc=rfc.fit(xtrain,ytrain)
score_dtc=dtc.score(xtest,ytest)
score_rfc=rfc.score(xtest,ytest)
print("Single Tree:{}".format(score_dtc),
"Random Forest:{}".format(score_rfc)
)
#画出随机森林和决策树在一组交叉验证下的效果对比
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
'''
n_estimators:这是森林中树木的数量,即基评估器的数量。
这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。
但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,
并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。
对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。
'''
#一次
rfc=RandomForestClassifier(n_estimators=25)
rfc_s=cross_val_score(rfc,wine.data,wine.target,cv=10)
dtc=DecisionTreeClassifier()
dtc_s=cross_val_score(dtc,wine.data,wine.target,cv=10)
plt.plot(range(1,11),rfc_s,label="RandomForestClassifier")
plt.plot(range(1,11),dtc_s,label="DecisionTreeClassifier")
plt.legend()
plt.show()
#十次
rs=[]
ds=[]
for i in range(10):
rfc=RandomForestClassifier(n_estimators=25)
rfc_s=cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
rs.append(rfc_s)
dtc=DecisionTreeClassifier()
dtc_s=cross_val_score(dtc,wine.data,wine.target,cv=10).mean()
ds.append(dtc_s)
plt.plot(range(1,11),rs,label="RandomForestClassifier")
plt.plot(range(1,11),ds,label="DecisionTreeClassifier")
plt.legend()
plt.show()
三、随机森林参数n_estimators的学习曲线
#n_estimators的学习曲线
superpa=[]
'''
n_estimators: 表示森林中树的数量,即随机森林的规模。
增加树的数量通常可以提高模型的性能,但也会增加计算成本。
n_jobs: 指定拟合和预测时使用的 CPU 内核数。
设置为 -1 表示使用所有可用的内核。
这对于加速训练和预测过程是有帮助的,特别是当树的数量较多时。
'''
for i in range(200):
rfc=RandomForestClassifier(n_estimators=i+1,n_jobs=-1)
rfc_s=cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
superpa.append(rfc_s)
print(max(superpa),superpa.index(max(superpa)))
'''
plt.figure():用于创建新图形
参数:
num: 图形的编号。如果不指定,将自动分配一个编号。
可以通过 plt.figure(num=1) 来指定编号为1的图形。
figsize: 一个包含两个元素的元组或列表,分别表示图形的宽度和高度(单位可以是英寸、厘米等)。
例如,figsize=(8, 6) 表示图形的宽度为8,高度为6。
dpi: 图形的分辨率(每英寸点数)。默认为100。
例如,dpi=150 表示每英寸包含150个点。
facecolor: 图形的背景颜色。
可以是颜色名称(如 'red')、RGB 元组(如 (1, 0, 0))或十六进制字符串(如 '#FF0000')。
edgecolor: 图形边框的颜色。
frameon: 是否显示图形的框架。默认为True。
clear: 如果为True,则在创建图形之前关闭所有现有的图形。
'''
plt.figure(figsize=[20,5])
plt.plot(range(1,201),superpa)
plt.show()
四、随机森林中的参数random_state
#随机森林中的random_state
'''
随机森林中其实也有random_state,用法和分类树中相似,
只不过在分类树中,一个random_state只控制生成一棵树,
而随机森林中的random_state控制的是生成森林的模式,而非让一个森林中只有一棵树。
'''
rfc=RandomForestClassifier(n_estimators=20,random_state=2)
rfc=rfc.fit(xtrain,ytrain)
'''
estimators_ :表示随机森林中的各个决策树模型的属性
通过访问 estimators_,你可以对每棵树进行操作,如查看树的结构、特征重要性等
'''
rfc.estimators_[0].random_state
for i in range(len(rfc.estimators_)):
print(rfc.estimators_[i].random_state)
'''
当random_state固定时,随机森林中生成是一组固定的树,但每棵树依然是不一致的,
这是用”随机挑选特征进行分枝“的方法得到的随机性。
并且我们可以证明,当这种随机性越大的时候,袋装法的效果一般会越来越好。
用袋装法集成时,基分类器应当是相互独立的,是不相同的。
'''
五、其他随机性bootstrap & oob_score
#bootstrap & oob_score
'''
bootstrap:是用来控制抽样技术的参数
bootstrap参数默认True,代表采用这种有放回的随机抽样技术。
通常,这个参数不会被我们设置为False
然而有放回抽样也会有自己的问题。
由于是有放回,一些样本可能在同一个自助集中出现多次,而其他一些却可能被忽略。
'''
'''
oob:训练数据被浪费掉,没有参与建模,这些数据被称为袋外数据(out of bag data,简写为oob)。
除了我们最开始就划分好的测试集之外,这些数据也可以被用来作为集成算法的测试集。
也就是说,在使用随机森林时,我们可以不划分测试集和训练集,
只需要用袋外数据来测试我们的模型即可。
当然,这也不是绝对的,当n和n_estimators都不够大的时候,
很可能就没有数据掉落在袋外,自然也就无法使用oob数据来测试模型了。
如果希望用袋外数据来测试,则需要在实例化时就将oob_score这个参数调整为True,
训练完毕之后,我们可以用随机森林的另一个重要属性:
oob_score_来查看我们的在袋外数据上测试的结果。
'''
#使用oob_score
rfc=RandomForestClassifier(n_estimators=25,oob_score=True)
rfc=rfc.fit(wine.data,wine.target)
rfc.oob_score_