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

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

四、随机森林回归



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实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
3月前
|
机器学习/深度学习 存储 算法
决策树和随机森林在机器学习中的应用
在机器学习领域,决策树(Decision Tree)和随机森林(Random Forest)是两种非常流行且强大的分类和回归算法。它们通过模拟人类决策过程,将复杂的数据集分割成易于理解和处理的子集,从而实现对新数据的准确预测。
131 10
|
8天前
|
机器学习/深度学习 数据可视化 大数据
机器学习与大数据分析的结合:智能决策的新引擎
机器学习与大数据分析的结合:智能决策的新引擎
78 15
|
1月前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
129 1
|
3月前
|
机器学习/深度学习 数据采集 监控
探索机器学习:从数据到决策
【9月更文挑战第18天】在这篇文章中,我们将一起踏上一段激动人心的旅程,穿越机器学习的世界。我们将探讨如何通过收集和处理数据,利用算法的力量来预测未来的趋势,并做出更加明智的决策。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和思考方式。
|
2月前
|
机器学习/深度学习 算法 数据可视化
【机器学习】决策树------迅速了解其基本思想,Sklearn的决策树API及构建决策树的步骤!!!
【机器学习】决策树------迅速了解其基本思想,Sklearn的决策树API及构建决策树的步骤!!!
|
3月前
|
机器学习/深度学习 算法 Python
从菜鸟到大师:一棵决策树如何引领你的Python机器学习之旅
【9月更文挑战第9天】在数据科学领域,机器学习如同璀璨明珠,吸引无数探索者。尤其对于新手而言,纷繁复杂的算法常让人感到迷茫。本文将以决策树为切入点,带您从Python机器学习的新手逐步成长为高手。决策树以其直观易懂的特点成为入门利器。通过构建决策树分类器并应用到鸢尾花数据集上,我们展示了其基本用法及效果。掌握决策树后,还需深入理解其工作原理,调整参数,并探索集成学习方法,最终将所学应用于实际问题解决中,不断提升技能。愿这棵智慧之树助您成为独当一面的大师。
52 3
|
3月前
|
机器学习/深度学习 算法 Python
决策树下的智慧果实:Python机器学习实战,轻松摘取数据洞察的果实
【9月更文挑战第7天】当我们身处数据海洋,如何提炼出有价值的洞察?决策树作为一种直观且强大的机器学习算法,宛如智慧之树,引领我们在繁复的数据中找到答案。通过Python的scikit-learn库,我们可以轻松实现决策树模型,对数据进行分类或回归分析。本教程将带领大家从零开始,通过实际案例掌握决策树的原理与应用,探索数据中的秘密。
56 1
|
3月前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
1月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
103 4
|
11天前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
28 2