欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习-随机森林-分类

程序员文章站 2022-07-14 14:51:43
...

一、机器学习之随机森林

1.1 集成算法概述
集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个模型,集成所有模型的建模结果。基本上所有的机器学习领域都可以看到集成学习的身影,在现实中集成学习也有相当大的作用,它可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性。在现在的各种算法竞赛中,随机森林,梯度提升树(GBDT),Xgboost等集成算法的身影也随处可见,可见其效果之好,应用之广。
1.1.1sklearn的集成算法模块ensemble
机器学习-随机森林-分类
2 RandomForestClassifier
class sklearn.ensemble.RandomForestClassifier (n_estimators=’10’, 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)
随机森林是非常具有代表性的Bagging集成算法,它的所有基评估器都是决策树,分类树组成的森林就叫做随机森林分类器,回归树所集成的森林就叫做随机森林回归器。这一节主要讲解RandomForestClassifier,随机森林分类器。

机器学习-随机森林-分类

`单个决策树的准确率越高,随机森林的准确率也会越高,因为装袋法是依赖于平均值或
者少数服从多数原则来决定集成的结果的

机器学习-随机森林-分类

**## 二、开始建立随机森林吧’

建模流程
#开始实例化
#训练集带入实例化的模型进行训练,使用的接口是fit
#使用其他接口将测试集导入我们训练好的模型,获得我们希望的结果(score,y_test等)
**
2.1首先导入我们需要的包

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

2.2导入需要的数据集

wine = load_wine()
wine.data
wine.target

2.3.模型的基本流程

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)
rfc = rfc.fit(Xtrain,Ytrain)
score_c = clf.score(Xtest,Ytest)
score_r = rfc.score(Xtest,Ytest)
print("Single Tree:{}".format(score_c)
     ,"Random Forest:{}".format(score_r)
     )

结果:

single tree:0.8518518518518519
random forest:0.9629629629629629

结论:从结果可以看出随机森林的结果要好于单棵树的结果。
2.44. 画出随机森林和决策树在一组交叉验证下的效果对比

#目的是带大家复习一下交叉验证
#交叉验证:是数据集划分为n分,依次取每一份做测试集,每n-1份做训练集,多次训练模型以观测模型稳定性的方法
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
rfc = RandomForestClassifier(n_estimators=25)
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(range(1,11),clf_s,label = "Decision Tree")
plt.legend()
plt.show()
#====================一种更加有趣也更简单的写法===================#
"""
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"
"""

结果图如下所示:
机器学习-随机森林-分类
在图中也有明显的结果就是随机森林的而结果会高于决策树的结果。
2.55. 画出随机森林和决策树在十组交叉验证下的效果对比

rfc_l = []
clf_l = []
for i in range(10):
    rfc = RandomForestClassifier(n_estimators=25)
    rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
    rfc_l.append(rfc_s)
    clf = DecisionTreeClassifier()
    clf_s = cross_val_score(clf,wine.data,wine.target,cv=10).mean()
    clf_l.append(clf_s)
    
plt.plot(range(1,11),rfc_l,label = "Random Forest")
plt.plot(range(1,11),clf_l,label = "Decision Tree")
plt.legend()
plt.show()
#是否有注意到,单个决策树的波动轨迹和随机森林一致?
#再次验证了我们之前提到的,单个决策树的准确率越高,随机森林的准确率也会越高

结果:
机器学习-随机森林-分类
2.6n_的学习曲线

superpa = []
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(figsize=[20,5])
plt.plot(range(1,201),superpa)
plt.show()

请思考一下:
随机森林用了什么方法,来保证集成的效果一定好于单个分类器?

机器学习-随机森林-分类
机器学习-随机森林-分类

rfc = RandomForestClassifier(n_estimators=20,random_state=2)
rfc = rfc.fit(x_train, y_train)

rfc.estimators_[0].random_state #表示查看第一棵树的random_state
rfc.estimators_[0].max_depth #表示查看第一棵树的最大深度
rfc.estimators_#表示查看所有的树
rfc.estimators_[0]#表示查看第一棵树的相关信息


#随机森林的重要属性之一:estimators,查看森林中树的状况
rfc.estimators_[0].random_state
#下面写一个循环,查看每一棵树的属性
for i in range(len(rfc.estimators_)):
    print(rfc.estimators_[i].random_state)
###注意在rfc = RandomForestClassifier(n_estimators=20,random_state=2)如果不加上random_state=2
#输出的各个树的random_state会发生变化,但是输入random_state=2就不会发生变化了

机器学习-随机森林-分类

机器学习-随机森林-分类

#无需划分训练集和测试集
rfc = RandomForestClassifier(n_estimators=25,oob_score=True)
rfc = rfc.fit(wine.data,wine.target)
#重要属性oob_score_
rfc.oob_score_

对于随机森林的建模的过程我们可以有两个选择
(1)将数据划分为测试集和训练集,对模型进行训练等操作
(2)不划分测试集和训练集直接用袋内数据,在对随机森林实例化的时候,我们可以将 oob_score=True设置为True

2.2重要的接口和属性

2.2重要属性和接口¶
n_estimators,random_state,boostrap和oobscore这四个参数帮助大家了解了袋装法的基本流程和重要概念。同时,我们还介绍了.estimators 和 .oobscore 这两个重要属性。除了这两个属性之外,作为树模型的集成算法,随机森林自然有.feature_importances这个属性。 了解各个参数的含义随机森林的接口与决策树完全一致,因此依然有四个常用接口:apply, fit, predict,score。除此之外,还需要注意随机森林的predict_proba接口,这个接口返回每个测试样本对应的被分到每一类标签的概率,标签有几个分类就返回几个概率。如果是二分类问题,则predict_proba返回的数值大于0.5的,被分为1,小于0.5的,被分为0。传统的随机森林是利用袋装法中的规则,平均或少数服从多数来决定集成的结果,而sklearn中的随机森林是平均每个样本对应的predict_proba返回的概率,得到一个平均概率,从而决定测试样本的分类。

#大家可以分别取尝试一下这些属性和接口
rfc = RandomForestClassifier(n_estimators=25)
rfc = rfc.fit(x_train, y_train)
rfc.score(x_test,y_test)#准确率
rfc.feature_importances_#数值越大特征重要性越大可以用zip将特征和重要性进行整合
rfc.apply(x_test)#返回数据集中的每一个样本在每一棵树中的叶子节点的索引
rfc.predict(x_test)
rfc.predict_proba(x_test)#每一个样本被分到各个标签的概率

可以自己尝试用泰坦尼克号 数据进行尝试