机器学习的万字长总结模型评估和参数调整,带代码下载

3927 Views 0 Comments

原标题:机器学习的模型评估和参数调整的一万字长摘要,带代码下载

选自p .ython-machine-learning-book on github

作者: 塞巴斯蒂安·拉什卡·

萨姆·[翻译和组织/s2/]

这一系列的文章已经写了很长时间,但最终还是完成了。今晚我将总结之前的内容,同时,我将打包并共享相关代码,后台将回复“评估”以获取它。

这一系列的文章已经写了很长时间,但最终还是完成了。今晚我将总结之前的内容,同时,我将打包并共享相关代码,后台将回复“评估”以获取它。

由于这篇文章很长,我最好先把目录提前。

一、了解管道流量

1.1数据导入

1.2使用管道创建工作流

二.k折交叉验证

2.1 K折叠交叉验证原则

2.2 K折叠交叉验证的实现

第三,曲线参数调整

3.1模型精度

3.2绘制学习曲线,获得样本数与准确率之间的关系

3.3绘制验证曲线,获得超参数与准确率的关系

四.网格搜索

4.1循环暴力检索的两层

4.2词典暴力检索的构建

五、嵌套交叉验证

六.相关评价指标

6.1混淆矩阵及其实现

6.2相关评价指标的实施

展开全文

6.3 ROC曲线及其实现

一、了解管道流量

一、了解管道流量

今天,让我们首先介绍管道工作流的操作。

“管道工作流”的概念可能有点奇怪,但实际上它可以理解为一个容器,然后我们需要执行的所有操作都被封装在这个管道中进行操作,例如数据标准化、特征维数降低、主成分分析、模型预测等。下面是一个解释的例子。

1.1数据导入和预处理

这次我们导入了一个包含569个样本的威斯康星乳腺癌二元数据集。第一列是主键标识,第二列是类别值(M=恶性肿瘤,B=良性肿瘤),第三至32列是实值的特征。

首先导入数据集:

1#导入相关数据集

2导入和as aspd

3导入正确

4try:

5df = PD . read _ CSV(' https://archive . ics . UCI . edu/ml/machine-learning-databases '

6 '/乳腺癌-威斯康星/wdbc .数据',表头=无)

7 excepurlib . error . urlError:

8df = PD . read _ CSV(' https://raw . githubuser content . com/rasbt/'

9 ' python-machine-learning-book/master/code/'

10 '数据集/wdbc/wdbc.data ',标头=无)

11打印('行,列:',df.shape)

12df.head

使用我们已经学会的标签编码器来转换类别特征:

1来自sklearn .预处理导入标签编码器

2X = df.loc[:,2:]。价值观念

3y = df.loc[:,1]。价值观念

4le =标签编码器

5#将目标转换为0-1变量

6y = le.fit_transform(y)

7le.transform(['M ',' B'])

划分培训验证集:

1##创建培训集和测试集

2 fromsk learn . model _ selection import train _ test _ split

3X_train,X_test,y_train,y_test =

4train_test_split(X,y,test_size= 0.20,random_state= 1)

1.2使用管道创建工作流

许多机器学习算法需要相同范围的特征值,因此这些特征需要标准化。此外,我们还希望将原始的30维特征压缩成更少的维,这需要主成分分析、主成分分析和逻辑回归预测。

管道对象接收元组列表作为输入,每个元组的第一个值用作变量名,元组的第二个元素是sklearn中的transformer或Assessor。管道中间的每一步都由sklearn中的变压器组成,最后一步是估计器。

在该数据集中,管道包括两个中间步骤:标准标度器和主成分分析,两者都属于变压器,而逻辑回归分类器属于估计器。

在本例中,当pipe_lr执行拟合方法时:

1)标准缩放器执行拟合和变换方法;

2)将转换后的数据输入主成分分析;;

3)主成分分析还执行拟合和变换方法;

4)将最终数据输入物流出口,以训练LR模型。

对于管道,多少变压器可以是。管道的工作方式如下图所示(请务必注意,管道执行fit方法,而转换器执行fit_transform):

上述代码实现如下:

1 Froms Klearn。预处理导入标准缩放器#用于数据标准化

2弗洛姆·克伦。分解导入PCA #用于特征降维

3弗洛姆·克伦。线性模型导入逻辑表达式#用于模型预测

4 fromsk learn . pipeline Import Pipeline

5管道=管道([(‘SCL’,标准标度),

6(“主成分分析”,主成分分析(n_compon\= 2))。

7(‘clf’,物流出口(随机_状态= 1))])

8管道安装(X列、y列)

9打印(“测试精度:% . 3f”%管道分数(X测试,y测试))

10y _ pred = pipe _ lr . predict(X _ test)

测试精度:0.947

二.k折交叉验证

二.k折交叉验证

为什么要评估模型的泛化能力?我相信每个人都应该没有疑问。如果模型性能不佳,要么模型过于复杂,导致过度拟合(高方差),要么模型过于简单,导致拟合不足(高偏差)。如何对其进行评估以及使用什么数据来评估它已经成为模型评估中需要考虑的关键问题。

我们的常规方法是将数据集分成三部分,即训练、测试和验证,并且数据不相互重叠。但是,如果我们遇到少量数据,这种操作不是很现实,这一次交叉验证将发挥优势。

2.1 K倍交叉验证原则

我们不要说得太多,但先贴一张示意图(以10倍交叉验证为例)。

k折交叉验证步骤:

第一步:使用非重复采样将原始数据随机分成K份;

步骤2: k-1数据用于模型训练,其余1数据用于模型测试;

步骤3:重复步骤2 k次,获得K个模型和他的评估结果。

步骤4:计算交叉验证结果的平均值,作为参数/模型的性能评估。

实施2.1 K折叠交叉验证

k折交叉验证,那么如何确认k的值呢?一般来说,我们默认为10%的折扣,但会根据实际情况进行调整。我们需要知道,当K非常大的时候,你需要训练很多模型,这对效率有更大的影响,每个模型都有相同的训练集和相同的效果。常用的k值在5到12之间。

根据k-fold交叉验证的原理和步骤,我们在sklearn中实现了10-fold交叉验证的代码:

1导入大量asnp

2 fromsk learn . model _ selection ImportStratifiedkfold

3倍=分层分数(n_splits= 10,

4random_state= 1)。拆分(X_train,y_train)

5分= []

6叉,(火车,测试)单位(kfold):

7管道安装([火车、[火车)

8分=管道分数([火车测验,[火车测验)

9分。追加(分数)

10打印('文件夹:%s,分类区。:%s,Acc:% . 3f“%(k+1,

11分([火车),得分)

12打印(' nCV精度:% . 3f+/-% . 3f“%(NP .均值(分数),np.std(分数)))

输出:

当然,在实际使用中没有必要这样写。sklearn已经有一个现成的打包方法,可以直接调用。

1 fromsk learn . model _ selection import cross _ val _ score

2核心= cross_val_score(估计器=pipe_lr,

3X=X_train,

4y=y_train,

5cv= 10,

6n_jobs= 1)

7打印(“简历准确度分数:% s”%分数)

8打印(‘CV准确度:% . 3f+/-% . 3f“%(NP .均值(分数),np.std(分数)))

第三,曲线参数调整

第三,曲线参数调整

当我们谈论曲线时,我们特别提到学习曲线和验证曲线。

3.1型号精度

模型的准确率反映了模型的效果。请看下图:

1)左上角的型号具有高偏差。它的训练集和验证集的准确性很低,这可能是不合适的。解决拟合不足的方法是增加模型参数,例如,建立更多的特征和减少常规项目。

2)右上角的模型具有高方差,这表明训练集和验证集的精度相差太大。解决过度拟合的方法包括增加训练集或降低模型复杂度,如通过特征选择增加规则项或减少特征数。

3)右下角的模型非常好。

3.2绘制一条学习曲线,以获得样本数量和准确度之间的关系

直接编码:

1 import mattplotlib . py plot asplt

2 fromsk learn . model _ selection import learning _ curve

3管道=管道([(‘SCL’,标准标度),

4( 'clf ',后勤退出(惩罚= 'l2 ',随机_状态= 0))])

5训练规模、训练分数、测试分数=

6收入曲线(估计值=管道_lr,

7X=X_train,

8y=y_train,

9列大小= NP。linspace (0.1,1.0,10),#在0.1和1之间线性取10个值

10cv= 10,

11n_jobs= 1)

12 train _ mean = NP . mean(train _ scores,axis= 1)

13 train _ STD = NP . STD(train _ scores,axis= 1)

14 test _ mean = NP . mean(test _ scores,axis= 1)

15test_std = np.std(test_scores,axis= 1)

16plt .绘图(列车大小、列车平均值、

17颜色= '蓝色',标记= 'o ',

18markersize= 5,label=“训练精度”)

19plt.fill_between(列车尺寸,

20平均列车+标准列车,

21雨_平均列车_标准,

22alpha= 0.15,颜色=“蓝色”)

23plt .绘图(列车大小,测试平均值,

24色= '绿色',线型= ' -',

25marker= 's ',markersize= 5,

26标签=“验证准确度”)

27plt.fill_between(列车尺寸,

28test_mean + test_std,

29test_mean - test_std,

30α= 0.15,颜色=“绿色”)

31plt.grid

32plt.xlabel(“训练样本数”)

33plt.ylabel(“准确性”)

34 lt . legend(loc = '右下角')

35英尺长([ 0.8,1.0])

36plt .紧密布局

37plt.show

学习曲线中的训练大小参数控制生成学习曲线的训练样本的绝对/相对数量。在这里,我们设置火车大小= NP。LINSPACE (0.1,1.0,10)将训练集大小分成10个相等的间隔,取0.1到1之间的10个线性值。学习_曲线默认情况下使用分层K折交叉验证来计算交叉验证的准确性。我们把K设置为cv。

从下图中可以看出,模型在测试集中表现良好,但是在训练集和测试集之间仍然有一个小的间隔,这可能是模型有点过拟合。

3.3绘制验证曲线,得到超级参数和精度关系

验证曲线用于提高模型的性能。验证曲线与学习曲线非常相似。不同之处在于,这里绘制的是不同参数下的模型精度,而不是不同训练集大小下的精度:

1 fromsk learn . model _ selection import validation _ curve

2参数范围= [ 0.001、0.01、0.1、1.0、10.0、100.0]

3测试分数,测试分数=验证曲线(

4估计器=pipe_lr,

5X =火车,

6y=y_train,

7param_name= 'clf__C ',

8param_range=param_range,

9cv= 10)

10 train _ mean = NP . mean(train _ scores,axis= 1)

11 train _ STD = NP . STD(train _ scores,axis= 1)

12 test _ mean = NP . mean(test _ scores,axis= 1)

13test_std = np.std(test_scores,axis= 1)

14 pl .绘图(参数范围,训练平均值,

15颜色= '蓝色',标记= 'o ',

16markersize= 5,label=“训练精度”)

17plt.fill_between(参数范围、列车平均值+列车标准、

18train_mean - train_std,α= 0.15,

19色=“蓝色”)

20plt .绘图(参数范围,测试平均值,

21颜色= '绿色',线条样式= ' -',

22marker= 's ',markersize= 5,

23标签=“验证准确性”)

24 lt . fill _ between(参数范围,

25test_mean + test_std,

26test_mean - test_std,

27α= 0.15,颜色=“绿色”)

28plt.grid

29plt.xscale(“日志”)

30plt .图例(loc= '右下角')

31plt.xlabel(“参数C”)

32plt.ylabel(“准确性”)

33plt.ylim([ 0.8,1.0])

34 lt .紧密布局_布局

35 lt . show

我们得到了参数c的验证曲线。与学习曲线法很相似,验证曲线法使用抽样k次交叉验证来评价模型的性能。在validation_curve中,我们设置要评估的参数(这里我们将c设置为观察值)。

从下图可以看出,C的最佳值是0.1。

四.网格搜索

四.网格搜索

网格搜索作为一种常用的参数调整方法,应该在这里简单介绍一下。

在我们的机器学习算法中,有一类参数需要手动设置,我们称之为“超参数”,即算法中的参数,如学习率、正则项系数或决策树深度等。

网格搜索就是寻找一个最佳参数,使模型具有最佳效果,其原理实际上是暴力搜索。也就是说,我们预先为每个参数设置一组值,然后用尽所有类型的参数组合来找到最好的一个。

4.1。两级循环暴力检索

网格搜索的结果获得了指定的最佳参数值,其中C为100,γ为0.001。

1#天真网格搜索实现

2 fromsk learn . dataset import load _ iris

3fromsklearn.svm importSVC

4 fromsk learn . model _ selection import train _ test _ split

5iris = load_iris

6X_train,X_test,y_train,y _ test = train _ test _ split(iris . data,iris.target,random_state= 0)

7打印(“训练集大小:%d测试集大小:% d”%([形状0],[形状0])

8best_score = 0

9[0.001、0.01、0.1、1、10、100中的组织:

10对于[,0.001、0.01、0.1、1、10、100]:

11#代表每个参数组合

12#培训高级副总裁

13 SVM = SVC(γ=γ,C=C)

14sv . fit(X _ train,y_train)

15#评估测试集上的SVC

16分值= svm .分值(X_test,y_test)

17#如果我们得到了更好的分数,请存储分数和参数

18ifscore >;最佳得分:

19best_score = score

20最佳_参数= { 'C': C,'伽马':伽马}

21打印(“最佳分数:”最佳分数)

22打印(“最佳参数:“,最佳参数”)

输出:

训练集大小:112测试集大小:38

最佳得分:0.973684210526

最佳参数:{'C': 100,'伽马':0.001}

4.2。构建字典暴力检索

网格搜索的结果获得指定的最佳参数值,c为1

1fromsklearn.svm importSVC

2 fromsk learn . model _ selection ImportGridSearchcv

3管道_svc =管道([(‘SCL’,标准标度),

4(‘clf’,SVC(随机状态= 1))])

5参数范围= [ 0.0001、0.001、0.01、0.1、1.0、10.0、100.0、1000.0]

6参数网格= [{ 'clf__C ':参数范围,

7'clf__kernel': ['线性']},

8{ 'clf__C ':参数_范围,

9'clf__gamma': param_range,

10'clf__kernel': [ 'rbf']}]

11gs = GridSearchCV(估计器=pipe_svc,

12param_grid=param_grid,

13取心=“精度”,

14cv= 10,

15n_jobs= -1)

16gs = gs.fit(X_train,y_train)

17打印(gs.best_score_)

18打印(gs.best_params_)

输出:

0.978021978022

{'clf__C': 0.1,' clf _ _内核':'线性' }

GridSearchCV中的Param_grid参数是字典列表。对于线性SVM,我们只计算参数C;对于径向基函数核SVM,我们评估C和γ。最后,通过best_parmas_得到最优参数组合。

接下来,我们直接使用最佳参数建模(best_estimator_):

1 clf = GS . best _ assessor _

2clf.fit(X_train,y_train)

3打印(“测试准确度:% . 3f“% clf .分数(X_test,y_test))

尽管网格搜索很好,但它太费时,无法穷尽。sklearn还实现随机搜索,使用随机化搜索CV类随机采样不同的参数组合。

五、嵌套交叉验证

五、嵌套交叉验证

嵌套交叉验证(Nested cross validation)选择算法(外环通过K-fold优化参数,内环使用交叉验证)为特定数据集选择模型。瓦尔马和西蒙在论文中指出,在模型选择中使用交叉验证时,误差估计存在偏差,通过嵌套交叉验证获得的测试集误差几乎是真实误差。

嵌套交叉验证之外还有一个K-fold交叉验证,它将数据分为训练集和测试集。内部交叉验证用于选择模型算法。

下图说明了一个嵌套交叉验证,由5倍外部交叉边和2倍内部交叉验证组成,也称为5*2交叉验证:

我们仍然使用以前的数据集,这里省略了相关包的导入操作。

SVM分类器预测精度码的实现:

1gs = GridSearchCV(估计器=pipe_svc,

2param_grid=param_grid,

3取心=“精度”,

4cv=2)

5

6#注意:您可以选择使用cv=2

7#在上面的GridSearchCV中生成

8#如图所示的5×2嵌套CV。

9

10核心=交叉值得分(gs,X_train,y_train,得分= '准确性',cv=5)

11打印(‘CV准确度:% . 3f+/-% . 3f“%(NP .均值(分数),np.std(分数)))

CV精度:0.965 +/- 0.025

决策树分类器预测精度代码的实现:

1 fromsk learn . tree ImportDecisionTreeScalifier

2

3gs = GridSearchCV(估计器=决策树分类器(随机_状态= 0),

4参数网格=[{“最大深度”:[ 1,2,3,4,5,6,7,无]}],

5分=“准确性”,

6cv= 2)

7分=交叉值分(gs,X_train,y_train,得分= '准确性',cv= 5)

8打印(‘CV准确度:% . 3f+/-% . 3f“%(NP .均值(分数),np.std(分数)))

CV精度:0.921 +/- 0.029

六.相关评价指标

六.相关评价指标

6.1混淆矩阵及其实现

混乱矩阵,每个人都应该听说过,大致是这样长的:

因此,有几个概念需要首先解释:

TP(真正):真为0,预测也为0

FN(假阴性):真0,预测1

FP(假阳性):真1,预测0

真负值:真为1,预测也为1

因此,得出了几个常用指标:

:分类模型的整体判断准确率(包括所有类别的整体准确率)

:预测精度为0

:真0的准确率

:准确率为1

:预测准确率为1

:对于某个类别,结合了精确度和召回率的判断指数,F1-分值从0到1,1是最好的,0是最差的

另一个结合精确和回忆的标准,F1得分的变化

另一个例子:

混淆矩阵网络上有很多文章,更不用说刻意记住它们了。必要时,您会知道混淆矩阵实现代码:

1来自sklearn.metrics导入混淆矩阵

2

3pipe_svc.fit(X_train,y_train)

4y _ pred = pipe _ SVC . predict(X _ test)

5con\=混淆矩阵(y_true=y_test,y_pred=y_pred)

6打印(confmat)

输出:

[·[71 1]

[ 2 40]]

1图,ax = plt .子情节(图尺寸=(2.5,2.5))

2ax.matshow(confmat,cmap=plt.cm.Blues,alpha=0.3)

3fori inrange(confmat.shape[0]):

4forj inrange(confmat.shape[1]):

5ax.text(x=j,y=i,s=confmat[i,j),va= 'center ',ha= 'center ')

6

7plt.xlabel(“预测标签”)

8plt.ylabel(“真实标签”)

9

10pt .紧密布局(_ u)

11plt.show

6.2相关评价指标的执行情况

准确度、召回率和F1指标分别实现。

1 fromsk learn . metrics import precision _ score、recall_score、f1_score

2

3打印('精度:%.3f'%精度_分数(y_true=y_test,y_pred=y_pred))

4打印('召回:%.3f'%召回分数(y_true=y_test,y_pred=y_pred))

5打印(' F1:% . 3f ' % F1 _ score(y _ true = y _ test,y_pred=y_pred))

精度:0.976

召回率:0.952

F1: 0.964

指定评估指标以自动选择最佳模型:

您可以在make_scorer中设置参数来确定需要评估的指标(这里使用fl_score)。这个函数可以直接输出结果。

1 fromsk learn . metrics importmake _ scorer

2

3 corer = make _ scorer(f1 _ score,pos_label= 0)

4

5c _γ_范围= [ 0.01,0.1,1.0,10.0]

6

7参数网格= [{ 'clf__C': c_gamma_range,

8'clf__kernel': ['线性']},

9{ 'clf__C': c_gamma_range,

10'clf__gamma': c_gamma_range,

11'clf__kernel': [ 'rbf']}]

12

13gs = GridSearchCV(估计器=pipe_svc,

14param_grid=param_grid,

15得分=得分者,

16cv= 10,

17n_jobs= -1)

18gs = gs.fit(X_train,y_train)

19张照片(gs.best_score_)

20打印(gs.best_params_)

0.982798668208

{'clf__C': 0.1,' clf _ _内核':'线性' }

6.3 ROC曲线及其实现

如果你需要理解ROC曲线,那么你首先需要理解混淆矩阵。具体内容可以在前面的文章中看到。这里,主要介绍两个概念:

真阳性率(True positive rate,TPR)是指由模型正确预测的阳性样本比例:

假阳性率,FPR)指模型错误预测的阳性样本比例:

ROC曲线概念:

接收器的接收器工作特性显示了分类器的真阳性率和假阳性率之间的关系,如下图所示:

ROC曲线有助于比较不同分类器的相对性能。曲线下面积为AUC(曲线下面积)。面积越大,分类性能越好。理想分类器auc=1。

ROC曲线图:

对于特定的分类器和测试数据集,显然只能获得一个分类结果,即一组FPR和TPR结果。为了得到一条曲线,我们实际上需要一系列的FPR值和胎压比值。

那么如何应对呢?非常简单,我们可以根据模型预测的概率值获得不同的预测结果,并设置不同的阈值。什么意思?

例如,对于5个样本,实际目标(目标标签)是y=c(1,1,0,0,1),模型分类器预测样本1的概率p=c(0.5,0.6,0.55,0.4,0.7)

我们需要选择一个阈值,将概率转换为类别。如果我们选择0.1的阈值,那么五个样本被分成1类。如果选择0.3,结果仍然相同。如果选择0.45作为阈值,那么只有在样本4被划分为0之后,所获得的所有分类结果被计算FTR、PTR,并且被绘制成一条线,那么可以获得ROC曲线。选择的阈值越多,ROC曲线越平滑。

ROC曲线代码实现:

1fromsklearn.metrics导入roc_curve,auc

2fromscipy import interp

3

4管道=管道([(‘SCL’,标准标度),

5(“主成分分析”,主成分分析(n_compon\= 2))。

6( 'clf ',物流出口(罚款= 'l2 ',

7随机状态= 0,

8C= 100.0))])

9

10X_train2 = X_train[:,[ 4,14]]

11 #因为所有特征都被加入,预测效果太好,ROC曲线不好看。哈哈哈,所以只拍摄了两个特征

12

13

14cv =列表(StratifiedKFold(n_splits= 3,

15随机状态= 1)。拆分(X_train,y_train))

16

17fig = plt.figure(figsize=( 7,5))

18

19mean_tpr = 0.0

20man _ FPR = NP . Lin space(0,1,100)

21all_tpr = []

22

23对于数值(cv)中的(训练、测试):

24机器=管道安装([火车2号列车),

25y _ train列车])。预测问题([试验)

26

27fpr,tpr,阈值= roc _ curve(y _ train[试验),

28probas[:,1],

29pos_label= 1)

30mean_tpr += interp(均值_fpr、fpr、tpr)

31月_tpr[ 0] = 0.0

32roc_auc = auc(fpr,tpr)

33plt.plot(fpr,

34tpr,

35lw= 1,

36label= 'ROC折叠%d(面积= %0.2f)'

37% (i+ 1,roc_auc))

38

39plt图([ 0,1),

40[ 0,1],

41直线= ' -',

42color=( 0.6,0.6,0.6),

43标签=“随机猜测”)

44

45英里_tpr /=镜头(cv)

46平均值_tpr[ -1] = 1.0

47mean_auc = auc(均值_fpr,均值_tpr)

48plt .绘图(均值_fpr,均值_tpr,' k -',

49label= 'mean ROC(面积= %0.2f)'% mean_auc,lw= 2)

50plt图([ 0,0,1),

51[ 0,1,1],

52lw= 2,

53线型= ':',

54颜色= '黑色',

55标签=“完美性能”)

56

57plt.xlim([ -0.05,1.05))

58plt.ylim([ -0.05,1.05))

59plt.xlabel(“假阳性率”)

60plt.ylabel(“真实阳性率”)

61标题(“接收机操作员特征”)

62plt.legend(loc= "右下角")

63

64 lt .紧密布局_布局

65 lt . show

审查AUC和准确度结果:[/s2/]

1pipe_lr= pipe_lr.fit(X_train2,y_train)

2y标签=管道预测([:[4,14]])

3y _ proba = pipe _ lr . predict _ proba([:[4,14]])[:1]

4#注意,我们使用roc_auc的概率

5#仅“[:,1]”选择阳性类别标签

1 fromsk learn . metrics import roc _ AUC _ score,accessibility _ score

2打印(' ROC AUC:% . 3f ' % ROC _ AUC _ score(y _ true = y _ test,y_score=y_probas))

3打印('准确性:%.3f'%准确性_分数(y_true=y_test,y_pred=y_labels))

ROC AUC: 0.752

准确度:0.711

高效对接人工智能领域的项目合作、咨询服务、实习、求职、招聘等需求,得到25W公众粉丝的支持,期待与您建立联系,找人寻找技术不再困难!回到搜狐看更多

负责任的编辑:

转载请注明:红包接龙30 >> gAmJgp » 机器学习的万字长总结模型评估和参数调整,带代码下载

发表我的评论

发表我的评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址