随机森林分类和决策树的对比

%matplotlib inline
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine

wine = load_wine()
wine.data  # 特征矩阵,不能为一维,要和标签分开导入
wine.target  # 标签,必须为一维,要和特征矩阵分开导入

from sklearn.model_selection import train_test_split
Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine.data,wine.target,test_size=0.3)

clf = DecisionTreeClassifier(random_state=0) # 实例化
rfc = RandomForestClassifier(random_state=0) # 实例化
clf = clf.fit(Xtrain,Ytrain)   # 训练集带入实例化后的模型去进行训练,使用的接口是fit
rfc = rfc.fit(Xtrain,Ytrain)   # 训练集带入实例化后的模型去进行训练,使用的接口是fit
score_c = clf.score(Xtest,Ytest)# 使用其他接口score将测试集导入我们训练好的模型,去获取我们希望获取的结果(score、Y_test)
score_r = rfc.score(Xtest,Ytest)# 使用其他接口score将测试集导入我们训练好的模型,去获取我们希望获取的结果(score、Y_test)

print('Single Tree:{}'.format(score_c) # format用于转换数据类型
     ,'Random Forest:{}'.format(score_r))

交叉验证

from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
rfc = RandomForestClassifier(n_estimators=25) #n_estimators确定森林中树的数目
rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10)
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf,wine.data,wine.target,cv=10)
plt.plot(range(1,11),rfc_s,label='RandomForest')# 一个plt.plot里面只能有一个标签
plt.plot(range(1,11),clf_s,label='DecisionTree')
plt.legend()

利用for循环对比随机森林分类和决策树,代码更简单

label = 'RandomForest'
for model in [RandomForestClassifier(n_estimators=25),DecisionTreeClassifier()]:
    score = cross_val_score(model,wine.data,wine.target,cv=10)
    print('{}:'.format(label)),print(score.mean())
    plt.plot(range(1,11),score,label = label)
    plt.legend()
    label = 'DecisionTree'

找出随机森林分类中多少棵树效果最好

superpa = []
for i in range(200):
    rfc = RandomForestClassifier(n_estimators=i+1,n_jobs = -1)  # n_jobs决定了使用的CPU内核个数,n_jobs = -1表示使用全部的CPU
    rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
    superpa.append(rfc_s)
print(max(superpa),superpa.index(max(superpa))) # 0.9888888888888889 35,35+1棵树效果最好
plt.figure(figsize =[20,5])
plt.plot(range(1,201),superpa)

用代码表示组合求和的公式

import numpy as np
from scipy.special import comb
np.array([comb(25,i)*(0.2**i)*((1-0.2)**(25-i)) for i in range(13,26)]).sum()

for循环查看森林中树的随机值

for i in range(len(rfc.estimators_)):
    print(rfc.estimators_[i].random_state)  # 查看随机森林中所有树的随机值

抽样再放回,会有37%的数据没有被抽到,这些数据称为袋外数据

rfc = RandomForestClassifier(n_estimators=25,oob_score=True) # oob_score=True用袋外数据来进行测试
rfc = rfc.fit(wine.data,wine.target)   # 无需划分训练集和测试集
rfc.oob_score_  # 袋外数据测试结果

随机森林分类的接口

rfc.score(Xtest,Ytest) # 测试集分数
rfc.feature_importances_  # 得出特征的重要性数值
rfc.apply(Xtest) # 样本在这棵树中所在的叶子节点的索引
rfc.predict(Xtest) # 返回对测试集预测的标签,此时为预测值,Ytest中为真实值
rfc.predict_proba(Xtest) # 样本在这棵树中被分类到各个标签的概率

注意:当基分类器的误差率小于0.5,即准确率大于0.5时,集成的效果是比基分类器要好的。相反,当基分类器的误差率大于0.5,袋装的集成算法就失效了,所以在使用随机森林之前,一定要检查,用来组成随机森林的分类树们是否都有至少50%的预测准确率。

猜你喜欢

转载自blog.csdn.net/xiaokeaiuiya/article/details/108865267
今日推荐