机器学习-随机森林-分类
一、机器学习之随机森林
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)#每一个样本被分到各个标签的概率
可以自己尝试用泰坦尼克号 数据进行尝试
上一篇: 面试题37:两个链表的第一个公共结点
下一篇: VS2015 GDAL 环境搭建