机器学习系列(10)_决策树与随机森林回归(下)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 优点:易于理解;数据的预处理工作可以较少;使用树的成本比如预测数据的时候,对于训练树的数据点往往使用的是数量的对数;能够同时处理数值和分类数据‘处理多输出的问题;属于易于理解的白盒模型;可通过统计测试试验模型;

四、随机森林回归



1、参数介绍


下面使用的参数是MSE:

sklearn.ensemble.RandomForestClassifier (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, class_weight=None)

回归树衡量分枝质量的指标:

  • MSE mean squard error 均方误差
  • friedman_mse 费里德曼均方误差
  • MAE 绝对平均误差 mean absolute error 使用叶子节点中的中值来最小化L1损失

79a8a1947ec04f648c3ad14a32d03d18.png


【1】N:样本量。

【2】i:是每个样本。

【3】fi:是模型回归得到的数值。

【4】yi:是样本点i实际的数值标签。

【5】MSE是样本真实数据与回归结果的差异。不只是分枝质量衡量的指标,也是用来衡量回归树回归质量的指标。在使用交叉验证,或者其他方式获取回归树的时候,往往选择均方误差作为评估的标准,MSE追求越小越好。


分类树中用score代表准确率,但在回归树中score返回的是R平方:

2c82e52b54bf4402b535d98c10789b2f.png

【1】u:残差平方和

【2】v:总平方和

【3】残差平方和远远大于总平方和,则模型非常差,R平方就会为负数。取值范围是1到负无穷,越接近1越好。

【4】neg_mean_squared_error:sklearn在进行模型评估指标的时候,会考虑指标本身的性质,由于均方误差本身是一种误差,会被sklearn划定为是某一种损失,而在sklearn当中是以负数表示损失。


(1)随机森林回归用法


这里使用sklearn自带的数据集——波士顿房价

# 和决策树完全一致,除了多了参数n_estimators
# 这里使用sklearn自带的数据集——波士顿房价 
from sklearn.datasets import load_boston 
from sklearn.model_selection import cross_val_score 
from sklearn.ensemble import RandomForestRegressor 
import sklearn 
boston=load_boston()
regressor=RandomForestRegressor(n_estimators=100,random_state=0)
cross_val_score(regressor,boston.data,boston.target,cv=10,scoring="neg_mean_squared_error")
sorted(sklearn.metrics.SCORERS.keys()) 
# SCORERS.keys是整个随机森林里面使用的标签

上面的代码中如果参数scoring不写成scoring="neg_mean_squared_error",那么交叉验证模型的衡量指标默认就是R平方,因此交叉验证的结果可能为正也可能为负数。如果写上了scoring="neg_mean_squared_error",则衡量的标准是负的均方误差,那么交叉验证的结果只能是为负数。

c6b8c8acba1147f591958e822b01446d.png

如下所示:

cross_val_score(regressor,boston.data,boston.target,cv=10,scoring="neg_mean_squared_error")
cross_val_score(regressor,boston.data,boston.target,cv=10)

9f1313aa3f864023aeaf3439887360ed.png


2、利用随机森林回归算法进行缺失值填充


(1)导入库

#(1)导入库
import sklearn 
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_boston 
from sklearn.model_selection import cross_val_score 
from sklearn.ensemble import RandomForestRegressor 

6e5b85887bb1442a923a674c67bf195c.png

(2)以波士顿数据集为例,导入完整的数据集并探索

# (2)以波士顿数据集为例,导入完整的数据集并探索 
dataset=load_boston()
dataset.data.shape 
X_full,y_full=dataset.data,dataset.target
n_samples=X_full.shape[0]
n_features=X_full.shape[1]

image.pngimage.png

通过使用shape观察数据是否存在缺失值:

image.png


(3)人为设置缺失值

# (3)人为设置缺失值
rng=np.random.RandomState(0)
missing_rate=0.5 # 将数据的50%弄成缺失值
n_missing_samples=int(np.floor(n_samples * n_features * missing_rate))

由上面得知共有6578个数据,我们选取其中的3289个数据做缺失值

image.png

# 构建缺失值的行列坐标
missing_features=rng.randint(0,n_features,n_missing_samples)
missing_samples=rng.randint(0,n_samples,n_missing_samples)
image.png
X_missing=X_full.copy()
y_missing=y_full.copy()
X_missing[missing_samples,missing_features]=np.nan #利用我们设置的行列位置将值设置为NAN
X_missing=pd.DataFrame(X_missing)

d5f4b9f4382e4bf486b6470d7b93d51c.png

(4)使用0和均值填补缺失值

# (4)使用0和均值填补缺失值 
# 使用均值进行填补
from sklearn.impute import SimpleImputer
imp_mean=SimpleImputer(missing_values=np.nan,strategy='mean')
X_missing_mean=imp_mean.fit_transform(X_missing)
# 使用01进行填补 
imp_0=SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0)
X_missing_0=imp_0.fit_transform(X_missing)
sortindex=np.argsort(X_missing_reg.isnull().sum(axis=0)).values
# 对缺失值的数据进行排序
sortindex
# 得到缺失值排序之后的索引

979be1a8243e46e59d62c22b2e9848e7.png0a8e94c46e67465f973eab4b76c5ecba.png

(5)使用随机森林填补缺失值

# (5)使用随机森林填补缺失值 
from sklearn.impute import SimpleImputer
X_missing_reg=X_missing.copy() 
for i in sortindex:
    #构建我们的新特征矩阵和新标签 
    df=X_missing_reg 
    fillc=df.iloc[:,i]
    df=pd.concat([df.iloc[:,df.columns!=i],pd.DataFrame(y_full)],axis=1)
    # 将y_full)变成特征值而非标签值,并进行合并
    # 在新特征矩阵中,对含有缺失值的列,进行0的填补 
    df_0=SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0).fit_transform(df) 
    # 找出我们的训练集和测试集 
    Ytrain=fillc[fillc.notnull()]
    Ytest=fillc[fillc.isnull()]
    Xtrain=df_0[Ytrain.index,:]
    Xtest=df_0[Ytest.index,:]
    # 用随机森林回归来填补缺失值 
    rfc=RandomForestRegressor(n_estimators=100)
    rfc=rfc.fit(Xtrain,Ytrain)
    Ypredict=rfc.predict(Xtest)
    # 将填补好的特征返回我们的原始特征矩阵中 
    X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),i]=Ypredict
X_missing_reg.isnull().sum()

2665a1aefabc419593d49034f68d20ea.png


(6)对于填充后的数据进行建模

# (6)对于填充后的数据进行建模 
X=[X_full,X_missing_mean,X_missing_0,X_missing_reg]
# 四种填充,分别是原始数据填充,均值填充缺失值,0填充缺失值,随机森林回归填充缺失值
mse=[]
std=[]
for x in X: 
    estimator=RandomForestRegressor(random_state=0,n_estimators=100)
    scores=cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error',cv=5).mean()
    mse.append(scores*-1)

05fb2cf0e7074d94a69c8c26d8441bf9.png

# 对四种填充进行MSE值的比较:
# 对于MSE来说,值越小越好
[*zip(['X_full','X_missing_mean','X_missing_0','X_missing_reg'],mse)]

3841fd2584a549939a01902f4f3c88fc.png

(7)用所得结果画出条形图

# (7)用所得结果画出条形图 
x_labels=['Full data',
'Zero Imputation',
'Mean Imputation',
'Regressor Imputation']
colors=['r','g','b','orange']
plt.figure(figsize=(12,6))
ax=plt.subplot(111)
for i in np.arange(len(mse)):
    ax.barh(i,mse[i],color=colors[i],alpha=0.6,align='center')
ax.set_title('Imputation Techniques with Boston Data')
ax.set_xlim(left=np.min(mse)*0.9,right=np.max(mse)*1.1)
ax.set_yticks(np.arange(len(mse)))
ax.set_xlabel('MSE')
ax.set_yticklabels(x_labels)
plt.show() 

由下图知,使用均值填充的效果最差,因为其MSE最大,而回归填充的效果是最好的。

f5275f5564454b77a2c6135fe5cc4181.png

由下图知,使用均值填充的效果最差,因为其MSE最大,而回归填充的效果是最好的。

#(1)导入库
from sklearn.datasets import load_breast_cancer # 乳腺癌数据
from sklearn.model_selection import GridSearchCV # 网格搜索
from sklearn.model_selection import cross_val_score # 交叉验证
from sklearn.ensemble import RandomForestClassifier # 回归森林分类器

(2)导入数据,探索数据

# (2)导入数据,探索数据 
data=load_breast_cancer() 
data 

0d861bf07c6045f3847f3848a2e308f2.png

(3)进行一次简单的建模,看看模型本身在数据集上面的效果

# (3)进行一次简单的建模,看看模型本身在数据集上面的效果 
rfc=RandomForestClassifier(n_estimators=100,random_state=90)
score_pre=cross_val_score(rfc,data.data,data.target,cv=10).mean()
# 模型,完整特殊矩阵,完整的标签,校验验证 
score_pre 

1fc9b1cdbfc54adf856a2ab7fddca121.png

(4)随机森林调整的第一步:无论如何先来调整n_estimators

# (4)随机森林调整的第一步:无论如何先来调整n_estimators 
scorel=[]
for i in range(0,200,10):# 每一次取10个
    rfc=RandomForestClassifier(n_estimators=i+1,
                              n_jobs=-1,
                              random_state=90)
    score=cross_val_score(rfc,data.data,data.target,cv=10).mean()
    scorel.append(score)
print(max(scorel),(scorel.index(max(scorel))*10)+1)
plt.figure(figsize=[20,5])
plt.plot(range(1,201,10),scorel)
plt.show() 

由下图可以看出,大概在75附近的效果最好9fe0497366094c539617c5da5739322e.png

(5)在确定好的范围内,进一步细化学习曲线

# (5)在确定好的范围内,进一步细化学习曲线 
scorel=[]
for i in range(65,75):# 上分的峰值出现在哪里,比如71,则range的设置就在这个前后
    rfc=RandomForestClassifier(n_estimators=i+1,
                              n_jobs=-1,
                              random_state=90)
    score=cross_val_score(rfc,data.data,data.target,cv=10).mean()
    scorel.append(score)
print(max(scorel),([*range(65,75)][scorel.index(max(scorel))]))
plt.figure(figsize=[20,5])
plt.plot(range(65,75),scorel)
plt.show() 

e2f73333cab441fb8a3b428ee28f61eb.png

(6)利用网格搜索做准备,网格搜索的参数

【1】调整参数max_depth

# (6)利用网格搜索做准备,网格搜索的参数 
# 调整max_depth 
param_grid={'max_depth':np.arange(1,20,1)}
rfc=RandomForestClassifier(n_estimators=72
                          ,random_state=90
                          )
GS=GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)
GS.best_params_ # 显示调整出来的最佳参数,比如在此显示的是深度 
GS.best_score_ # 返回调整好的最佳参数对应的准确率

3f2cdbf8b8bc4cc08717d3be79f17669.png

【2】调整参数max_features

# (6)利用网格搜索做准备,网格搜索的参数 
# 调整max_depth 
# param_grid={'max_depth':np.arange(1,20,1)}
# 调整max_features
param_grid={'max_features':np.arange(5,30,1)}
rfc=RandomForestClassifier(n_estimators=72
                          ,random_state=90
                          )
GS=GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)
GS.best_params_ # 显示调整出来的最佳参数,比如在此显示的是深度 
GS.best_score_ # 返回调整好的最佳参数对应的准确率

e3ff5729c5ec48548fbe5ff90dff459f.png

【3】调整参数:min_samples_leaf

# (6)利用网格搜索做准备,网格搜索的参数 
# 调整max_depth 
# param_grid={'max_depth':np.arange(1,20,1)}
# 调整max_features
# param_grid={'max_features':np.arange(5,30,1)}
# 调整min_samples_leaf
param_grid={'min_samples_leaf':np.arange(1,1+10,1)}
rfc=RandomForestClassifier(n_estimators=72
                          ,random_state=90
                          )
GS=GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)
GS.best_params_ # 显示调整出来的最佳参数,比如在此显示的是深度 
GS.best_score_ # 返回调整好的最佳参数对应的准确率

cd6de5a9384543adab6fc11f177fff56.png

【4】调整criterion

# (6)利用网格搜索做准备,网格搜索的参数 
# 调整max_depth 
# param_grid={'max_depth':np.arange(1,20,1)}
# 调整max_features
# param_grid={'max_features':np.arange(5,30,1)}
# 调整min_samples_leaf
# 调整Criterion
param_grid={'criterion':['gini','entropy']}
rfc=RandomForestClassifier(n_estimators=72
                          ,random_state=90
                          )
GS=GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)
GS.best_params_ # 显示调整出来的最佳参数,比如在此显示的是深度 
GS.best_score_ # 返回调整好的最佳参数对应的准确率

79eeb9d4d42743678008d451a0c1edf3.png

调整完毕,总结出模型最佳的参数

# 调整完毕,总结出模型最佳的参数 
rfc=RandomForestClassifier(n_estimators=72,random_state=90)
score=cross_val_score(rfc,data.data,data.target,cv=10).mean()
score

d70a9b291eba4693acf5a0f1431bf847.png

# 最后,对所有参数进行总结和梳理 
rfc=RandomForestClassifier(
                          n_estimators=73
                          ,random_state=90
                          ,criterion="gini"
                          ,min_samples_split=8
                          ,min_samples_leaf=1
                          ,max_depth=12
                          ,max_features=2 
                          ,max_leaf_nodes=36
)
score_pre=cross_val_score(rfc,data.data,data.target,cv=10).mean()
# 模型,完整特殊矩阵,完整的标签,校验验证 
score_pre

70cbd967c5da4e178dbddedfae8cefcb.png


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
1月前
|
机器学习/深度学习 数据可视化 算法
机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析
机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析
103 1
|
1月前
|
机器学习/深度学习 算法 数据可视化
可解释性机器学习:基于随机森林和Ceteris-paribus的乳腺癌早期诊断研究
可解释性机器学习:基于随机森林和Ceteris-paribus的乳腺癌早期诊断研究
47 1
|
16天前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
2天前
|
机器学习/深度学习 存储 算法
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
25 7
|
4天前
|
机器学习/深度学习 人工智能 分布式计算
R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
|
1月前
|
机器学习/深度学习 算法 数据可视化
探索可解释性机器学习:Breakdown带你了解心脏病随机森林的预测关键
探索可解释性机器学习:Breakdown带你了解心脏病随机森林的预测关键
64 0
探索可解释性机器学习:Breakdown带你了解心脏病随机森林的预测关键
|
1月前
|
机器学习/深度学习 数据采集 算法
实现机器学习算法(如:决策树、随机森林等)。
实现机器学习算法(如:决策树、随机森林等)。
24 0
|
1月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
|
1月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
26 1
|
1月前
|
机器学习/深度学习 数据采集 算法
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
98 0

热门文章

最新文章