二、集成学习:Boosting 之 AdaBoost_分类问题

一、 Boosting算法的基本元素与基本流程

  “降低偏差”、“逐一建树”、以及“以独特规则输出结果”的三大特色,可以确立任意boosting算法的三大基本元素以及boosting算法自适应建模的基本流程:

  • 损失函数 L ( x , y ) L(x,y) L(x,y) :用以衡量模型预测结果与真实结果的差异
  • 弱评估器 f ( x ) f(x) f(x) :(一般为)决策树,不同的boosting算法使用不同的建树过程
  • 综合集成结果 H ( x ) H(x) H(x):即集成算法具体如何输出集成结果

  这三大元素将会贯穿所有我们即将学习的boosting算法,我们会发现几乎所有boosting算法的原理都围绕这三大元素构建。在此三大要素基础上,所有boosting算法都遵循以下流程进行建模:

  • 依据上一个弱评估器 f ( x ) t − 1 f(x)_{t-1} f(x)t1的结果,计算损失函数 L ( x , y ) L(x,y) L(x,y)
    并使用 L ( x , y ) L(x,y) L(x,y)自适应地影响下一个弱评估器 f ( x ) t f(x)_t f(x)t的构建。
    集成模型输出的结果,受到整体所有弱评估器 f ( x ) 0 f(x)_0 f(x)0 ~ f ( x ) T f(x)_T f(x)T的影响。

二、 AdaBoost

2.1 设计思路

  AdaBoost(Adaptive Boosting,自适应提升法)是当代boosting领域的开山鼻祖,它虽然不是首个实践boosting思想算法,却是首个成功将boosting思想发扬光大的算法。它的主要贡献在于实现了两个变化:

  • 首次实现根据之前弱评估器的结果自适应地影响后续建模过程;
  • 在Boosting算法中,首次实现考虑全部弱评估器结果的输出方式;

  AdaBoost的构筑过程非常简单:首先,在全样本上建立一棵决策树,根据该决策树预测的结果和损失函数值,增加被预测错误的样本在数据集中的样本权重,并让加权后的数据集被用于训练下一棵决策树。这个过程相当于有意地加重“难以被分类正确的样本”的权重,同时降低“容易被分类正确的样本”的权重,而将后续要建立的弱评估器的注意力引导到难以被分类正确的样本上。

在这里插入图片描述

2.2 二分类的算法流程

  一、 确定基分类器:任何分类模型都可以作为基分类器,但树形模型由于结构简单且较易产生随机性所以比较常用;

  二、训练基分类器:假设训练集 { x i , y i } , i = 1 , . . . , N , 其 中 y i ∈ { − 1 , 1 } \{x_i,y_i\},i=1,...,N,其中y_i \in\{-1,1\} {xi,yi},i=1,...,N,yi{1,1},并且有T个基分类器,则可以按照如下过程来训练基分类器;

  • 初始化训练数据的权值分布:

D 1 = ( w 11 , . . . , w 1 i , . . . , w 1 N ) D_1 = (w_{11},...,w_{1i},...,w_{1N}) D1=(w11,...,w1i,...,w1N),
w 1 i = 1 N , i = 1 , 3 , . . . , N w_{1i}=\frac{1}{N},i=1,3,...,N w1i=N1,i=1,3,...,N;

  • 令t = 1,2,…,T循环:

   a) 、使用具有权值分布 D t D_t Dt的训练数据集学习,得到基分类器:
H t ( x ) : x → { − 1 , 1 } H_t(x):x \to\{-1,1\} Ht(x):x{1,1}

   b) 、计算 H t ( x ) H_t(x) Ht(x)在训练数据集上的分类误差率:

ϵ t = ∑ i = 1 N t I [ h t ( x i ) ≠ y i ] w t ( x i ) \epsilon_t= \sum_{i=1}^{N_t}I[h_t(x_i) ≠y_i]w_t(x_i) ϵt=i=1NtI[ht(xi)=yi]wt(xi)

   ϵ t \epsilon_t ϵt一定满足 0 ≤ ϵ t ≤ 0.5 0≤\epsilon_t≤0.5 0ϵt0.5

   c) 、计算 H t ( x ) 的 系 数 α t H_t(x)的系数\alpha_t Ht(x)αt:

α t = 1 2 l o g 1 − ϵ t ϵ t \alpha_t=\frac{1}{2}log\frac{1-\epsilon_t}{\epsilon_t} αt=21logϵt1ϵt

在这里插入图片描述

   d) 更新训练数据集的权值分布:
D t + 1 = ( w t + 1 , 1 , . . . , w t + 1 , i , . . . , w t + 1 , N ) D_{t+1} = (w_{t+1,1},...,w_{t+1,i},...,w_{t+1,N}) Dt+1=(wt+1,1,...,wt+1,i,...,wt+1,N),
w t + 1 , i = w t i Z t e − α t y i H t ( x i ) , i = 1 , 3 , . . . , N w_{t+1,i}=\frac{w_{ti}}{Z_t}e^{-\alpha_ty_iH_t(x_i)},i=1,3,...,N wt+1,i=ZtwtieαtyiHt(xi),i=1,3,...,N;
  相当于:

w t + 1 , i = { w t , i Z t e − α t , H t ( x i ) = y i w t , i Z t e α t , H t ( x i ) ≠ y i w_{t+1,i}=\left\{ \begin{aligned} \frac{w_{t,i}}{Z_t}e^{-\alpha_t},H_t(x_i) = y_i \\ \frac{w_{t,i}}{Z_t}e^{\alpha_t},H_t(x_i) ≠ y_i \end{aligned} \right. wt+1,i=Ztwt,ieαtHt(xi)=yiZtwt,ieαtHt(xi)=yi

在这里插入图片描述

   Z m Z_m Zm是规范化因子,是为了保证每次权值总和为1:

Z t = ∑ i = 1 N w t , i e − α t y i H t ( x i ) Z_t = \sum_{i=1}^Nw_{t,i}e^{-\alpha_ty_iH_t(x_i)} Zt=i=1Nwt,ieαtyiHt(xi)

   三 、构建基本分类器的线性组合:

在这里插入图片描述
   得到最终分类器:
H ( x ) = s i g n ( ( f ( x ) ) = s i g n ( ∑ t = 1 T α t H t ( x ) ) H(x)=sign((f(x))=sign(\sum_{t=1}^T\alpha_tH_t(x)) H(x)=sign((f(x))=sign(t=1TαtHt(x))

在这里插入图片描述

2.3 示例

   假设弱分类器由x < v 或者 x >v产生,其中阈值v使该分类器在训练数据集上分类误差率最低。试用AdaBoost算法学习一个较强的分类器。

在这里插入图片描述
   根据上述:

   f 3 ( x ) = α 1 H 1 ( x ) + α 2 H 2 ( x ) + α 3 H 3 ( x ) = 0.4236 H 1 ( x ) + 0.6496 H 2 ( x ) + 0.7514 H 3 ( x ) f_3(x)=\alpha_1H_1(x)+\alpha_2H_2(x)+\alpha_3H_3(x)=0.4236H_1(x)+0.6496H_2(x)+0.7514H_3(x) f3(x)=α1H1(x)+α2H2(x)+α3H3(x)=0.4236H1(x)+0.6496H2(x)+0.7514H3(x)
f 3 ( x ) = { 0.4236 ∗ 1 + 0.6496 ∗ 1 + 0.7514 ∗ ( − 1 ) = 0.3218 , x < 2.5 0.4236 ∗ ( − 1 ) + 0.6496 ∗ 1 + 0.7514 ∗ ( − 1 ) = − 0.5254 , 2.5 < x < 5.5 0.4236 ∗ ( − 1 ) + 0.6496 ∗ 1 + 0.7514 ∗ 1 = 0.9774 , 5.5 < x < 8.5 0.4236 ∗ ( − 1 ) + 0.6496 ∗ ( − 1 ) + 0.7514 ∗ 1 = − 0.3218 , x > 8.5 f_3(x)=\left\{ \begin{aligned} &0.4236*1+0.6496*1+0.7514*(-1)=0.3218, x<2.5\\ &0.4236*(-1)+0.6496*1+0.7514*(-1)=-0.5254, 2.5<x<5.5\\ &0.4236*(-1)+0.6496*1+0.7514*1=0.9774, 5.5<x<8.5\\ &0.4236*(-1)+0.6496*(-1)+0.7514*1=-0.3218, x>8.5\\ \end{aligned} \right. f3(x)=0.42361+0.64961+0.7514(1)=0.3218,x<2.50.4236(1)+0.64961+0.7514(1)=0.5254,2.5<x<5.50.4236(1)+0.64961+0.75141=0.9774,5.5<x<8.50.4236(1)+0.6496(1)+0.75141=0.3218,x>8.5
s i g n [ f 3 ( x ) ] = { 1 ,     x < 2.5 − 1 ,     2.5 < x < 5.5 1 ,     5.5 < x < 8.5 − 1 ,     x > 8.5 sign[f_3(x)]=\left\{ \begin{aligned} &1, \ \ \ x<2.5\\ &-1, \ \ \ 2.5<x<5.5\\ &1, \ \ \ 5.5<x<8.5\\ &-1, \ \ \ x>8.5\\ \end{aligned} \right. sign[f3(x)]=1,   x<2.51,   2.5<x<5.51,   5.5<x<8.51,   x>8.5
   分类器 s i g n [ f 3 ( x ) ] sign[f_3(x)] sign[f3(x)]在训练数据集上有0个误分类点.。

2.4 AdaBoost算法解释

   上面讲到了分类Adaboost的弱学习器权重系数公式和样本权重更新公式。但是没有解释选择这个公式的原因,其实它是从Adaboost的损失函数推导出来。

   从另一个角度讲Adaboost是模型由基本分类器组成的加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。

   通过一轮轮的弱学习器学习,利用前一个强学习器的结果和当前弱学习器来更新当前的强学习器的模型,是前向分步学习算法(forword stagewise algorithrn)优化问题的基本思想。

   也就是说,假设第T-1轮的强学习器为:

f T − 1 ( x ) = ∑ i = 1 T − 1 α i H i ( x ) f_{T-1}(x) = \sum_{i=1}^{T-1}\alpha_iH_i(x) fT1(x)=i=1T1αiHi(x)

   而第T轮的强学习器为:

f T ( x ) = f T − 1 ( x ) + α T H T ( x ) f_{T}(x) = f_{T-1}(x)+ \alpha_TH_T(x) fT(x)=fT1(x)+αTHT(x)

   Adaboost损失函数为指数函数,即定义损失函数为:

arg min ⁡ α , H ∑ i = 1 N e − y i f T ( x ) \argmin_{\alpha,H}\sum_{i=1}^Ne^{-y_if_T(x)} α,Hargmini=1NeyifT(x)

   利用前向分步学习算法的关系可以得到损失函数为:

arg min ⁡ α , H ∑ i = 1 N e [ − y i . ( f T − 1 ( x ) + α T H T ( x ) ) ] \argmin_{\alpha,H}\sum_{i=1}^Ne^{[-y_i.( f_{T-1}(x)+ \alpha_TH_T(x))]} α,Hargmini=1Ne[yi.(fT1(x)+αTHT(x))]

  令 w T i ′ = e ( − y i f T − 1 ( x ) ) w_{Ti}^{'}=e^{(−y_if_{T−1}(x))} wTi=e(yifT1(x)), 它的值不依赖于α,G,因此与最小化无关,仅仅依赖于 f T − 1 ( x ) f_{T−1}(x) fT1(x),随着每一轮迭代而改变。

  将这个式子带入损失函数,损失函数转化为:

L ( α T , H T ( x ) ) = arg min ⁡ α , H ∑ i = 1 N w T i ′ e − α T y i H T ( x ) L(\alpha_T,H_T(x))=\argmin_{\alpha,H}\sum_{i=1}^Nw_{Ti}^{'}e^{- \alpha_Ty_iH_T(x)} L(αT,HT(x))=α,Hargmini=1NwTieαTyiHT(x)

  现在使 L ( α T , H T ( x ) ) L(\alpha_T,H_T(x)) L(αT,HT(x))达到最小的 α T ∗ \alpha_T^* αT H T ∗ ( x ) H_T^{*}(x) HT(x)就是AdaBoost算法所得 α T \alpha_T αT H T ( x ) H_T(x) HT(x)

  首先,求解 H T ∗ ( x ) H_T^{*}(x) HT(x)本质上是使得分类误差率最小)。所以对容易 α > 0 \alpha >0 α>0,使 L ( α T , H T ( x ) ) L(\alpha_T,H_T(x)) L(αT,HT(x))达到最小的 H T ( x ) H_T(x) HT(x)由下式得到:

H T ∗ ( x ) = arg min ⁡ H ∑ i = 1 N w T i ′ I ( y i ≠ H T ( x ) ) H_T^{*}(x)=\argmin_H\sum_{i=1}^Nw_{Ti}^{'}I(y_i≠H_T(x)) HT(x)=Hargmini=1NwTiI(yi=HT(x))

  之后,求解 α T ∗ \alpha_T^* αT

  由于:
∑ i = 1 N w T i ′ e − α T y i H T ( x ) = ∑ y i = H T ( x ) w T i ′ e − α T + ∑ y i ≠ H T ( x ) w T i ′ e α T = e − α T ∑ y i = H T ( x ) w T i ′ + e α T ∑ y i ≠ H T ( x ) w T i ′ = e − α T ∑ y i = H T ( x ) w T i ′ + e − α T ∑ y i ≠ H T ( x ) w T i ′ + e α T ∑ y i ≠ H T ( x ) w T i ′ − e − α T ∑ y i ≠ H T ( x ) w T i ′ = e − α T ∑ i = 1 N w T i ′ + ( e α T − e − α T ) ∑ y i ≠ H T ( x ) w T i ′ \begin{aligned} &\sum_{i=1}^Nw_{Ti}^{'}e^{ -\alpha_Ty_iH_T(x)}\\ &= \sum_{y_i=H_T(x)}w_{Ti}^{'}e^{ -\alpha_T}+\sum_{y_i≠H_T(x)}w_{Ti}^{'}e^{ \alpha_T}\\ &= e^{ -\alpha_T}\sum_{y_i=H_T(x)}w_{Ti}^{'}+e^{ \alpha_T}\sum_{y_i≠H_T(x)}w_{Ti}^{'}\\ &= e^{ -\alpha_T}\sum_{y_i=H_T(x)}w_{Ti}^{'}+e^{ -\alpha_T}\sum_{y_i≠H_T(x)}w_{Ti}^{'}+e^{ \alpha_T}\sum_{y_i≠H_T(x)}w_{Ti}^{'}-e^{ -\alpha_T}\sum_{y_i≠H_T(x)}w_{Ti}^{'}\\ &=e^{-\alpha_T}\sum_{i=1}^Nw_{Ti}^{'}+(e^{ \alpha_T}-e^{- \alpha_T})\sum_{y_i≠H_T(x)}w_{Ti}^{'} \\ \end{aligned} i=1NwTieαTyiHT(x)=yi=HT(x)wTieαT+yi=HT(x)wTieαT=eαTyi=HT(x)wTi+eαTyi=HT(x)wTi=eαTyi=HT(x)wTi+eαTyi=HT(x)wTi+eαTyi=HT(x)wTieαTyi=HT(x)wTi=eαTi=1NwTi+(eαTeαT)yi=HT(x)wTi
  对 α T \alpha_T αT求导,使其等于0:

∂ ( e − α T ∑ i = 1 N w T i ′ + ( e α T − e − α T ) ∑ y i ≠ H T ( x ) w T i ′ ) ∂ α T = − e − α T ∑ i = 1 N w T i ′ + e α T ∑ y i ≠ H T ( x ) w T i ′ + e − α T ∑ y i ≠ H T ( x ) w T i ′ = − e − α T ( ∑ i = 1 N w T i ′ − ∑ y i ≠ H T ( x ) w T i ′ ) + e α T ∑ y i ≠ H T ( x ) w T i ′ = − e − α T ∑ y i = H T ( x ) w T i ′ + e α T ∑ y i ≠ H T ( x ) w T i ′ = 0 \begin{aligned} &\frac{\partial(e^{-\alpha_T}\sum_{i=1}^Nw_{Ti}^{'}+(e^{ \alpha_T}-e^{- \alpha_T})\sum_{y_i≠H_T(x)}w_{Ti}^{'})}{\partial{\alpha_{T}}} \\ &=-e^{-\alpha_T}\sum_{i=1}^Nw_{Ti}^{'}+e^{ \alpha_T}\sum_{y_i≠H_T(x)}w_{Ti}^{'}+e^{ -\alpha_T}\sum_{y_i≠H_T(x)}w_{Ti}^{'}\\ &= -e^{-\alpha_T}(\sum_{i=1}^Nw_{Ti}^{'}-\sum_{y_i≠H_T(x)}w_{Ti}^{'})+e^{ \alpha_T}\sum_{y_i≠H_T(x)}w_{Ti}^{'}\\ &=-e^{-\alpha_T}\sum_{y_i=H_T(x)}w_{Ti}^{'}+e^{ \alpha_T}\sum_{y_i≠H_T(x)}w_{Ti}^{'}\\ &=0 \end{aligned} αT(eαTi=1NwTi+(eαTeαT)yi=HT(x)wTi)=eαTi=1NwTi+eαTyi=HT(x)wTi+eαTyi=HT(x)wTi=eαT(i=1NwTiyi=HT(x)wTi)+eαTyi=HT(x)wTi=eαTyi=HT(x)wTi+eαTyi=HT(x)wTi=0
  则:

e − α T ∑ y i = H T ( x ) w T i ′ = e α T ∑ y i ≠ H T ( x ) w T i ′ 两 边 同 时 取 对 数 l n ( e − α T ∑ y i = H T ( x ) w T i ′ ) = l n ( e α T ∑ y i ≠ H T ( x ) w T i ′ ) ⇒ l n ( e − α T ) + l n ( ∑ y i = H T ( x ) w T i ′ ) = l n e α T + l n ( ∑ y i ≠ H T ( x ) w T i ′ ) ⇒ 2 α T = l n ( ∑ y i = H T ( x ) w T i ′ ) − l n ( ∑ y i ≠ H T ( x ) w T i ′ ) ⇒ α T = 1 2 l n ( ∑ y i = H T ( x ) w T i ′ ∑ y i ≠ H T ( x ) w T i ′ ) ⇒ α T = 1 2 l n ( ∑ i = 1 N w T i ′ − ∑ y i ≠ H T ( x ) w T i ′ ∑ y i ≠ H T ( x ) w T i ′ ) ⇒ α T = 1 2 l n ( ∑ i = 1 N w T i ′ ∑ i = 1 N w T i ′ − ∑ y i ≠ H T ( x ) w T i ′ ∑ i = 1 N w T i ′ ∑ y i ≠ H T ( x ) w T i ′ ∑ i = 1 N w T i ′ ) ⇒ α T = 1 2 l n ( 1 − ϵ T ϵ T ) \begin{aligned} &e^{-\alpha_T}\sum_{y_i=H_T(x)}w_{Ti}^{'}=e^{ \alpha_T}\sum_{y_i≠H_T(x)}w_{Ti}^{'}\\ &\\ &两边同时取对数\\ &\\ &ln(e^{-\alpha_T}\sum_{y_i=H_T(x)}w_{Ti}^{'})=ln(e^{ \alpha_T}\sum_{y_i≠H_T(x)}w_{Ti}^{'})\\ &\Rightarrow ln(e^{-\alpha_T})+ln(\sum_{y_i=H_T(x)}w_{Ti}^{'})=lne^{ \alpha_T}+ln(\sum_{y_i≠H_T(x)}w_{Ti}^{'})\\ &\Rightarrow 2\alpha_T=ln(\sum_{y_i=H_T(x)}w_{Ti}^{'})-ln(\sum_{y_i≠H_T(x)}w_{Ti}^{'})\\ &\Rightarrow\alpha_T=\frac{1}{2}ln(\frac{\sum_{y_i=H_T(x)}w_{Ti}^{'}}{\sum_{y_i≠H_T(x)}w_{Ti}^{'}})\\ &\Rightarrow\alpha_T=\frac{1}{2}ln(\frac{\sum_{i=1}^Nw_{Ti}^{'}-\sum_{y_i≠H_T(x)}w_{Ti}^{'}}{\sum_{y_i≠H_T(x)}w_{Ti}^{'}})\\ &\Rightarrow\alpha_T=\frac{1}{2}ln(\frac{\frac{\sum_{i=1}^Nw_{Ti}^{'}}{\sum_{i=1}^Nw_{Ti}^{'}}-\frac{\sum_{y_i≠H_T(x)}w_{Ti}^{'}}{\sum_{i=1}^Nw_{Ti}^{'}}}{\frac{\sum_{y_i≠H_T(x)}w_{Ti}^{'}}{\sum_{i=1}^Nw_{Ti}^{'}}})\\ &\Rightarrow\alpha_T = \frac{1}{2}ln(\frac{1-\epsilon_T}{\epsilon_T}) \end{aligned} eαTyi=HT(x)wTi=eαTyi=HT(x)wTiln(eαTyi=HT(x)wTi)=ln(eαTyi=HT(x)wTi)ln(eαT)+ln(yi=HT(x)wTi)=lneαT+ln(yi=HT(x)wTi)2αT=ln(yi=HT(x)wTi)ln(yi=HT(x)wTi)αT=21ln(yi=HT(x)wTiyi=HT(x)wTi)αT=21ln(yi=HT(x)wTii=1NwTiyi=HT(x)wTi)αT=21ln(i=1NwTiyi=HT(x)wTii=1NwTii=1NwTii=1NwTiyi=HT(x)wTi)αT=21ln(ϵT1ϵT)

  其中 ϵ T = ∑ i = 1 N t I [ h t ( x i ) ≠ y i ] w t ( x i ) \epsilon_T= \sum_{i=1}^{N_t}I[h_t(x_i) ≠y_i]w_t(x_i) ϵT=i=1NtI[ht(xi)=yi]wt(xi)

  更新样本权值 w t + 1 , i ′ w_{t+1,i}^{'} wt+1,i:

  根据公式 w t , i ′ = e ( − y i f t − 1 ( x ) ) w_{t,i}^{'}=e^{(−y_if_{t−1}(x))} wt,i=e(yift1(x)) f t ( x ) = f t − 1 ( x ) + α t H t ( x ) f_{t}(x) = f_{t-1}(x)+ \alpha_tH_t(x) ft(x)=ft1(x)+αtHt(x),有

w t + 1 , i ′ = e ( − y i f t ( x ) ) = e [ − y i ( f t − 1 ( x ) + α t H t ( x ) ) ] = e − y i f t − 1 ( x ) . e − y i α t H t ( x ) = w t , i ′ . e − y i α t H t ( x ) \begin{aligned} &w_{t+1,i}^{'}=e^{(−y_if_{t}(x))}\\ &=e^{[−y_i(f_{t-1}(x)+ \alpha_tH_t(x))]}\\ &=e^{−y_if_{t-1}(x)}.e^{−y_i \alpha_tH_t(x)}\\ &=w_{t,i}^{'}.e^{−y_i \alpha_tH_t(x)} \end{aligned} wt+1,i=e(yift(x))=e[yi(ft1(x)+αtHt(x))]=eyift1(x).eyiαtHt(x)=wt,i.eyiαtHt(x)

  只相差归一化因子 Z t Z_t Zt

2.5 优缺点

Adaboost的主要优点有:

  • Adaboost作为分类器时,具有很高的精度,错误率是以指数速率下降,并且不考虑基学习器的错误率下界。;

  • 在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活;

  • 作为简单的二元分类器时,构造简单,不需要做特征筛选,结果可解释;

  • 即使训练次数很多,也不会出现过拟合的问题;

  • 充分考虑每个分类器的权重;

  • 可以处理连续值和离散值;

Adaboost的主要缺点有:

  • 对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性;

  • 训练时会过于偏向分类困难的数据,导致Adaboost容易受噪声数据干扰;

  • 数据不平衡导致分类精度下降(关注的是分类器的整体性能,而没有给予小类更多的关注);

  • 依赖于弱分类器,训练时间可能比较长,而且每次重新都得选择当前分类器最好切分点;

  • 迭代次数(弱分类器数目)不好确定;


  • LR/SVM/softmax/Adaboost损失函数之间的差别?
    softmax模型是LR模型从⼆分类推⼴到多分类的模型,两者损失函数都是对数损失。
    SVM使⽤的是合⻚损失,分类边界只受限于⽀持向量。
    Adaboost损失函数是指数损失。

参考文献

1.《统计学习方法 李航著》

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值