赞
踩
目录
本文主要介绍随机森林模型,以及随机森林模型在分类任务和回归任务中的应用,这次采用的数据集分别为泰坦尼克号数据集和boston(波士顿房价sklearn可下载)数据集,前者用于分类任务,后者用于回归任务。
三个臭皮匠,顶个诸葛亮。假设我们存在一个学霸A,学渣B、C、D,让他们分别去考语文、数学、英语三门学科,学霸A每门都能考95分,而学渣B、C、D分别只擅长其中的一门,且他们都能将他们擅长的一门考到100分。那么让学渣B、C、D去考擅长的一门,然后汇总他们的成绩,最后的成绩自然就会比学霸A高。而随机森林模型其实就类似与B、C、D相加汇总成的一个比较好的模型。其根本原理还是通过所有单一的决策树投票决定,每个小模型都有出众的地方,然后汇总。
随机森林是一种基于决策树的集成学习算法,它将多个决策树进行组合,采用多数投票的方式取得最终的预测结果。随机森林在决策树存在过拟合问题时能够有效地避免过拟合,同时还具有较高的准确率和鲁棒性。随机森林是一种全自动、非参数化的机器学习算法,可以用于分类和回归等多种任务,广泛应用于数据挖掘、信用评估、医学诊断、商品推荐等领域。
不过随机森林模型也存在一定的缺点,那就是只能针对一般数据,不具备真正处理困难样本的能力。简单来说就是起点高,天花板低。
分类模型我们已经采用作者在机器学习入门四(决策树)中已经将缺失值,和无用数据处理过的泰坦尼克号数据集。
直接从sklearn导入模型直接训练,其中我们要注意的就是OOB score(袋外分数),这是一个对测试集错的一个无偏估计,表示对随机森林模型未来性能的一个合理估计。分数越高模型月越理想,因为随机森林中的每颗树采用样本时是随机的,并不是采用所有样本。所以OOB是在模型构建后计算的,这个值跟所有的模型有关。
- #随机森林
- from sklearn.ensemble import RandomForestClassifier#导入随机森林模型
- from sklearn.metrics import accuracy_score#导入评估模型的精度
- print(x_train)
- rfc1 = RandomForestClassifier(n_estimators=100,max_depth=5,oob_score=True,class_weight="balanced",random_state=1)#实例化随机森林模型
- rfc1.fit(x_train,y_train)#训练模型
- ##输出训练集和验证集的预测精度
- rfc1_lab = rfc1.predict(x_train)#训练集的预测值
- rfc1_pre = rfc1.predict(x_test)#测试集的预测值
- print("随机森林的OOB score是",rfc1.oob_score_)#输出袋外分数,袋外分数是用袋外数据来评估模型的准确性,分数越高说明模型越好
- print("训练集上的精度:",accuracy_score(y_train,rfc1_lab))
- print("测试集上的精度:",accuracy_score(y_test,rfc1_pre))
准确度来看,训练集为0.85,测试集为0.78。总的来说相对于前面介绍的监制钱的决策树模型,随机森林算法出现过拟合的情况比较小。
我们需要看下每个模型因素的重要性得分,这有利于我们认清在预测遇难者是否存活时,哪个因素起到的作用比较大
- #条形图可视化每一个变量的重要性
- import matplotlib.pyplot as plt
- import seaborn as sns
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
- plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
- plt.style.use('ggplot')
-
- importances = pd.DataFrame({'feature':x_train.columns,'importance':rfc1.feature_importances_})
- importances = importances.sort_values('importance',ascending=False)
- importances.plot(kind='barh',figsize=(12,8),color='orange',x='feature',y='importance',legend=False)
- plt.xlabel('重要性')
- plt.ylabel('')
- plt.title('随机森林模型分类器各因素重要性得分')
- plt.grid()
- plt.show()
由此可见,性别和费用起到大作用。这与最后逃生的原则有关系,妇女和孩童优先。富商也存在优先级。
首先先初步的进行观察,不妨令决策树从1-100的数量增加,横坐标为个数,纵坐标为oob分数
- oobsocre = []
- for i in range(1,101):
- rfc = RandomForestClassifier(n_estimators=i,n_jobs=-1,oob_score=True,random_state=90)
- rfc.fit(x_train,y_train)
- oobsocre.append(rfc.oob_score_)
- plt.plot(range(1,101),oobsocre)
- plt.show()
整体来说大概在15之后处于一个比较高的值。但是感觉不够,因此我们要画出测试集的精度
- oobsocre = []
- test_score = []
- numbers = np.arange(50,301,5)
- for i in numbers:
- rfc = RandomForestClassifier(n_estimators=i,n_jobs=-1,oob_score=True,random_state=90)
- rfc.fit(x_train,y_train)
- oobsocre.append(rfc.oob_score_)
- test_score.append(rfc.score(x_test,y_test))
- #可视化
- plt.figure(figsize=(20,5))
- plt.plot(numbers,oobsocre,"r-o",label="oob score")
- plt.plot(numbers,test_score,"r--s",label="测试集精度",color="blue")
- plt.grid()#添加网格
- plt.legend()#添加图例
- plt.xlabel("n_estimators/决策树的数量")
- plt.ylabel("精度")
- plt.title("随机森林的分类器树的数量与模型精度的关系")
- plt.show()
我们可以发现随着书的数量增加,oob score的波定性较强,随着树的增加,测试集精度在一定范围内很稳定,呈现一条与x轴平行的直线。
为了得到预测效果较好的随机森林模型,我们使用参数网格搜索的方法进行模型训练,参数为决策树的数量,决策树的最大深度,评估标准等等,作者因为考虑到参数越多,我们交叉验证网格搜索的时间就越长,所以作者控制了参数的个数和范围。但模型最后还是跑了接近10多分钟菜出图,有一点要注意,这里gs训练的时候采用了所有的数据集。
- ##网格搜索寻找合适模型
- rfg = RandomForestClassifier(random_state=90,oob_score=True)
- n_estimators = [100,200,500,800]#决策树的数量
- max_depth = [5,8,15,25,30]#最大深度
- class_weight = ["balanced","balanced_subsample"]#balanced_subsample是平衡的子样本
- criteria = ["gini","entropy"]#评价标准
- parameters = {"n_estimators":n_estimators,"max_depth":max_depth,"class_weight":class_weight,"criterion":criteria}
- GS = GridSearchCV(rfg,parameters,cv=5)#网格搜索,cv是交叉验证的折数此时为5
- GS.fit(x_train,y_train)
- print(GS.best_params_)#返回最优参数
- print(GS.best_score_)#返回最优分数
最优的训练分数为0.816左右,然后我们可视化出图像便于大家观察
- result = pd.DataFrame(GS.cv_results_)#返回所有模型的评估结果
- result = result.sort_values(by="mean_test_score",ascending=False)#按照平均值排序
-
- #可视化
- plt.figure(figsize=(20,5))
- plt.plot(range(result.shape[0]),result["mean_test_score"])
- plt.xticks(range(result.shape[0]),result["params"],rotation=90)#rotation=90将参数旋转90度
- plt.grid()
- plt.show()
结果有些长,不过整体来看没什么问题。
接着我们在看前十个优秀的模型
- result = pd.DataFrame(GS.cv_results_)#返回所有模型的评估结果
- result = result.sort_values(by="mean_test_score",ascending=False)#按照平均值排序
- result.head(10)#返回前十个最优模型的评估结果
这样子我们就可以直观的看到每个模型的每个数值,便于我们合理选择。
波士顿房价数据集是统计的20世纪70年代中期波士顿郊区房价的中位数,统计了当时教区部分的犯罪率、房产税等共计13个指标,统计出房价,试图能找到那些指标与房价的关系。本例子明显的是属于回归模型的案例。在数据集中包含506组数据,其中404是训练样本,剩下的102组数据作为验证样本。
这个模型大概跑了5分钟左右,然后根据
- #随机森林模型数据回归
-
- from sklearn.datasets import load_boston
- from sklearn.model_selection import cross_val_score
- from sklearn.ensemble import RandomForestRegressor
- import pandas as pd
- import numpy as np
- import matplotlib.pyplot as plt
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
- plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
-
- boston = load_boston()
- x = boston.data
- y = boston.target
- x.shape
- y.shape
- #实例化模型
- rfr = RandomForestRegressor(n_estimators=100,random_state=1)
- #交叉验证
- cross_val_score(rfr,x,y,cv=10,scoring="neg_mean_squared_error")#scoring="neg_mean_squared_error"是评价指标,均方误差
- cross_val_score(rfr,x,y,cv=10,scoring="r2")#scoring="r2"是评价指标,R2
- #可视化
- score = []
- for i in range(1,101):
- rfr = RandomForestRegressor(n_estimators=i,n_jobs=-1,random_state=1)
- score.append(cross_val_score(rfr,x,y,cv=10,scoring="r2").mean())
- plt.plot(range(1,101),score)
效果一般,一般来说越接近1效果越好,可以这次模型对于波士顿房价来说还不够。
- #重要性预测
- rfr = RandomForestRegressor(n_estimators=100,random_state=1)
- rfr.fit(x,y)
- rfr.feature_importances_
- importances = pd.DataFrame({"feature":boston.feature_names,"importance":rfr.feature_importances_})
- importances = importances.sort_values("importance",ascending=False)
- importances.plot(kind="barh",figsize=(12,8),color="green",x="feature",y="importance",legend=False)
- plt.xlabel("重要性")
- plt.ylabel("")
- plt.title("随机森林模型各因素重要性得分")
- plt.grid()
- plt.show()
RM表示每栋房子的房间,可见这个条件对房价的影响很大。其实简单来说跟现在一样,多少面积算的。
- #网格搜索
- rfr = RandomForestRegressor(random_state=1)#实例化模型
- n_estimators = [100,200,500,800]#决策树的数量
- max_depth = [5,8,15,25,30]#最大深度
- criteria = ["mse","mae"]#mse是均方误差,mae是平均绝对误差
- parameters = {"n_estimators":n_estimators,"max_depth":max_depth,"criterion":criteria}#参数
- GS = GridSearchCV(rfr,parameters,cv=5)#网格搜索
- GS.fit(x,y)#训练模型
- print(GS.best_params_)#返回最优参数
- print(GS.best_score_)#返回最优分数
- result = pd.DataFrame(GS.cv_results_)#返回所有模型的评估结果
- result = result.sort_values(by="mean_test_score",ascending=False)#按照平均值排序
- result.head(10)#返回前十个最优模型的评估结果
-
- #可视化
- plt.figure(figsize=(20,5))#设置画布大小
- plt.plot(range(result.shape[0]),result["mean_test_score"])#画图
- plt.xticks(range(result.shape[0]),result["params"],rotation=90)#rotation=90将参数旋转90度
- plt.grid()#添加网格
- plt.show()#显示图像
其实训练效果并不好,从得分0.65就可以看出来了,但经过网格搜索发现最好的参数是{'criterion': 'mse', 'max_depth': 25, 'n_estimators': 800}。作者手头暂时没有找到比较适合随机森林回归的数据集。但方法就是这样,该方法适用于每个数据集,所以大家可以用不同的算法去玩分类和回归,总会找到一个比较合适的模型的。
总的来说就是写了一篇关于随机森林模型用法的文章,其实就是我们用计算机通过数学模型玩数据,选择合理的模型得出正确的结论。还是要说,模型理解好,参数调好。今天分享的就差不多这样了,希望大家支持一下哦!
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。