当前位置:   article > 正文

机器学习入门五(随机森林模型数据分类及回归)_随机森林模拟数据库

随机森林模拟数据库

目录

前言

一、随机森林模型简介

二、随机森林模型数据分类。

2.1简单阐述一下训练和测试数据

2.2创建模型并训练

2.3获取每个特征的重要性并可视化

2.4分析决策树的数量对模型精确程度的影响

2.5网格搜索确定最佳参数

三、随机森林模型回归

3.1波士顿房价数据集简介

3.2数据回归

3.3特征重要性可视化

3.4网格搜索确定最佳参数

总结

前言

        本文主要介绍随机森林模型,以及随机森林模型在分类任务和回归任务中的应用,这次采用的数据集分别为泰坦尼克号数据集和boston(波士顿房价sklearn可下载)数据集,前者用于分类任务,后者用于回归任务。


一、随机森林模型简介

        三个臭皮匠,顶个诸葛亮。假设我们存在一个学霸A,学渣B、C、D,让他们分别去考语文、数学、英语三门学科,学霸A每门都能考95分,而学渣B、C、D分别只擅长其中的一门,且他们都能将他们擅长的一门考到100分。那么让学渣B、C、D去考擅长的一门,然后汇总他们的成绩,最后的成绩自然就会比学霸A高。而随机森林模型其实就类似与B、C、D相加汇总成的一个比较好的模型。其根本原理还是通过所有单一的决策树投票决定,每个小模型都有出众的地方,然后汇总。

        随机森林是一种基于决策树的集成学习算法,它将多个决策树进行组合,采用多数投票的方式取得最终的预测结果。随机森林在决策树存在过拟合问题时能够有效地避免过拟合,同时还具有较高的准确率和鲁棒性。随机森林是一种全自动、非参数化的机器学习算法,可以用于分类和回归等多种任务,广泛应用于数据挖掘、信用评估、医学诊断、商品推荐等领域。

        不过随机森林模型也存在一定的缺点,那就是只能针对一般数据,不具备真正处理困难样本的能力。简单来说就是起点高,天花板低。

二、随机森林模型数据分类。

2.1简单阐述一下训练和测试数据

        分类模型我们已经采用作者在机器学习入门四(决策树)中已经将缺失值,和无用数据处理过的泰坦尼克号数据集。

        

2.2创建模型并训练

        直接从sklearn导入模型直接训练,其中我们要注意的就是OOB score(袋外分数),这是一个对测试集错的一个无偏估计,表示对随机森林模型未来性能的一个合理估计。分数越高模型月越理想,因为随机森林中的每颗树采用样本时是随机的,并不是采用所有样本。所以OOB是在模型构建后计算的,这个值跟所有的模型有关。

  1. #随机森林
  2. from sklearn.ensemble import RandomForestClassifier#导入随机森林模型
  3. from sklearn.metrics import accuracy_score#导入评估模型的精度
  4. print(x_train)
  5. rfc1 = RandomForestClassifier(n_estimators=100,max_depth=5,oob_score=True,class_weight="balanced",random_state=1)#实例化随机森林模型
  6. rfc1.fit(x_train,y_train)#训练模型
  7. ##输出训练集和验证集的预测精度
  8. rfc1_lab = rfc1.predict(x_train)#训练集的预测值
  9. rfc1_pre = rfc1.predict(x_test)#测试集的预测值
  10. print("随机森林的OOB score是",rfc1.oob_score_)#输出袋外分数,袋外分数是用袋外数据来评估模型的准确性,分数越高说明模型越好
  11. print("训练集上的精度:",accuracy_score(y_train,rfc1_lab))
  12. print("测试集上的精度:",accuracy_score(y_test,rfc1_pre))

        准确度来看,训练集为0.85,测试集为0.78。总的来说相对于前面介绍的监制钱的决策树模型,随机森林算法出现过拟合的情况比较小。 

2.3获取每个特征的重要性并可视化

        我们需要看下每个模型因素的重要性得分,这有利于我们认清在预测遇难者是否存活时,哪个因素起到的作用比较大

  1. #条形图可视化每一个变量的重要性
  2. import matplotlib.pyplot as plt
  3. import seaborn as sns
  4. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
  5. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
  6. plt.style.use('ggplot')
  7. importances = pd.DataFrame({'feature':x_train.columns,'importance':rfc1.feature_importances_})
  8. importances = importances.sort_values('importance',ascending=False)
  9. importances.plot(kind='barh',figsize=(12,8),color='orange',x='feature',y='importance',legend=False)
  10. plt.xlabel('重要性')
  11. plt.ylabel('')
  12. plt.title('随机森林模型分类器各因素重要性得分')
  13. plt.grid()
  14. plt.show()

        由此可见,性别和费用起到大作用。这与最后逃生的原则有关系,妇女和孩童优先。富商也存在优先级。

2.4分析决策树的数量对模型精确程度的影响

        首先先初步的进行观察,不妨令决策树从1-100的数量增加,横坐标为个数,纵坐标为oob分数

  1. oobsocre = []
  2. for i in range(1,101):
  3. rfc = RandomForestClassifier(n_estimators=i,n_jobs=-1,oob_score=True,random_state=90)
  4. rfc.fit(x_train,y_train)
  5. oobsocre.append(rfc.oob_score_)
  6. plt.plot(range(1,101),oobsocre)
  7. plt.show()

整体来说大概在15之后处于一个比较高的值。但是感觉不够,因此我们要画出测试集的精度

  1. oobsocre = []
  2. test_score = []
  3. numbers = np.arange(50,301,5)
  4. for i in numbers:
  5. rfc = RandomForestClassifier(n_estimators=i,n_jobs=-1,oob_score=True,random_state=90)
  6. rfc.fit(x_train,y_train)
  7. oobsocre.append(rfc.oob_score_)
  8. test_score.append(rfc.score(x_test,y_test))
  9. #可视化
  10. plt.figure(figsize=(20,5))
  11. plt.plot(numbers,oobsocre,"r-o",label="oob score")
  12. plt.plot(numbers,test_score,"r--s",label="测试集精度",color="blue")
  13. plt.grid()#添加网格
  14. plt.legend()#添加图例
  15. plt.xlabel("n_estimators/决策树的数量")
  16. plt.ylabel("精度")
  17. plt.title("随机森林的分类器树的数量与模型精度的关系")
  18. plt.show()

 


 我们可以发现随着书的数量增加,oob score的波定性较强,随着树的增加,测试集精度在一定范围内很稳定,呈现一条与x轴平行的直线。

2.5网格搜索确定最佳参数

        为了得到预测效果较好的随机森林模型,我们使用参数网格搜索的方法进行模型训练,参数为决策树的数量,决策树的最大深度,评估标准等等,作者因为考虑到参数越多,我们交叉验证网格搜索的时间就越长,所以作者控制了参数的个数和范围。但模型最后还是跑了接近10多分钟菜出图,有一点要注意,这里gs训练的时候采用了所有的数据集。

  1. ##网格搜索寻找合适模型
  2. rfg = RandomForestClassifier(random_state=90,oob_score=True)
  3. n_estimators = [100,200,500,800]#决策树的数量
  4. max_depth = [5,8,15,25,30]#最大深度
  5. class_weight = ["balanced","balanced_subsample"]#balanced_subsample是平衡的子样本
  6. criteria = ["gini","entropy"]#评价标准
  7. parameters = {"n_estimators":n_estimators,"max_depth":max_depth,"class_weight":class_weight,"criterion":criteria}
  8. GS = GridSearchCV(rfg,parameters,cv=5)#网格搜索,cv是交叉验证的折数此时为5
  9. GS.fit(x_train,y_train)
  10. print(GS.best_params_)#返回最优参数
  11. print(GS.best_score_)#返回最优分数

最优的训练分数为0.816左右,然后我们可视化出图像便于大家观察

  1. result = pd.DataFrame(GS.cv_results_)#返回所有模型的评估结果
  2. result = result.sort_values(by="mean_test_score",ascending=False)#按照平均值排序
  3. #可视化
  4. plt.figure(figsize=(20,5))
  5. plt.plot(range(result.shape[0]),result["mean_test_score"])
  6. plt.xticks(range(result.shape[0]),result["params"],rotation=90)#rotation=90将参数旋转90度
  7. plt.grid()
  8. plt.show()

 结果有些长,不过整体来看没什么问题。

        接着我们在看前十个优秀的模型  

  1. result = pd.DataFrame(GS.cv_results_)#返回所有模型的评估结果
  2. result = result.sort_values(by="mean_test_score",ascending=False)#按照平均值排序
  3. result.head(10)#返回前十个最优模型的评估结果

        这样子我们就可以直观的看到每个模型的每个数值,便于我们合理选择。 

三、随机森林模型回归

3.1波士顿房价数据集简介

        波士顿房价数据集是统计的20世纪70年代中期波士顿郊区房价的中位数,统计了当时教区部分的犯罪率、房产税等共计13个指标,统计出房价,试图能找到那些指标与房价的关系。本例子明显的是属于回归模型的案例。在数据集中包含506组数据,其中404是训练样本,剩下的102组数据作为验证样本。

        

3.2数据回归

        这个模型大概跑了5分钟左右,然后根据

  1. #随机森林模型数据回归
  2. from sklearn.datasets import load_boston
  3. from sklearn.model_selection import cross_val_score
  4. from sklearn.ensemble import RandomForestRegressor
  5. import pandas as pd
  6. import numpy as np
  7. import matplotlib.pyplot as plt
  8. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
  9. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
  10. boston = load_boston()
  11. x = boston.data
  12. y = boston.target
  13. x.shape
  14. y.shape
  15. #实例化模型
  16. rfr = RandomForestRegressor(n_estimators=100,random_state=1)
  17. #交叉验证
  18. cross_val_score(rfr,x,y,cv=10,scoring="neg_mean_squared_error")#scoring="neg_mean_squared_error"是评价指标,均方误差
  19. cross_val_score(rfr,x,y,cv=10,scoring="r2")#scoring="r2"是评价指标,R2
  20. #可视化
  21. score = []
  22. for i in range(1,101):
  23. rfr = RandomForestRegressor(n_estimators=i,n_jobs=-1,random_state=1)
  24. score.append(cross_val_score(rfr,x,y,cv=10,scoring="r2").mean())
  25. plt.plot(range(1,101),score)

         

效果一般,一般来说越接近1效果越好,可以这次模型对于波士顿房价来说还不够。

3.3特征重要性可视化

  1. #重要性预测
  2. rfr = RandomForestRegressor(n_estimators=100,random_state=1)
  3. rfr.fit(x,y)
  4. rfr.feature_importances_
  5. importances = pd.DataFrame({"feature":boston.feature_names,"importance":rfr.feature_importances_})
  6. importances = importances.sort_values("importance",ascending=False)
  7. importances.plot(kind="barh",figsize=(12,8),color="green",x="feature",y="importance",legend=False)
  8. plt.xlabel("重要性")
  9. plt.ylabel("")
  10. plt.title("随机森林模型各因素重要性得分")
  11. plt.grid()
  12. plt.show()

   

 RM表示每栋房子的房间,可见这个条件对房价的影响很大。其实简单来说跟现在一样,多少面积算的。

3.4网格搜索确定最佳参数

  1. #网格搜索
  2. rfr = RandomForestRegressor(random_state=1)#实例化模型
  3. n_estimators = [100,200,500,800]#决策树的数量
  4. max_depth = [5,8,15,25,30]#最大深度
  5. criteria = ["mse","mae"]#mse是均方误差,mae是平均绝对误差
  6. parameters = {"n_estimators":n_estimators,"max_depth":max_depth,"criterion":criteria}#参数
  7. GS = GridSearchCV(rfr,parameters,cv=5)#网格搜索
  8. GS.fit(x,y)#训练模型
  9. print(GS.best_params_)#返回最优参数
  10. print(GS.best_score_)#返回最优分数
  11. result = pd.DataFrame(GS.cv_results_)#返回所有模型的评估结果
  12. result = result.sort_values(by="mean_test_score",ascending=False)#按照平均值排序
  13. result.head(10)#返回前十个最优模型的评估结果
  14. #可视化
  15. plt.figure(figsize=(20,5))#设置画布大小
  16. plt.plot(range(result.shape[0]),result["mean_test_score"])#画图
  17. plt.xticks(range(result.shape[0]),result["params"],rotation=90)#rotation=90将参数旋转90度
  18. plt.grid()#添加网格
  19. plt.show()#显示图像

        其实训练效果并不好,从得分0.65就可以看出来了,但经过网格搜索发现最好的参数是{'criterion': 'mse', 'max_depth': 25, 'n_estimators': 800}。作者手头暂时没有找到比较适合随机森林回归的数据集。但方法就是这样,该方法适用于每个数据集,所以大家可以用不同的算法去玩分类和回归,总会找到一个比较合适的模型的。


总结

        总的来说就是写了一篇关于随机森林模型用法的文章,其实就是我们用计算机通过数学模型玩数据,选择合理的模型得出正确的结论。还是要说,模型理解好,参数调好。今天分享的就差不多这样了,希望大家支持一下哦!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/94443
推荐阅读
相关标签
  

闽ICP备14008679号