Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
sklearn-doc-zh
提交
946b7a57
S
sklearn-doc-zh
项目概览
OpenDocCN
/
sklearn-doc-zh
通知
3
Star
3
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
sklearn-doc-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
946b7a57
编写于
9月 15, 2019
作者:
H
Hanmin Qin
提交者:
loopyme
9月 16, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1.11 集成方法 (0.21.3)
上级
e129469f
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
19 addition
and
13 deletion
+19
-13
docs/0.21.3/12.md
docs/0.21.3/12.md
+19
-13
未找到文件。
docs/0.21.3/12.md
浏览文件 @
946b7a57
...
@@ -7,6 +7,8 @@
...
@@ -7,6 +7,8 @@
[
@小瑶
](
https://github.com/apachecn/scikit-learn-doc-zh
)
[
@小瑶
](
https://github.com/apachecn/scikit-learn-doc-zh
)
[
@\S^R^Y/
](
https://github.com/apachecn/scikit-learn-doc-zh
)
[
@\S^R^Y/
](
https://github.com/apachecn/scikit-learn-doc-zh
)
[
@Loopy
](
https://github.com/loopyme
)
[
@Loopy
](
https://github.com/loopyme
)
[
@qinhanmin2014
](
https://github.com/qinhanmin2014
)
翻译者:
翻译者:
[
@StupidStalker
](
https://github.com/apachecn/scikit-learn-doc-zh
)
[
@StupidStalker
](
https://github.com/apachecn/scikit-learn-doc-zh
)
[
@文谊
](
https://github.com/apachecn/scikit-learn-doc-zh
)
[
@文谊
](
https://github.com/apachecn/scikit-learn-doc-zh
)
...
@@ -28,7 +30,7 @@
...
@@ -28,7 +30,7 @@
## 1.11.1. Bagging meta-estimator(Bagging 元估计器)
## 1.11.1. Bagging meta-estimator(Bagging 元估计器)
在集成算法中,bagging 方法会在原始训练集的随机子集上构建一类黑盒估计器的多个实例,然后把这些估计器的预测结果结合起来形成最终的预测结果。 该方法通过在构建模型的过程中引入随机性,来减少基估计器的方差(例如,决策树)。 在多数情况下,bagging 方法提供了一种非常简单的方式来对单一模型进行改进,而无需修改背后的算法。 因为 bagging 方法可以减小过拟合,所以通常在强分类器和复杂模型上使用时表现的很好(例如,完全决策树,fully developed decision trees),相比之下 boosting 方法则在弱模型上表现更好(例如,浅层决策树,shallow decision trees)。
在集成算法中,bagging 方法会在原始训练集的随机子集上构建一类黑盒估计器的多个实例,然后把这些估计器的预测结果结合起来形成最终的预测结果。 该方法通过在构建模型的过程中引入随机性,来减少基估计器的方差(例如,决策树)。 在多数情况下,bagging 方法提供了一种非常简单的方式来对单一模型进行改进,而无需修改背后的算法。 因为 bagging 方法可以减小过拟合,所以通常在强分类器和复杂模型上使用时表现的很好(例如,完全
生长的
决策树,fully developed decision trees),相比之下 boosting 方法则在弱模型上表现更好(例如,浅层决策树,shallow decision trees)。
bagging 方法有很多种,其主要区别在于随机抽取训练子集的方法不同:
bagging 方法有很多种,其主要区别在于随机抽取训练子集的方法不同:
...
@@ -37,7 +39,7 @@ bagging 方法有很多种,其主要区别在于随机抽取训练子集的方
...
@@ -37,7 +39,7 @@ bagging 方法有很多种,其主要区别在于随机抽取训练子集的方
*
如果抽取的数据集的随机子集是特征的随机子集,我们叫做随机子空间 (Random Subspaces) [H1998] 。
*
如果抽取的数据集的随机子集是特征的随机子集,我们叫做随机子空间 (Random Subspaces) [H1998] 。
*
最后,如果基估计器构建在对于样本和特征抽取的子集之上时,我们叫做随机补丁 (Random Patches) [LG2012]。
*
最后,如果基估计器构建在对于样本和特征抽取的子集之上时,我们叫做随机补丁 (Random Patches) [LG2012]。
在 scikit-learn 中,bagging 方法使用统一的
[
`BaggingClassifier`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html#sklearn.ensemble.BaggingClassifier
"sklearn.ensemble.BaggingClassifier"
)
元估计器(或者
[
`BaggingRegressor`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingRegressor.html#sklearn.ensemble.BaggingRegressor
"sklearn.ensemble.BaggingRegressor"
)
),
输入的参数
和随机子集抽取策略由用户指定。
`max_samples`
和
`max_features`
控制着子集的大小(对于样例和特征),
`bootstrap`
和
`bootstrap_features`
控制着样例和特征的抽取是有放回还是无放回的。 当使用样本子集时,通过设置
`oob_score=True`
,可以使用袋外(out-of-bag)样本来评估泛化精度。下面的代码片段说明了如何构造一个
`KNeighborsClassifier`
估计器的 bagging 集成实例,每一个基估计器都建立在 50% 的样本随机子集和 50% 的特征随机子集上。
在 scikit-learn 中,bagging 方法使用统一的
[
`BaggingClassifier`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html#sklearn.ensemble.BaggingClassifier
"sklearn.ensemble.BaggingClassifier"
)
元估计器(或者
[
`BaggingRegressor`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingRegressor.html#sklearn.ensemble.BaggingRegressor
"sklearn.ensemble.BaggingRegressor"
)
),
基估计器
和随机子集抽取策略由用户指定。
`max_samples`
和
`max_features`
控制着子集的大小(对于样例和特征),
`bootstrap`
和
`bootstrap_features`
控制着样例和特征的抽取是有放回还是无放回的。 当使用样本子集时,通过设置
`oob_score=True`
,可以使用袋外(out-of-bag)样本来评估泛化精度。下面的代码片段说明了如何构造一个
`KNeighborsClassifier`
估计器的 bagging 集成实例,每一个基估计器都建立在 50% 的样本随机子集和 50% 的特征随机子集上。
```
py
```
py
>>>
from
sklearn.ensemble
import
BaggingClassifier
>>>
from
sklearn.ensemble
import
BaggingClassifier
...
@@ -75,13 +77,17 @@ bagging 方法有很多种,其主要区别在于随机抽取训练子集的方
...
@@ -75,13 +77,17 @@ bagging 方法有很多种,其主要区别在于随机抽取训练子集的方
### 1.11.2.1. 随机森林
### 1.11.2.1. 随机森林
在随机森林中(参见
[
`RandomForestClassifier`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier
"sklearn.ensemble.RandomForestClassifier"
)
和
[
`RandomForestRegressor`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html#sklearn.ensemble.RandomForestRegressor
"sklearn.ensemble.RandomForestRegressor"
)
类), 集成模型中的每棵树构建时的样本都是由训练集经过有放回抽样得来的(例如,自助采样法-bootstrap sample,这里采用西瓜书中的译法)。 另外,在构建树的过程中进行结点分割时,选择的分割点不再是所有特征中最佳分割点,而是特征的一个随机子集中的最佳分割点。 由于这种随机性,森林的偏差通常会有略微的增大(相对于单个非随机树的偏差),但是由于取了平均,其方差也会减小,通常能够补偿偏差的增加,从而产生一个总体上更好的模型。
在随机森林中(参见
[
`RandomForestClassifier`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier
"sklearn.ensemble.RandomForestClassifier"
)
和
[
`RandomForestRegressor`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html#sklearn.ensemble.RandomForestRegressor
"sklearn.ensemble.RandomForestRegressor"
)
类), 集成模型中的每棵树构建时的样本都是由训练集经过有放回抽样得来的(例如,自助采样法-bootstrap sample,这里采用西瓜书中的译法)。
另外,在构建树的过程中进行结点分割时,选择的分割点是所有特征的最佳分割点,或特征的大小为
`max_features`
的随机子集的最佳分割点。
这两种随机性的目的是降低估计器的方差。的确,单棵决策树通常具有高方差,容易过拟合。随机森林构建过程的随机性能够产生具有不同预测错误的决策树。通过取这些决策树的平均,能够消除部分错误。随机森林虽然能够通过组合不同的树降低方差,但是有时会略微增加偏差。在实际问题中,方差的降低通常更加显著,所以随机森林能够取得更好地效果。
与原始文献[B2001]不同的是,scikit-learn 的实现是取每个分类器预测概率的平均,而不是让每个分类器对类别进行投票。
与原始文献[B2001]不同的是,scikit-learn 的实现是取每个分类器预测概率的平均,而不是让每个分类器对类别进行投票。
### 1.11.2.2. 极限随机树
### 1.11.2.2. 极限随机树
在极限随机树中(参见
[
`ExtraTreesClassifier`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier
"sklearn.ensemble.ExtraTreesClassifier"
)
和
[
`ExtraTreesRegressor`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesRegressor.html#sklearn.ensemble.ExtraTreesRegressor
"sklearn.ensemble.ExtraTreesRegressor"
)
类), 计算分割点方法中的随机性进一步增强。
在随机森林中,使用的特征是候选特征的随机子集;不同于寻找最具有区分度的阈值,
这里的阈值是针对每个候选特征随机生成的,并且选择这些随机生成的阈值中的最佳者作为分割规则。 这种做法通常能够减少一点模型的方差,代价则是略微地增大偏差:
在极限随机树中(参见
[
`ExtraTreesClassifier`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier
"sklearn.ensemble.ExtraTreesClassifier"
)
和
[
`ExtraTreesRegressor`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesRegressor.html#sklearn.ensemble.ExtraTreesRegressor
"sklearn.ensemble.ExtraTreesRegressor"
)
类), 计算分割点方法中的随机性进一步增强。
与随机森林相同,使用的特征是候选特征的随机子集;但是不同于随机森林寻找最具有区分度的阈值,
这里的阈值是针对每个候选特征随机生成的,并且选择这些随机生成的阈值中的最佳者作为分割规则。 这种做法通常能够减少一点模型的方差,代价则是略微地增大偏差:
```
py
```
py
>>>
from
sklearn.model_selection
import
cross_val_score
>>>
from
sklearn.model_selection
import
cross_val_score
...
@@ -116,11 +122,11 @@ True
...
@@ -116,11 +122,11 @@ True
### 1.11.2.3. 参数
### 1.11.2.3. 参数
使用这些方法时要调整的参数主要是
`n_estimators`
和
`max_features`
。 前者(n_estimators)是森林里树的数量,通常数量越大,效果越好,但是计算时间也会随之增加。 此外要注意,当树的数量超过一个临界值之后,算法的效果并不会很显著地变好。 后者(max_features)是分割节点时考虑的特征的随机子集的大小。 这个值越低,方差减小得越多,但是偏差的增大也越多。 根据经验,回归问题中使用
`max_features =
n_features`
, 分类问题使用
`max_features = sqrt(n_features`
(
其中
`n_features`
是特征的个数)是比较好的默认值。
`max_depth = None`
和
`min_samples_split = 2`
结合通常会有不错的效果(即生成完全的树)。 请记住,这些(默认)值通常不是最佳的,同时还可能消耗大量的内存,最佳参数值应由交叉验证获得。 另外,请注意,在随机森林中,默认使用自助采样法(
`bootstrap = True`
), 然而 extra-trees 的默认策略是使用整个数据集(
`bootstrap = False`
)。 当使用自助采样法方法抽样时,泛化精度是可以通过剩余的或者袋外的样本来估算的,设置
`oob_score = True`
即可实现。
使用这些方法时要调整的参数主要是
`n_estimators`
和
`max_features`
。 前者(n_estimators)是森林里树的数量,通常数量越大,效果越好,但是计算时间也会随之增加。 此外要注意,当树的数量超过一个临界值之后,算法的效果并不会很显著地变好。 后者(max_features)是分割节点时考虑的特征的随机子集的大小。 这个值越低,方差减小得越多,但是偏差的增大也越多。 根据经验,回归问题中使用
`max_features =
None`
(总是考虑所有的特征), 分类问题使用
`max_features = "sqrt"`
(随机考虑
`sqrt(n_features)`
特征,
其中
`n_features`
是特征的个数)是比较好的默认值。
`max_depth = None`
和
`min_samples_split = 2`
结合通常会有不错的效果(即生成完全的树)。 请记住,这些(默认)值通常不是最佳的,同时还可能消耗大量的内存,最佳参数值应由交叉验证获得。 另外,请注意,在随机森林中,默认使用自助采样法(
`bootstrap = True`
), 然而 extra-trees 的默认策略是使用整个数据集(
`bootstrap = False`
)。 当使用自助采样法方法抽样时,泛化精度是可以通过剩余的或者袋外的样本来估算的,设置
`oob_score = True`
即可实现。
>注意:
>注意:
>
>
>默认参数下模型复杂度是:`O(M*N*log(N))` , 其中 `M` 是树的数目, `N` 是样本数。 可以通过设置以下参数来降低模型复杂度: `min_samples_split` , `m
in_samples_leaf` , `max_leaf_nodes`` 和 ``max_depth`
。
>默认参数下模型复杂度是:`O(M*N*log(N))` , 其中 `M` 是树的数目, `N` 是样本数。 可以通过设置以下参数来降低模型复杂度: `min_samples_split` , `m
ax_leaf_nodes` , `max_depth` 和 `min_samples_leaf`
。
### 1.11.2.4. 并行化
### 1.11.2.4. 并行化
...
@@ -138,9 +144,9 @@ True
...
@@ -138,9 +144,9 @@ True
### 1.11.2.5. 特征重要性评估
### 1.11.2.5. 特征重要性评估
特征对目标变量预测的相对重要性可以通过(树中的决策节点的)特征使用的相对顺序(即深度)来进行评估。 决策树顶部使用的特征对更大一部分输入样本的最终预测决策做出贡献;因此,可以使用接受每个特征对最终预测的贡献的样本比例来评估该
**特征的相对重要性**
。
特征对目标变量预测的相对重要性可以通过(树中的决策节点的)特征使用的相对顺序(即深度)来进行评估。 决策树顶部使用的特征对更大一部分输入样本的最终预测决策做出贡献;因此,可以使用接受每个特征对最终预测的贡献的样本比例来评估该
**特征的相对重要性**
。
scikit-learn通过将特征贡献的样本比例与纯度减少相结合得到特征的重要性。
通过对多个随机树中的
**预期贡献率**
(expected activity rates)
**取平均**
,可以减少这种估计的
**方差**
,并将其用于特征选择。
通过对多个随机树中的
**预期贡献率**
(expected activity rates)
**取平均**
,可以减少这种估计的
**方差**
,并将其用于特征选择。
这被称作平均纯度减少,或MDI。关于MDI以及随机森林特征重要性的更多信息,请参考[L2014]。
下面的例子展示了一个面部识别任务中每个像素的相对重要性,其中重要性由颜色(的深浅)来表示,使用的模型是
[
`ExtraTreesClassifier`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier
"sklearn.ensemble.ExtraTreesClassifier"
)
。
下面的例子展示了一个面部识别任务中每个像素的相对重要性,其中重要性由颜色(的深浅)来表示,使用的模型是
[
`ExtraTreesClassifier`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier
"sklearn.ensemble.ExtraTreesClassifier"
)
。
...
@@ -158,7 +164,7 @@ True
...
@@ -158,7 +164,7 @@ True
### 1.11.2.6. 完全随机树嵌入
### 1.11.2.6. 完全随机树嵌入
[
`RandomTreesEmbedding`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomTreesEmbedding.html#sklearn.ensemble.RandomTreesEmbedding
"sklearn.ensemble.RandomTreesEmbedding"
)
实现了一个无监督的数据转换。 通过由完全随机树构成的森林,
[
`RandomTreesEmbedding`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomTreesEmbedding.html#sklearn.ensemble.RandomTreesEmbedding
"sklearn.ensemble.RandomTreesEmbedding"
)
使用数据最终归属的叶子节点的索引值(编号)对数据进行编码。 该索引以 one-of-K 方式编码,最终形成一个高维的稀疏二进制编码。 这种编码可以被非常高效地计算出来,并且可以作为其他学习任务的基础。 编码的大小和稀疏度可以通过选择树的数量和每棵树的最大深度来确定。对于集成中的每棵树的
每个节点包含一个实例(校对者注:这里真的没搞懂)
。 编码的大小(维度)最多为
`n_estimators * 2 ** max_depth`
,即森林中的叶子节点的最大数。
[
`RandomTreesEmbedding`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomTreesEmbedding.html#sklearn.ensemble.RandomTreesEmbedding
"sklearn.ensemble.RandomTreesEmbedding"
)
实现了一个无监督的数据转换。 通过由完全随机树构成的森林,
[
`RandomTreesEmbedding`
](
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomTreesEmbedding.html#sklearn.ensemble.RandomTreesEmbedding
"sklearn.ensemble.RandomTreesEmbedding"
)
使用数据最终归属的叶子节点的索引值(编号)对数据进行编码。 该索引以 one-of-K 方式编码,最终形成一个高维的稀疏二进制编码。 这种编码可以被非常高效地计算出来,并且可以作为其他学习任务的基础。 编码的大小和稀疏度可以通过选择树的数量和每棵树的最大深度来确定。对于集成中的每棵树的
,每个样本对应其中的一个叶节点
。 编码的大小(维度)最多为
`n_estimators * 2 ** max_depth`
,即森林中的叶子节点的最大数。
由于相邻数据点更可能位于树的同一叶子中,该变换可以作为一种隐式地非参数密度估计。
由于相邻数据点更可能位于树的同一叶子中,该变换可以作为一种隐式地非参数密度估计。
...
@@ -200,7 +206,7 @@ AdaBoost 既可以用在分类问题也可以用在回归问题中:
...
@@ -200,7 +206,7 @@ AdaBoost 既可以用在分类问题也可以用在回归问题中:
```
```
弱学习器的数量由参数
`n_estimators`
来控制。
`learning_rate`
参数用来控制每个弱学习器对 最终的结果的贡献程度(校对者注:其实应该就是控制每个弱学习器的权重修改速率
,这里不太记得了,不确定
)。 弱学习器默认使用决策树。不同的弱学习器可以通过参数
`base_estimator`
来指定。 获取一个好的预测结果主要需要调整的参数是
`n_estimators`
和
`base_estimator`
的复杂度 (例如:对于弱学习器为决策树的情况,树的深度
`max_depth`
或叶子节点的最小样本数
`min_samples_leaf`
等都是控制树的复杂度的参数)
弱学习器的数量由参数
`n_estimators`
来控制。
`learning_rate`
参数用来控制每个弱学习器对 最终的结果的贡献程度(校对者注:其实应该就是控制每个弱学习器的权重修改速率)。 弱学习器默认使用决策树。不同的弱学习器可以通过参数
`base_estimator`
来指定。 获取一个好的预测结果主要需要调整的参数是
`n_estimators`
和
`base_estimator`
的复杂度 (例如:对于弱学习器为决策树的情况,树的深度
`max_depth`
或叶子节点的最小样本数
`min_samples_leaf`
等都是控制树的复杂度的参数)
> **示例**:
> **示例**:
>
>
...
@@ -334,7 +340,7 @@ GBRT 可以认为是以下形式的可加模型:
...
@@ -334,7 +340,7 @@ GBRT 可以认为是以下形式的可加模型:
![F_m(x) = F_{m-1}(x) + \arg\min_{h} \sum_{i=1}^{n} L(y_i,F_{m-1}(x_i) - h(x))](img/887928b507a2f01847b6ae5f5b0e733f.jpg)
![F_m(x) = F_{m-1}(x) + \arg\min_{h} \sum_{i=1}^{n} L(y_i,F_{m-1}(x_i) - h(x))](img/887928b507a2f01847b6ae5f5b0e733f.jpg)
初始模型 ![F_{0}](img/5d8cf5fcf13a72776158a787bc29143c.jpg)
是问题的具体
,对于最小二乘回归,通常选择目标值的平均值.
初始模型 ![F_{0}](img/5d8cf5fcf13a72776158a787bc29143c.jpg)
根据不同的问题指定
,对于最小二乘回归,通常选择目标值的平均值.
>**注意**:初始化模型也能够通过 `init` 参数来指定,但传递的对象需要实现 `fit` 和 `predict` 函数。
>**注意**:初始化模型也能够通过 `init` 参数来指定,但传递的对象需要实现 `fit` 和 `predict` 函数。
...
@@ -522,9 +528,9 @@ Accuracy: 0.95 (+/- 0.04) [Ensemble]
...
@@ -522,9 +528,9 @@ Accuracy: 0.95 (+/- 0.04) [Ensemble]
[
![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_voting_decision_regions_0011.png
](
img/e02e680946360c19e1cee28c92173bc4.jpg
)
](https://scikit-learn.org/stable/auto_examples/ensemble/plot_voting_decision_regions.html)
[
![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_voting_decision_regions_0011.png
](
img/e02e680946360c19e1cee28c92173bc4.jpg
)
](https://scikit-learn.org/stable/auto_examples/ensemble/plot_voting_decision_regions.html)
### 1.11.5.3. 投票分类器(VotingClassifier)在网格搜索(GridSearch)应用
### 1.11.5.3. 投票分类器(VotingClassifier)在网格搜索(GridSearch
CV
)应用
为了调整每个估计器的超参数,
*VotingClassifier*
也可以和
*GridSearch*
一起使用:
为了调整每个估计器的超参数,
*VotingClassifier*
也可以和
*GridSearch
CV
*
一起使用:
```
py
```
py
>>>
from
sklearn.model_selection
import
GridSearchCV
>>>
from
sklearn.model_selection
import
GridSearchCV
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录