决策树回归、随机森林以及sklearn相关函数的参数说明

一)前言
上一篇,讲述了如何用决策树进行分类,这一篇,就写一写如何用决策树进行回归
上一篇地址:https://blog.csdn.net/MR_Trustin/article/details/96886157

二)sklearn.tree.DecisionTreeRegressor参数及说明
官方文档:
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html#sklearn.tree.DecisionTreeRegressor

参数说明:

sklearn.tree.DecisionTreeRegressor
(criterion=’mse’, 
splitter=’best’,
 max_depth=None,
 min_samples_split=2, 
min_samples_leaf=1, 
min_weight_fraction_leaf=0.0,
 max_features=None,
 random_state=None,
 max_leaf_nodes=None, 
min_impurity_decrease=0.0, 
min_impurity_split=None, 
presort=False)

决策树的回归函数,其参数和分类很相似,区别在于以下三点:
1、criterion:特征选取标准
默认为:mse。
可选mse或mae,前者是均方差,后者是和均值的差的绝对值之和,一般用前者,因为前者通常更为精准,且方便计算

2、class_weight:不适合回归,所以回归函数里没有该参数

3、同样min_weight_fraction_leaf 也没有

三)案例:预测波士顿地区房屋价格。
因为sklearn中自带波士顿地区房屋价格的数据集,所以用这个演示非常方便。

import sklearn.datasets as sd
import sklearn.metrics as sm
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
# 加载数据
'''
 |犯罪率|住宅用地比例|商业用地比例|
 |是否靠河|空气质量|房间数|年限|
 |距市中心距离|路网密度|房产税|师生比|
 |黑人比例|低地位人口比例|
'''
boston = sd.load_boston()
print(boston.data.shape)  # 样本输入
print(boston.target.shape)# 样本输出
print(boston.feature_names) # 特征名

out:

(506, 13)
(506,)
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
#划分训练集和验证集
x = boston.data
y = boston.target
x_train, x_test, y_train, y_test = train_test_split(x, y,train_size=0.8)

print('train dataset: {}; test dataset: {}'.format(x_train.shape, x_test.shape))

out:

train dataset: (404, 13); test dataset: (102, 13)
# 构建模型 使用训练集训练,测试集测试
model=DecisionTreeRegressor(max_depth=4)
model.fit(x_train, y_train)
pred_test_y = model.predict(x_test)
print(sm.r2_score(y_test, pred_test_y))

out:

0.8611197881918903

四)随机森林
随机森林是决策树的一种延伸,在讲随机森林之前,还有三个概念需要先简单说一下。
集成学习(Ensemble):为了解决单个模型或者某一组参数的模型所固有的缺陷,从而整合起更多的模型,取长补短,避免局限性。
集成学习又分为两大类:bagging和boosting。

自助聚合算法(bagging):采用有放回的方式随机抽取部分样本训练弱分类器,重复K次。得到K个弱分类器,最后才进行整合。整合方式就是:分类问题用投票,回归用均值。

正向激励算法(boosting):首先为样本矩阵中的样本随机分配初始权重,由此构成一个带有权重的弱分类器模型。将训练样本带入模型,预测其输出,对于那些预测值与实际值不同的样本,提高其权重,由此形成第二个弱分类器,重复以上过程,构建不同权重的若干个弱分类器。

boosting与bagging不太一样,它的弱分类器不能并行训练,因为下一个分类器依赖上一个的分类结果。训练时着重关注训练集中那些不容易区分的样本。

而随机森林是一种特殊的自助聚合算法。为什么这么说呢?因为随机森林算法在自助聚合的基础之上,每次构建决策树模型时,不仅随机选择部分样本,而且还随机选择部分特征。
这样的集合算法不仅规避了强势样本对预测结果的影响,而且也削弱了强势特征的影响,使模型更加泛化。
优点:不存在过拟合。因为每个分类器都是独立的,不但训练数据不同(行抽样),而且特征也不一样(列抽样)。

在scikit-learn中,随机森林有两大函数方法:用来分类是RandomForestClassifier,用来回归是RandomForestRegressor。

1)sklearn.ensemble.RandomForestClassifier函数及参数
官方文档:
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier

sklearn.ensemble.RandomForestClassifier(
n_estimators=’warn’,
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)

随机森林是在决策树模型的基础上建立的,所以他们的参数有很大部分都是一样的,在这里我就重复叙述了。我之前讲分类决策树的时候,已经把它的参数讲的很详细了。
分类决策树原理及sklearn.tree.DecisionTreeClassifier参数说明
https://blog.csdn.net/MR_Trustin/article/details/96886157

以下几个参数都是分类决策树没有的参数。
n_estimators:最大的弱分类器的个数。
默认是10。
一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。

Bootstrap:是否采用袋外样本来评估模型的好坏。
默认识False。
在有放回采样中那些没有被采样到的数据,我们常常称之为袋外数据(Out Of Bag, 简称OOB),这些数据没有参与训练集模型的拟合,因此可以用来检测模型的泛化能力。个人推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力。对单个模型的参数训练,我们知道可以用cross validation(cv)来进行,但是特别消耗时间,而且对于随机森林这种情况也没有大的必要,所以就用这个数据对决策树模型进行验证,算是一个简单的交叉验证,性能消耗小,但是效果不错。

oob_score:是否有放回的采样。
默认True。
n_jobs :进程个数
默认None。相当于 n_jobs=1.
若值为 -1,则用所有的CPU进行运算。
若值为1,则不进行并行运算,这样的话方便调试。
若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。
verbose :控制构建数过程的冗长度。
默认为0。
warm_start:
默认为False。
当设置为True,重新使用之前的结构去拟合样例并且加入更多的估计器(estimators,在这里就是随机树)到组合器中。

2)sklearn.ensemble.RandomForestRegressor函数及参数
官方文档:
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html#sklearn.ensemble.RandomForestRegressor

sklearn.ensemble.RandomForestRegressor(
n_estimators=’warn’,
criterion=’mse’,
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)
RandomForestRegressor的参数,大家可以结合DecisionTreeRegressor的参数讲解(本片开始位置)和RandomForestClassifier的参数讲解,自行理解。

五)用随机森林分析共享单车的需求,判断如何进行共享单车投放。

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import sklearn.ensemble as se
import sklearn.metrics as sm
import matplotlib.pyplot as mp
import sklearn.model_selection as ms
np.set_printoptions(suppress=True)  #使程序输出不是科学计数法的形式,而是浮点型的数据输出。
data = pd.read_csv("bike_day.csv")
print(data.shape)
data.head()

out:
在这里插入图片描述

#删除无用的特征
x = np.array(data.drop(['instant','dteday','casual','registered','cnt'],axis = 1), dtype='f4')
y = np.array(data['cnt'])
#划分测试集与训练集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=6, train_size=0.9)
#基于随机森林训练模型

params = [{'n_estimators': [10,100,1000]},
              {'max_depth': range(2, 11)},
              {'min_samples_split': range(2, 30, 2)}]
model = se.RandomForestRegressor()
model = ms.GridSearchCV(model, params, cv=5)
model.fit(x_train, y_train)
#得出最优参数
print("best params:",model.best_params_)
print("best score: ",model.best_score_)

out:

best params: {'n_estimators': 1000}
best score:  0.8819417366681805
#用测试集验证模型
pred_test_y = model.predict(x_test)
print(sm.r2_score(y_test, pred_test_y))

out:

0.871258297771629
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值