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

目录

前言

一、随机森林模型简介

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

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简单阐述一下训练和测试数据

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

        机器学习入门五(随机森林模型数据分类及回归)_第1张图片

2.2创建模型并训练

        直接从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。总的来说相对于前面介绍的监制钱的决策树模型,随机森林算法出现过拟合的情况比较小。 

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

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

#条形图可视化每一个变量的重要性
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()

机器学习入门五(随机森林模型数据分类及回归)_第2张图片

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

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

        首先先初步的进行观察,不妨令决策树从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()

机器学习入门五(随机森林模型数据分类及回归)_第3张图片

整体来说大概在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()

 机器学习入门五(随机森林模型数据分类及回归)_第4张图片


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

2.5网格搜索确定最佳参数

        为了得到预测效果较好的随机森林模型,我们使用参数网格搜索的方法进行模型训练,参数为决策树的数量,决策树的最大深度,评估标准等等,作者因为考虑到参数越多,我们交叉验证网格搜索的时间就越长,所以作者控制了参数的个数和范围。但模型最后还是跑了接近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_)#返回最优分数

机器学习入门五(随机森林模型数据分类及回归)_第5张图片

最优的训练分数为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()

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

机器学习入门五(随机森林模型数据分类及回归)_第6张图片

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

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

机器学习入门五(随机森林模型数据分类及回归)_第7张图片

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

三、随机森林模型回归

3.1波士顿房价数据集简介

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

        机器学习入门五(随机森林模型数据分类及回归)_第8张图片

3.2数据回归

        这个模型大概跑了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)

        机器学习入门五(随机森林模型数据分类及回归)_第9张图片 

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

3.3特征重要性可视化

#重要性预测
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()

   机器学习入门五(随机森林模型数据分类及回归)_第10张图片

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

3.4网格搜索确定最佳参数

#网格搜索
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()#显示图像

机器学习入门五(随机森林模型数据分类及回归)_第11张图片

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


总结

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

你可能感兴趣的:(机器学习入门,机器学习,随机森林,分类)