使用两种集合算法(正向激励和随机森林)去预测小黄车的使用次数

集合算法

在开始预测之前先介绍一下集合算法以及相关的
根据多个不同模型给出的预测结果,利用平均(回归)或者投票(分类)的方法,得出最终预测结果。

基于决策树的集合算法,就是按照某种规则,构建多棵彼此不同的决策树模型,分别给出针对未知样本的预测结果,最后通过平均或投票得到相对综合的结论。

正向激励

首先为样本矩阵中的样本随机分配初始权重,由此构建一棵带有权重的决策树,在由该决策树提供预测输出时,通过加权平均或者加权投票的方式产生预测值。将训练样本代入模型,预测其输出,对那些预测值与实际值不同的样本,提高其权重,由此形成第二棵决策树。重复以上过程,构建出不同权重的若干棵决策树。这个过程就好像是你做的越不好就越鼓励你去做,直到你做好为止,和它的名字很配,正向激励

# 创建基于决策树的正向激励回归器模型
model = se.AdaBoostRegressor(
	st.DecisionTreeRegressor(max_depth=4), n_estimators=400, random_state=7)
# 训练模型
model.fit(train_x, train_y)
# 测试模型
pred_test_y = model.predict(test_x)
print(sm.r2_score(test_y, pred_test_y))

特征重要性

作为决策树模型训练过程的副产品,根据每个特征划分子表前后的信息熵减少量就标志了该特征的重要程度,此即为该特征重要性指标。训练得到的模型对象提供了属性:feature_importances_来存储每个特征的重要性。

获取样本矩阵特征重要性属性:

model.fit(train_x, train_y)
fi = model.feature_importances_

自助聚合

每次从总样本矩阵中以有放回抽样的方式随机抽取部分样本构建决策树,这样形成多棵包含不同训练样本的决策树,以削弱某些强势样本对模型预测结果的影响,提高模型的泛化特性

随机森林

在自助聚合的基础上,每次构建决策树模型时,不仅随机选择部分样本,而且还随机选择部分特征,这样的集合算法,不仅规避了强势样本对预测结果的影响,而且也削弱了强势特征的影响,使模型的预测能力更加泛化。

随机森林相关API:

import sklearn.ensemble as se
# 随机森林回归模型	(属于集合算法的一种)
# max_depth:决策树最大深度10
# n_estimators:构建1000棵决策树,训练模型
# min_samples_split: 子表中最小样本数 若小于这个数字,则不再继续向下拆分
model = se.RandomForestRegressor(max_depth=10, n_estimators=1000, min_samples_split=2)

分析小黄车的使用量

小黄车的资料在这里
提取码:9fsv

1. 分析数据

在这里插入图片描述
通过对图表的分析,我们可以发现前两行都是没有用的数据,所以可以在数据处理的时候,不需要将其作为特征点来处理

2.数据处理

在分析完图标之后我们就开始进行数据处理,这也是很重要的一步,在理解算法的本质的情况下调用api 数据处理就是最重要的,我们需要把数据处理成我们需要的样子,详细的说明在代码的注释当中

 导入各种包,在这一步可能不用但是先导着吧,后面要用的
import matplotlib.pyplot as mp
import sklearn.ensemble as se
from sklearn import tree as st # 导入决策树模块
import sklearn.metrics as sm
import pandas as pd
import numpy as np
# 读取csv文件,路径改成自己的文件路径即可
data = pd.read_csv('../ml_data/bike_day.csv',header=None)
# 将数据拆分成需要的格式
feature_names = np.array(data.iloc[0,2:15]) # 拆分特征名
# 选取前499个作为训练集
train_x = data.iloc[1:500,2:15]
train_y = data.iloc[1:500, -1]
# 选取后面作为训练集
test_x = data.iloc[500:,2:15]
test_y = data.iloc[500:, -1]

3.正向激励

调用正向激励的api实现

model = st.DecisionTreeRegressor(max_depth=10)
model_ab = se.AdaBoostRegressor(model,n_estimators=400,random_state=7)
# 训练模型
model_ab.fit(train_x,train_y)
# 预测结果
pred_y_ab = model_ab.predict(test_x)
# 获取特征重要性
fi_ab = model_ab.feature_importances_
# 打印R2得分,(0,1]区间的分值。分数越高,误差越小。
print('ad:',end='')
print(sm.r2_score(pred_y_ab,test_y))

4.随机森林

调用随机森林的api实现

model_rf = se.RandomForestRegressor(max_depth=10,n_estimators=1000,min_samples_split=2)
model_rf.fit(train_x,train_y)
# 预测结果
pred_y_rf = model_rf.predict(test_x)
# 获取特征重要性
fi_rf = model_rf.feature_importances_
# 打印R2得分,(0,1]区间的分值。分数越高,误差越小。
print('rf:',end='')
print(sm.r2_score(pred_y_rf,test_y))

5.降序画出不同特征对小黄车使用量的影响

在画图的过程中需要提前指出的一点是我在画画时对特征重要性的处理,因为特征重要性都是小于1的值,如果直接画出来就容易看不出对比,所以我把他们取 l g ( f i × 1 0 5 ) lg(fi ×10^5) lg(fi×105)这样更方便观察

# 获取排序后的索引,方便来排序不同特征的特征重要性
sorted_indices_ab = fi_ab.argsort()[::-1]
mp.figure('AdaBoost and RandomForest')
mp.title('AdaBoost and RandomForest',fontsize = 18)
mp.subplot(211)
# 设置坐标的点数
pos = np.arange(sorted_indices_ab.size)
# 画柱状图
mp.bar(pos,np.log(fi_ab[sorted_indices_ab]*10**5),facecolor = 'deepskyblue')
mp.xticks(pos, feature_names[sorted_indices_ab], rotation=30)
mp.tight_layout()
# 获取排序后的索引,方便来排序不同特征的特征重要性
sorted_indices_rf = fi_rf.argsort()[::-1]
mp.subplot(212)
mp.bar(pos,np.log(fi_rf[sorted_indices_rf]*10**5),facecolor = 'deepskyblue')
mp.xticks(pos, feature_names[sorted_indices_rf], rotation=30)
mp.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值