快速入门Python机器学习(19)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
云原生网关 MSE Higress,422元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 快速入门Python机器学习(19)

9.4 决策树回归(Decision Tree Regressor


9.4.1类、属性和方法

class 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, ccp_alpha=0.0)


参数

属性

类型

解释

max_depth

int, default=None

树的最大深度。如果没有,则节点将展开,直到所有叶都是纯的,或者直到所有叶都包含少于min_samples_split samples的值。

criterion

{'mse', 'friedman_mse', 'mae', 'poisson'}, default='mse'

他的职能是衡量分裂的质量。

支持的标准是均方误差的'mse',它等于作为特征选择标准的方差缩减,并使用每个终端节点的平均值最小化L2损失。

'friedman_mse',它使用均方误差和friedman的潜在分裂改善分数,

'mae'表示平均绝对误差,它使用每个终端节点的中值最小化L1损失,

'poisson'则使用泊松偏差的减少来寻找分裂。


属性

属性

解释

feature_importances_

ndarray of shape (n_features,)返回功能重要性。

max_features_

intmax_features的推断值。

n_features_

int执行拟合时的特征数。

n_outputs_

int执行拟合时的输出数。

tree_

Tree instance基础树对象。请参阅帮助(sklearn.tree._tree.Tree)对于树对象的属性,了解决策树结构对于这些属性的基本用法。


方法

apply(X[, check_input])

返回每个样本预测为的叶的索引。

cost_complexity_pruning_path(X, y[, …])

在最小代价复杂度修剪过程中计算修剪路径。

decision_path(X[, check_input])

返回树中的决策路径。

fit(X, y[, sample_weight, check_input, …])

从训练集(Xy)建立一个决策树回归器。

get_depth()

返回决策树的深度。

get_n_leaves()

返回决策树的叶数。

get_params([deep])

获取此估计器的参数。

predict(X[, check_input])

预测X的类或回归值。

score(X, y[, sample_weight])

返回预测的确定系数R2

set_params(**params)

设置此估计器的参数。


9.4.2分析有噪音make_regression数据

def DecisionTreeRegressor_for_make_regression_add_noise():
       myutil = util()
       X,y = make_regression(n_samples=100,n_features=1,n_informative=2,noise=50,random_state=8)
       X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3)
       clf = DecisionTreeRegressor().fit(X,y)
       title = "make_regression DecisionTreeRegressor()回归线(有噪音)"
       myutil.print_scores(clf,X_train,y_train,X_test,y_test,title)
       myutil.draw_line(X[:,0],y,clf,title)
       myutil.plot_learning_curve(DecisionTreeRegressor(),X,y,title)
       myutil.show_pic(title)


输出

make_regression DecisionTreeRegressor()回归线(有噪音):
100.00%
make_regression DecisionTreeRegressor()回归线(有噪音):
100.00%


结果相当好

image.png


9.4.3分析波士顿房价数据

def DecisionTreeRegressor_for_boston():
       myutil = util()
       boston = datasets.load_boston()
       X,y = boston.data,boston.target
       X_train,X_test,y_train,y_test = train_test_split(X, y, random_state =8)
       for max_depth in [1,3,5,7]:
              clf = DecisionTreeRegressor(max_depth=max_depth)
              clf.fit(X_train,y_train)
              title=u"波士顿据测试集(max_depth="+str(max_depth)+")"
              myutil.print_scores(clf,X_train,y_train,X_test,y_test,title)
              myutil.plot_learning_curve(DecisionTreeRegressor(max_depth=max_depth),X,y,title)
              myutil.show_pic(title)


输出

波士顿据测试集(max_depth=1):
45.95%
波士顿据测试集(max_depth=1):
35.44%
波士顿据测试集(max_depth=3):
83.84%
波士顿据测试集(max_depth=3):
62.87%
波士顿据测试集(max_depth=5):
93.82%
波士顿据测试集(max_depth=5):
69.38%
波士顿据测试集(max_depth=7):
97.31%
波士顿据测试集(max_depth=7):
79.19%


max_depth=7的时候效果最好,但是所有情况都存在过拟合现象

image.png

image.png

image.png

image.png


9.4.4分析糖尿病数据

def DecisionTreeRegressor_for_diabetes():
       myutil = util()
       diabetes = datasets.load_diabetes()
       X,y = diabetes.data,diabetes.target
       X_train,X_test,y_train,y_test = train_test_split(X, y, random_state =8)
       for max_depth in [1,3,5,7]:
              clf = DecisionTreeRegressor(max_depth=max_depth)
              clf.fit(X_train,y_train)
              title=u"糖尿病据测试集(max_depth="+str(max_depth)+")"
              myutil.print_scores(clf,X_train,y_train,X_test,y_test,title)
              myutil.plot_learning_curve(DecisionTreeRegressor(max_depth=max_depth),X,y,title)
              myutil.show_pic(title)


输出

糖尿病据测试集(max_depth=1):
30.44%
糖尿病据测试集(max_depth=1):
15.21%
糖尿病据测试集(max_depth=3):
55.64%
糖尿病据测试集(max_depth=3):
28.37%
糖尿病据测试集(max_depth=5):
71.81%
糖尿病据测试集(max_depth=5):
18.06%
糖尿病据测试集(max_depth=7):
84.30%
糖尿病据测试集(max_depth=7):
-1.26%


过拟合现象非常严重,特别是max_depth越大的时候。

image.png

image.png

image.png

image.png


9.5 决策树剪枝处理


不管是决策树分类还是决策树回归,过拟合现象是决策树算法的最大问题,但是从“9.4.2分析有噪音make_regression数据”可以看到,决策树还是一种非常有效的方法,解决过拟合现象有以下两种方法:

  1. 剪枝处理
  2. 随机森林

随机森林的属于集成学习的一类,我们将在下一章进行介绍。现在介绍一下剪枝。


image.png


  • 预剪枝(Pre-pruning):及早停止树的增长,也是sklearn中用的方法。
  • 后剪枝(post-pruning):先形成树,再剪枝。


def decision_tree_pruning():
myutil = util()
cancer = datasets.load_breast_cancer()
X_train,X_test,y_train,y_test = train_test_split(cancer.data,cancer.target,stratify=cancer.target,random_state=42)#stratify:分层
# 构件树,不剪枝
tree = DecisionTreeClassifier(random_state=0)
tree.fit(X_train,y_train)
title = "不剪枝,训练数据集上的精度"
myutil.print_scores(tree,X_train,y_train,X_test,y_test,title)
print("不剪枝,树的深度:{}".format(tree.get_depth()))
# 构件树,剪枝
tree = DecisionTreeClassifier(max_depth=4,random_state=0)
tree.fit(X_train,y_train)
title = "剪枝,训练数据集上的精度"
myutil.print_scores(tree,X_train,y_train,X_test,y_test,title)
print("剪枝,树的深度:{}".format(tree.get_depth()))


输出

不剪枝,训练数据集上的精度:
100.00%
不剪枝,训练数据集上的精度:
93.71%
不剪枝,树的深度:7
剪枝,训练数据集上的精度:
98.83%
剪枝,训练数据集上的精度:
95.10%
剪枝,树的深度:4


9.6决策树可视化

#pip3 install graphviz

# Graphviz 是一款由 AT&T Research 和 Lucent Bell 实验室开源的可视化图形工具

from sklearn.tree import export_graphviz
import graphviz
def show_tree():
    wine = datasets.load_wine()
    # 仅选前两个特征
    X = wine.data[:,:2]
    y = wine.target
    X_train,X_test,y_train,y_test = train_test_split(X, y)
    clf = DecisionTreeClassifier(max_depth=3)#为了图片不太大选择max_depth=3
    clf.fit(X_train,y_train) export_graphviz(clf,out_file="wine.dot",class_names=wine.target_names,feature_names=wine.feature_names[:2],impurity=False,filled=True)
    #打开dot文件
    with open("wine.dot") as f:
        dot_graph = f.read()
    graphviz.Source(dot_graph)


安装graphviz软件,打开wine.dot

image.png

目录
相关文章
|
7月前
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
263 7
|
5月前
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
836 12
Scikit-learn:Python机器学习的瑞士军刀
|
4月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
120 1
|
8月前
|
机器学习/深度学习 数据可视化 算法
Python与机器学习:使用Scikit-learn进行数据建模
本文介绍如何使用Python和Scikit-learn进行机器学习数据建模。首先,通过鸢尾花数据集演示数据准备、可视化和预处理步骤。接着,构建并评估K近邻(KNN)模型,展示超参数调优方法。最后,比较KNN、随机森林和支持向量机(SVM)等模型的性能,帮助读者掌握基础的机器学习建模技巧,并展望未来结合深度学习框架的发展方向。
Python与机器学习:使用Scikit-learn进行数据建模
|
7月前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
7月前
|
机器学习/深度学习 数据可视化 算法
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
|
11月前
|
机器学习/深度学习 数据采集 数据可视化
Python数据科学实战:从Pandas到机器学习
Python数据科学实战:从Pandas到机器学习
|
11月前
|
机器学习/深度学习 数据可视化 数据处理
掌握Python数据科学基础——从数据处理到机器学习
掌握Python数据科学基础——从数据处理到机器学习
170 0
|
11月前
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
365 0
|
11月前
|
机器学习/深度学习 数据采集 数据挖掘
Python在数据科学中的应用:从数据处理到模型训练
Python在数据科学中的应用:从数据处理到模型训练

热门文章

最新文章

推荐镜像

更多