【R语言决策树分析】:如何使用rpart包快速构建高效模型

发布时间: 2024-11-03 21:16:47 阅读量: 42 订阅数: 23
PDF

数据分析与数据挖掘课程 R语言数据挖掘实战教程 第3章 决策树分类模型 共64页.pdf

![【R语言决策树分析】:如何使用rpart包快速构建高效模型](https://www.lecepe.fr/upload/fiches-formations/visuel-formation-246.jpg) # 1. R语言决策树分析概述 在当今的大数据时代,数据驱动的决策变得越来越重要。决策树作为一种简单且高效的预测模型,在分类和回归任务中广受欢迎。R语言凭借其强大的统计分析和图形展示功能,在数据分析领域占据着举足轻重的地位。结合R语言和决策树算法,可以为复杂问题提供清晰直观的解决方案。在本章中,我们将概览R语言中决策树分析的基本概念,并介绍为何R语言是进行此类分析的理想工具。同时,我们会对接下来的章节进行简要介绍,带领读者逐步深入理解决策树的构建、应用和优化。 # 2. 理解决策树算法基础 在数据科学领域,决策树算法是构建预测模型的基石之一。它通过学习简单的决策规则来对数据进行分类和回归,广泛应用于各种场景。本章将深入探讨决策树算法的内部工作机制,以及它们的不同类型和特点。 ## 2.1 决策树的工作原理 决策树是一种模拟人类决策过程的机器学习模型。它通过一系列的规则来划分数据,这些规则最终形成一个类似树状的结构,使得每个内部节点都表示一个属性上的判断,每个分支代表一个判断结果的输出,而每个叶节点则代表一种分类结果。 ### 2.1.1 从信息增益到熵的划分标准 在构建决策树时,选择最佳划分属性是至关重要的步骤。选择的标准通常依赖于不纯度的度量,其中信息增益和熵是两种常用的度量方式。 **信息增益**:它基于信息熵的概念,反映了通过划分数据集到子集之后所带来的信息量的增加。信息增益越大,划分后的子集纯度越高,预测精度也越高。 ```r # 计算信息熵的函数 calculate_entropy <- function(data) { # 该函数内部逻辑注释略 } # 计算信息增益的函数 calculate_information_gain <- function(data, attribute) { # 该函数内部逻辑注释略 } ``` **熵(Entropy)**:在决策树中,熵用来衡量数据集的纯度。熵越低,数据集越纯净,越容易进行准确的预测。 ```r # 假设有一个数据集 data <- data.frame(feature1 = c("Yes", "No", "Yes", "No", "Yes"), feature2 = c("A", "B", "A", "B", "A"), label = c("Class1", "Class2", "Class1", "Class2", "Class1")) # 计算数据集的熵 entropy_data <- calculate_entropy(data) ``` ### 2.1.2 决策树的构建过程 构建决策树的过程是一个递归地选择最佳划分特征,并对每个子集应用相同的过程,直到达到一定的停止条件,如达到树的最大深度,或是子集中所有样本属于同一类别。 ```mermaid flowchart TD A[开始构建决策树] --> B{判断停止条件} B -- 满足 --> C[停止构建] B -- 不满足 --> D[选择最佳特征] D --> E[划分数据集] E --> B ``` ## 2.2 决策树的类型和特点 决策树算法有多种变体,每种都有其特定的应用场景和优势。ID3、C4.5和CART是最常见的决策树算法,它们在划分标准和树的构建方法上有所不同。 ### 2.2.1 ID3、C4.5与CART算法对比 **ID3算法**:使用信息增益作为划分标准,并且只能处理离散特征。 **C4.5算法**:是ID3的改进版,可以处理连续特征,并使用信息增益比来解决ID3的偏好选择。 **CART算法**:使用基尼不纯度来构建二叉树,易于理解和实现,可以用于分类也可以用于回归。 ### 2.2.2 过拟合与剪枝技术 过拟合是决策树算法常见的问题,指的是模型对训练数据的噪音和随机波动也进行了学习。剪枝是防止过拟合的常用技术,通过剪去一些分支来简化树结构,提高模型泛化能力。 **预剪枝**:在树构建的过程中,通过限制树的高度或分支数量来防止树的生长。 **后剪枝**:先生成完整的树,然后通过成本复杂度剪枝(如C4.5中的悲观剪枝)来移除一些不必要的节点。 决策树算法的学习不仅要理解其工作原理,还需要深入探索其类型和特点,才能在实践中更好地应用。下一章将介绍如何使用R语言和rpart包入门决策树建模。 # 3. R语言与rpart包入门 ## 3.1 安装和配置R环境 ### 3.1.1 R语言基础安装 在开始使用R语言之前,首先需要对R语言的基础环境进行安装。R语言是一种广泛用于统计分析、数据挖掘和可视化的编程语言,其核心是R语言解释器,而R包则提供了额外的功能和工具。以下是R语言基础安装步骤: 1. 访问R语言官方网站(***)下载最新版本的R语言解释器安装包。 2. 选择对应操作系统(Windows、Mac OS或Linux)的安装程序下载。 3. 运行安装程序,并遵循安装向导的提示完成安装。 在安装过程中,系统会提供一些选项供您选择,例如是否在系统路径中添加R程序,建议勾选这些选项以方便在任何位置调用R语言。 安装完成后,可以通过在命令行输入`R`,或者在图形用户界面中启动Rgui来启动R语言环境。成功启动后,你会看到一个提示符`>`,这表示R已经准备好接收你的指令。 ### 3.1.2 rpart包的安装和加载 rpart包是R语言中实现决策树算法的流行包之一,它支持生成分类和回归决策树。以下是安装和加载rpart包的步骤: ```r # 安装rpart包,如果还没有安装的话 install.packages("rpart") # 加载rpart包,准备开始建模 library(rpart) ``` 执行上述代码后,rpart包就被安装到R环境中,并被加载到当前的工作会话中。你可以在R环境中调用rpart包提供的函数来进行决策树的建模和分析工作。 ## 3.2 rpart包的基本使用 ### 3.2.1 数据准备和预处理 在使用rpart包进行决策树建模之前,需要对数据进行适当的准备和预处理。数据预处理是机器学习中的一个重要环节,包括数据清洗、数据转换、缺失值处理等步骤。以下是使用rpart包前的数据预处理步骤: 1. 数据清洗:移除数据中的重复观测值、空值或者不符合要求的数据。 2. 特征选择:根据业务逻辑或相关性分析,选择对建模有意义的特征。 3. 缺失值处理:对于缺失的数据,可以采用填充、删除或者估算等方法进行处理。 以R语言中的mtcars数据集为例,进行简单的数据预处理操作: ```r # 加载数据集 data(mtcars) # 查看数据集的结构 str(mtcars) # 数据清洗:移除包含NA的行 mtcars <- na.omit(mtcars) # 特征选择:只保留目标变量和部分特征 mtcars <- mtcars[, c("mpg", "cyl", "disp", "hp", "wt")] # 查看处理后的数据集 str(mtcars) ``` 在上述代码中,`na.omit()` 函数用于移除包含缺失值的观测值,`data(mtcars)` 是加载内置的mtcars数据集,`str()` 函数用于查看数据集的结构。 ### 3.2.2 构建决策树模型的函数调用 完成数据的准备和预处理后,就可以使用rpart包构建决策树模型了。`rpart()` 函数是构建决策树的主要函数,它接受一个公式表达式和数据集作为输入,并返回一个决策树模型。以下是构建决策树模型的基本步骤: ```r # 使用rpart()函数构建决策树模型 tree_model <- rpart(mpg ~ ., data = mtcars, method = "class") # 打印决策树模型的摘要信息 print(tree_model) ``` 在上述代码中,`mpg ~ .` 是公式表达式,其中`mpg`是目标变量,`.` 表示使用除`mpg`之外的所有特征作为输入变量。`method = "class"` 指定使用分类树算法,如果是回归问题则可以改为`method = "anova"`。 上述操作后,`tree_model` 变量中存储了构建好的决策树模型。你可以使用`print()` 函数来查看模型的摘要信息,或者使用`summary()` 函数获得更详细的信息。在实际应用中,还可以对决策树进行可视化展示和评估,进而对模型进行调优,以获得最佳的预测效果。 # 4. 使用rpart包进行决策树建模 决策树建模是机器学习中一个重要的过程,它可以帮助我们了解数据的结构,并对新的数据进行分类或者回归预测。R语言中的rpart包是一个强大的决策树构建工具,本章将重点介绍如何使用rpart包来进行决策树建模。 ## 4.1 决策树模型的构建 ### 4.1.1 基于rpart的决策树构建 要开始构建决策树模型,我们首先需要准备数据集,接着使用rpart包的rpart函数来构建模型。这里假设我们已经有了一个处理好的数据集,名为`mydata`,其中包含了特征列和目标列。下面展示了如何使用rpart函数: ```r # 加载rpart包 library(rpart) # 基于mydata构建决策树模型 model <- rpart(target ~ ., data = mydata, method = "class") ``` 在上述代码中,`target`是我们想要预测的目标变量,`mydata`是我们的数据框,包含了目标变量和其它特征。`method = "class"`指定了我们是在进行分类任务(如果是回归任务,使用`method = "anova"`)。函数执行后,`model`对象包含了决策树模型的所有信息。 ### 4.1.2 模型参数的调整和优化 构建决策树模型后,参数的调整和优化是提高模型性能的关键步骤。rpart函数中有很多参数可以调整,比如`cp`(复杂度参数),`minsplit`(节点分裂所需的最小观测数)等。这些参数的合理设置可以帮助我们控制树的生长,防止过拟合。 下面的代码展示了如何通过调整`cp`参数来优化模型: ```r # 使用rpart进行模型训练时考虑cp参数 model <- rpart(target ~ ., data = mydata, method = "class", control = rpart.control(cp = 0.01)) ``` 这里`cp = 0.01`是一个示例值,实际情况下这个值需要根据具体问题进行调整。我们可以通过交叉验证的方法找到最优的`cp`值,通常我们会选择那个在验证集上表现最佳的`cp`值。 ## 4.2 决策树模型的评估 ### 4.2.1 模型的准确性和验证方法 构建决策树模型之后,我们通常会使用不同的方法来评估模型的准确性,比如交叉验证。交叉验证是一种统计方法,用于评估并比较学习算法在独立数据样本集上的性能。 ```r # 使用交叉验证来评估模型的准确性 set.seed(123) cv_result <- crossvalidate(mydata, target, cp = 0.01, method = "class") ``` 在上述代码中,`crossvalidate`是一个假设的函数,它会对数据进行交叉验证,并返回模型准确性。在实际应用中,我们可以使用`caret`包或者`rpart`包自带的验证函数来完成这个过程。 ### 4.2.2 特征重要性和模型解释 特征重要性是理解模型预测能力的关键。在决策树模型中,每个特征根据其在模型中的重要性被赋予一个权重。通过查看每个特征的权重,我们可以了解哪些特征对于模型预测起了关键作用。 ```r # 查看特征重要性 importance <- varImp(model) print(importance) ``` `varImp`函数会返回一个包含特征重要性的数据框。通过这种方式,我们可以清楚地识别出哪些特征对决策树的构建贡献最大。 通过本章节的介绍,我们对如何使用rpart包进行决策树的构建和评估有了一个全面的认识。在接下来的章节中,我们将探索如何将这些决策树模型应用于实际数据集,并进一步优化模型性能。 # 5. 决策树模型的实践应用 决策树模型在数据分析和机器学习领域有着广泛的应用。本章将深入探讨如何在实际案例中应用决策树模型,包括数据集的准备和处理、模型的构建和评估,以及如何根据实际需求进行参数调优和性能优化。 ## 5.1 数据集准备和处理 ### 5.1.1 实际数据集的选取 选择合适的数据集是决策树建模的第一步,也是至关重要的一步。选取数据集时需要考虑以下几点: - **数据相关性**:确保数据集中的变量与要预测的目标变量具有一定的相关性。 - **数据完整性**:尽可能选择完整率较高的数据,避免过多缺失值。 - **数据大小**:样本量应该足够大,以确保模型具有良好的泛化能力。 例如,在银行信贷领域,我们可能会选择包含客户基本信息、信用历史、借款用途等字段的数据集来预测违约风险。 ### 5.1.2 数据清洗和特征工程 数据清洗是数据预处理的重要环节。在此阶段,需要进行以下操作: - **处理缺失值**:可以删除含有缺失值的记录,或者用中位数、平均值、众数等方法填充。 - **异常值检测与处理**:通过统计方法检测异常值,并根据情况进行保留或移除。 - **特征选择**:选择与目标变量相关性较高的特征,去除冗余或不重要的特征。 特征工程则是对数据进行转换,以更好地适应模型。例如,对于分类变量,可以进行编码处理;对于连续变量,可以进行归一化或标准化。 ## 5.2 决策树模型的构建和评估 ### 5.2.1 构建决策树模型 构建决策树模型的关键在于合理选择参数以达到既定的建模目标。使用 R 语言中的 `rpart` 包,我们可以构建一个简单的决策树模型: ```r library(rpart) set.seed(123) # 加载数据集 data("iris") # 构建决策树模型 model <- rpart(Species ~ ., data = iris, method = "class") # 打印模型结果 print(model) ``` 上述代码首先加载了 `iris` 数据集,并使用 `rpart` 函数构建了一个分类决策树模型。参数 `method = "class"` 表明我们正在处理一个分类问题。模型的结果会展示各个节点的分裂规则、叶节点的类别和概率等信息。 ### 5.2.2 模型的性能评估和参数调优 决策树模型构建完成后,需要进行性能评估,常用的评估方法包括: - **交叉验证**:通过 K 折交叉验证来评估模型的稳定性和准确性。 - **准确率**:使用混淆矩阵计算准确率、精确率、召回率等指标。 参数调优则涉及到模型复杂度的控制,可以通过调整 `rpart` 函数的 `cp`(复杂度参数)来避免过拟合或欠拟合。 ```r # 使用交叉验证评估模型 library(caret) set.seed(123) train_control <- trainControl(method = "cv", number = 10) model_cv <- train(Species ~ ., data = iris, method = "rpart", trControl = train_control) # 输出模型参数和交叉验证结果 print(model_cv) # 可视化决策树 library(rpart.plot) rpart.plot(model) ``` 通过以上步骤,我们可以对模型进行评估,并使用 `rpart.plot` 包对构建的决策树进行可视化,以便更直观地理解模型的结构。 在实际应用中,数据集的选取、数据预处理、模型构建和评估,以及参数调优是一个反复迭代的过程,需要根据具体问题和数据特点进行调整和优化。 在接下来的第六章中,我们将探讨决策树模型在不同领域的高级应用,以及如何与其他算法相结合,解决更为复杂的问题。 # 6. 决策树模型的高级应用 ## 6.1 非线性决策边界 在处理复杂数据时,经常会遇到非线性决策边界问题。决策树可以很好地处理这类问题,因为它们自然地通过分割节点来创建非线性边界。 ### 6.1.1 处理非线性问题的策略 在实践中,遇到非线性数据时,可以采取以下策略: - **多层决策树**: 通过构建多层决策树,每一层处理一部分非线性特征。 - **特征交叉**: 通过创造新特征,即原有特征的交互项,增加数据的表达能力。 - **核方法**: 将数据映射到更高维度的空间,尝试解决非线性问题,虽然决策树本身是线性的,但结合核方法能提升其表现。 ### 6.1.2 决策树与其他算法的结合 决策树也可以与其他机器学习算法结合使用,以提升模型的性能: - **集成方法**: 如随机森林和梯度提升树,将多个决策树的预测结果集成起来,提升准确度和稳定性。 - **混合模型**: 将决策树用于特征选择或预处理,然后再用其他算法建模。 - **深度学习**: 在深度学习中嵌入决策树,例如在某些隐藏层使用决策树作为激活函数。 ```r # 示例:结合决策树与随机森林的模型 library(randomForest) rf_model <- randomForest(x = train_data[, -target_index], y = train_data[, target_index], ntree = 500) ``` ## 6.2 决策树在不同领域的应用案例 决策树模型不仅仅限于基础的分类和回归任务,它们已被应用在多个行业的多个问题中。 ### 6.2.1 医疗诊断中的应用 在医疗领域,决策树能够根据病人的特征来预测疾病的可能性,或者对现有病症进行分类。 - **疾病预测**: 利用病人的历史健康数据,构建决策树模型来预测患某种疾病的概率。 - **疾病分类**: 根据病人的临床表现和诊断测试结果,决策树可以用来分类疾病类型。 ### 6.2.2 金融风险评估中的应用 金融行业中,决策树被用于评估信用风险、欺诈检测等。 - **信用评分**: 通过客户的信用历史和财务信息,决策树能够对贷款申请者的信用等级进行分类。 - **欺诈检测**: 分析交易数据,决策树模型有助于识别可能的欺诈行为。 ```r # 示例:构建信用评分模型的决策树 credit_model <- rpart(formula = CreditStatus ~ ., data = credit_data, method = "class") ``` 在以上案例中,决策树都扮演着关键角色,通过它们的灵活性和可解释性,为不同领域的复杂问题提供了有效的解决方案。 **注意**:在应用决策树模型时,需要注意模型的泛化能力,避免过拟合,并根据实际情况进行参数调整和优化,确保模型的稳定性和准确性。
corwn 最低0.47元/天 解锁专栏
买1年送3月
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

LI_李波

资深数据库专家
北理工计算机硕士,曾在一家全球领先的互联网巨头公司担任数据库工程师,负责设计、优化和维护公司核心数据库系统,在大规模数据处理和数据库系统架构设计方面颇有造诣。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

【16位加法器设计秘籍】:全面揭秘高性能计算单元的构建与优化

![【16位加法器设计秘籍】:全面揭秘高性能计算单元的构建与优化](https://media.licdn.com/dms/image/D5612AQGOmsw4xG7qfQ/article-cover_image-shrink_600_2000/0/1707900016507?e=2147483647&v=beta&t=W7sQQXwA8ut0z5oTZTaPTLbNyVY4slt-p4Fxz9LxaGc) # 摘要 本文对16位加法器进行了全面的研究和分析。首先回顾了加法器的基础知识,然后深入探讨了16位加法器的设计原理,包括二进制加法基础、组成部分及其高性能设计考量。接着,文章详细阐述

三菱FX3U PLC编程:从入门到高级应用的17个关键技巧

![三菱FX3U PLC编程:从入门到高级应用的17个关键技巧](https://p9-pc-sign.douyinpic.com/obj/tos-cn-p-0015/47205787e6de4a1da29cb3792707cad7_1689837833?x-expires=2029248000&x-signature=Nn7w%2BNeAVaw78LQFYzylJt%2FWGno%3D&from=1516005123) # 摘要 三菱FX3U PLC是工业自动化领域常用的控制器之一,本文全面介绍了其编程技巧和实践应用。文章首先概述了FX3U PLC的基本概念、功能和硬件结构,随后深入探讨了

【Xilinx 7系列FPGA深入剖析】:掌握架构精髓与应用秘诀

![【Xilinx 7系列FPGA深入剖析】:掌握架构精髓与应用秘诀](https://www.xilinx.com/content/dam/xilinx/imgs/products/vivado/vivado-ml/sythesis.png) # 摘要 本文详细介绍了Xilinx 7系列FPGA的关键特性及其在工业应用中的广泛应用。首先概述了7系列FPGA的基本架构,包括其核心的可编程逻辑单元(PL)、集成的块存储器(BRAM)和数字信号处理(DSP)单元。接着,本文探讨了使用Xilinx工具链进行FPGA编程与配置的流程,强调了设计优化和设备配置的重要性。文章进一步分析了7系列FPGA在

【图像技术的深度解析】:Canvas转JPEG透明度保护的终极策略

![【图像技术的深度解析】:Canvas转JPEG透明度保护的终极策略](https://img-blog.csdnimg.cn/20210603163722550.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE4OTI5MQ==,size_16,color_FFFFFF,t_70) # 摘要 随着Web技术的不断发展,图像技术在前端开发中扮演着越来越重要的角色。本文首先介绍了图像技术的基础和Canvas绘

【MVC标准化:肌电信号处理的终极指南】:提升数据质量的10大关键步骤与工具

![MVC标准化](https://img-blog.csdn.net/20160221141956498) # 摘要 MVC标准化是肌电信号处理中确保数据质量的重要步骤,它对于提高测量结果的准确性和可重复性至关重要。本文首先介绍肌电信号的生理学原理和MVC标准化理论,阐述了数据质量的重要性及影响因素。随后,文章深入探讨了肌电信号预处理的各个环节,包括噪声识别与消除、信号放大与滤波技术、以及基线漂移的校正方法。在提升数据质量的关键步骤部分,本文详细描述了信号特征提取、MVC标准化的实施与评估,并讨论了数据质量评估与优化工具。最后,本文通过实验设计和案例分析,展示了MVC标准化在实践应用中的具

ISA88.01批量控制:电子制造流程优化的5大策略

![ISA88.01批量控制:电子制造流程优化的5大策略](https://media.licdn.com/dms/image/D4D12AQHVA3ga8fkujg/article-cover_image-shrink_600_2000/0/1659049633041?e=2147483647&v=beta&t=kZcQ-IRTEzsBCXJp2uTia8LjePEi75_E7vhjHu-6Qk0) # 摘要 本文首先概述了ISA88.01批量控制标准,接着深入探讨了电子制造流程的理论基础,包括原材料处理、制造单元和工作站的组成部分,以及流程控制的理论框架和优化的核心原则。进一步地,本文实

【Flutter验证码动画效果】:如何设计提升用户体验的交互

![【Flutter验证码动画效果】:如何设计提升用户体验的交互](https://blog.codemagic.io/uploads/covers/Codemagic-io_blog_flutter-animations.png) # 摘要 随着移动应用的普及和安全需求的提升,验证码动画作为提高用户体验和安全性的关键技术,正受到越来越多的关注。本文首先介绍Flutter框架下验证码动画的重要性和基本实现原理,涵盖了动画的类型、应用场景、设计原则以及开发工具和库。接着,文章通过实践篇深入探讨了在Flutter环境下如何具体实现验证码动画,包括基础动画的制作、进阶技巧和自定义组件的开发。优化篇

ENVI波谱分类算法:从理论到实践的完整指南

# 摘要 ENVI软件作为遥感数据处理的主流工具之一,提供了多种波谱分类算法用于遥感图像分析。本文首先概述了波谱分类的基本概念及其在遥感领域的重要性,然后介绍了ENVI软件界面和波谱数据预处理的流程。接着,详细探讨了ENVI软件中波谱分类算法的实现方法,通过实践案例演示了像元级和对象级波谱分类算法的操作。最后,文章针对波谱分类的高级应用、挑战及未来发展进行了讨论,重点分析了高光谱数据分类和深度学习在波谱分类中的应用情况,以及波谱分类在土地覆盖制图和农业监测中的实际应用。 # 关键字 ENVI软件;波谱分类;遥感图像;数据预处理;分类算法;高光谱数据 参考资源链接:[使用ENVI进行高光谱分

【天线性能提升密籍】:深入探究均匀线阵方向图设计原则及案例分析

![均匀线阵方向图](https://img-blog.csdnimg.cn/img_convert/0080eea0ca4af421d2bc9c74b87376c4.webp?x-oss-process=image/format,png) # 摘要 本文深入探讨了均匀线阵天线的基础理论及其方向图设计,旨在提升天线系统的性能和应用效能。文章首先介绍了均匀线阵及方向图的基本概念,并阐述了方向图设计的理论基础,包括波束形成与主瓣及副瓣特性的控制。随后,论文通过设计软件工具的应用和实际天线系统调试方法,展示了方向图设计的实践技巧。文中还包含了一系列案例分析,以实证研究验证理论,并探讨了均匀线阵性能

【兼容性问题】快解决:专家教你确保光盘在各设备流畅读取

![【兼容性问题】快解决:专家教你确保光盘在各设备流畅读取](https://s2-techtudo.glbimg.com/5oAM_ieEznpTtGLlgExdMC8rawA=/0x0:695x387/984x0/smart/filters:strip_icc()/i.s3.glbimg.com/v1/AUTH_08fbf48bc0524877943fe86e43087e7a/internal_photos/bs/2021/L/w/I3DfXKTAmrqNi0rGtG5A/2014-06-24-cd-dvd-bluray.png) # 摘要 光盘作为一种传统的数据存储介质,其兼容性问题长