版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章特征选择与特征联合数据挖掘原理、算法与应用(Python语言描述)(1)掌握常用的过滤法特征选择方法。(2)掌握常用的装袋法特征选择方法。(3)掌握常用的嵌入法特征选择方法。(4)了解特征联合的方法。(5)了解多项式特征。学习目标目录特征选择过滤法装袋法嵌入法案例:对中学教育学生成绩数据集进行特征选择多项式特征案例:对makecircles同心圆数据集使用多项式特征特征联合案例:对Boston房价预测实现特征联合目录特征选择过滤法装袋法嵌入法案例:对中学教育学生成绩数据集进行特征选择多项式特征案例:对makecircles同心圆数据集使用多项式特征特征联合案例:对Boston房价预测实现特征联合定义:从全部特征中选取一个特征子集来建立模型目的:降低特征维度,提高模型性能基本原则:包含信息较少(方差较低)的特征应该被剔除与目标特征相关性高的特征应该优先被选择
特征选择简介
特征选择方法方式说明主要方法过滤法(Filter)先进行特征选择,再建立模型,特征选择的过程中不涉及建模方差选择法卡方检验法相关系数法装袋法(Wrapper)建立模型并给定评价标准,选择效果最优的特征子集递归特征消除法嵌入法(Embedding)特征选择与模型训练结合,在训练过程中自动进行特征选择10.1.1过滤法常用的过滤法有方差选择法、卡方检验法、相关系数法。思想:方差小的特征波动性小,包含的信息也较少,对模型影响较小方法:给定一个方差阈值,计算所有特征的方差保留方差大于阈值的特征剔除方差小于阈值的特征
方差选择法feature_selection模块类说明feature_selection.VarianceThreshold剔除低于方差阈值的特征feature_selection.SelectKBest根据给定的得分函数选出K个得分最高的特征feature_selection.SelectPercentile根据给定的得分函数选出前p%个得分最高的特征(p需指定)feature_selection.RFE递归特征消除法feature_selection.RFECV包含交叉验证的递归特征消除法feature_selection.SelectFromModel嵌入式特征消除法feature_selection模块通用方法说明fit(X,y)学习怎样进行特征选择
transform(X)对X进行特征选择fit_transform(X,y)先学习怎样进行特征选择,再对X进行特征选择get_support
()返回布尔数组,指明哪些特征被选择VarianceThreshold类
参数
说明threshold输入方差阈值(浮点型),默认为0.0,会自动删除方差为0的特征属性说明variances_查看各特征的方差方差选择法例10-1方差选择法特征选择fromsklearn.feature_selectionimportVarianceThresholdsel_var=VarianceThreshold(threshold=0.5)#设定方差阈值为0.5sel_var_X=sel_var.fit_transform(X)#特征选择print("选择的特征数量:",sel_var_X.shape[1])选择的特征数量:272卡方检验法
相关系数检验法
方法
说明Pearson相关系数用于度量两个特征X与Y的线性相关性,取值在-1到1之间。-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关性最大信息系数克服了互信息的问题。它首先寻找一种最优的离散化方式,然后把互信息取值转换成一种度量方式,取值区间在[0,1]距离相关系数克服了Pearson相关系数的弱点,在x和x^2这个例子中,即便Pearson相关系数是0,也不能断定这两个变量是独立的(有可能是非线性相关);但如果距离相关系数是0,那么就可以说这两个变量是独立的
相关系数检验法SelectKBest和SelectPercentile类
参数
说明score_func给出统计指标的函数,常用函数如下:“f_regression”(默认):相关系数检验,用于回归问题“chi2”:卡方检验,用于分类问题“mutual_info_regression”:计算互信息,用于回归问题“f_classif”:基于方差分析的F检验,用于分类问题k(SelectKBest)指定保留得分最高特征的个数,默认为10Percentile(SelectPercentile)指定保留得分最高的前百分之几的特征,默认为10(10%)
属性说明scores_返回各特征的得分pvalues_返回各特征得分的p值,若score_func仅返回得分,则为无相关系数检验法例10-2最大信息系数特征选择importnumpyasnpfromminepyimportMINE#定义mic函数defmic(x,y,p):m=MINE()pute_score(x,y)return(m.mic(),p)fromsklearn.feature_selectionimportSelectKBest#选择K个最好的特征sk=SelectKBest(lambdaX,Y:np.array(list(map(lambdax:mic(x,Y,0.5),X.T))).T[0],k=10)sk.fit_transform(X,Y)#特征选择相关系数检验法例10-3距离相关系数实现特征选择fromsklearn.feature_selectionimportSelectKBest#根据给定的得分函数选出K个得分最高的特征importnumpyasnpfromscipy.statsimportpearsonrpr=SelectKBest(lambdaX,Y:np.array(list(map(lambdax:pearsonr(x,Y),X.T))).T[0],k=5).fit(X_train,y_train)#参数k为选择的特征个数tata_SKB=pr.fit_transform(X_train,y_train)#选择K个最好的特征,返回选择特征后的数据相关系数检验法例10-4chi2特征选择(SelectKBest)fromsklearn.feature_selectionimportSelectKBestfromsklearn.feature_selectionimportchi2,f_classif,f_regressionsel_chi=SelectKBest(chi2,k=5).fit(X,y)#选择与目标变量最相关的5个特征print(sel_chi.scores_)#输出各个特征变量与目标变量的相关程度特征变量与目标变量的相关程度:[23.5294117653.6862745153.68627451...1.1.1.]print(pd.Series(sel_chi.get_support(),index=X.columns))#输出筛选结果相关系数检验法例10-5chi2特征选择(SelectPercentile)fromsklearn.feature_selectionimportSelectPercentilefromsklearn.feature_selectionimportchi2sel_chi=SelectPercentile(chi2,percentile=50).fit(data,data_y)#选择50%print(sel_chi.scores_)#特征变量与目标变量的相关程度特征变量与目标变量的相关程度:[23.5294117653.6862745153.68627451...1.1.1.]print(pd.Series(sel_chi.get_support(),index=data.columns).sort_values())装袋法对于每一个待选的特征子集,都在训练集上训练一遍模型,然后在测试集上根据误差大小选择出合适的特征子集。装袋法需要先选定算法,通常选用RandomForest、SVM、KNN等。特征子集的搜索可以采用前向搜索法,每次从剩余未选中的特征选出一个加入特征集中,待达到阈值或者n时,从所有的F中选出错误率最小的。
10.1.2装袋法初始化特征集F为空;扫描i从1到n,如果第i个特征不在F中,那么特征i和F放在一起作为Fi。在只使用Fi中特征的情况下,利用交叉验证来得到Fi的错误率;从上步中得到的n个Fi中选出错误率最小的Fi,更新F为Fi;如果F中的特征数达到了n或者预定的阈值,那么输出整个搜索过程中最好的特征值子集;若没达到,则转到2,继续扫描。特征子集的搜索也可以采用后向搜索。先将F设置为{1,2,...,n},然后每次删除一个特征,并评价,直到达到阈值或者为空,然后选择最佳的F。这两种算法都可以工作,但是计算复杂度比较大。
装袋法具体过程思想:利用可以学习到特征权重或重要性的模型,通过递归的方式减少特征个数来进行特征选择步骤基于所有特征训练模型,得到每个特征的权重或重要性剔除权重或重要性最小的特征,基于新的特征集合训练模型最后,重复上述步骤,进行递归消除,直到剩下的特征个数满足条件为止执行RFE的过程中,可以通过交叉验证的方式来评价模型在某个特征集合上的表现,以此来选择最佳的特征集合
递归特征消除法(RFE)RFE类参数说明estimator监督学习器,必须包含coef_或feature_importances_属性n_features_to_select
指定选出几个特征,默认为None(所有特征的一半)step每次迭代剔除的特征数,默认为1,大于1为剔除的个数,0~1之间为剔除的比例
属性说明support_指明哪些特征被选择(布尔数组)ranking_特征的排名(表示被剔除的顺序)递归特征消除法(RFE)例10-6递归特征消除法实现特征选择fromsklearn.feature_selectionimportRFEfromsklearn.treeimportDecisionTreeClassifierrfe=RFE(DecisionTreeClassifier(random_state=10),step=200,n_features_to_select=7)rfe.fit_transform(train_X,train_y)#先对test_X进行转换后,再用设定好的学习器进行预测y_pred=rfe.predict(test_X)#将test_X进行特征选择后,再用设定好的学习器评分print("正确率:",rfe.score(X_test,y_test))#输出正确率输出正确率如下:正确率:0.9775#特征排名print(rfe.ranking_)输出特征排名如下:[363534...785]RFECV类
属性说明grid_scores_各特征子集的交叉验证得分support_指明哪些特征被选择(布尔数组)ranking_特征的排名(表示被剔除的顺序)参数
说明estimator监督学习器,必须包含coef_或feature_importances_属性min_features_to_select
需要选择的最小特征数,默认为1step每次迭代剔除的特征数,默认为1,大于1为剔除的个数,0~1之间为剔除的比例cv交叉验证的折数,默认为3scoring字符串或可调用对象,用于评估学习器的预测性能递归特征消除法(RFE)例10-7交叉验证的递归特征消除法fromsklearn.feature_selectionimportRFECVrfeCV=RFECV(DecisionTreeClassifier(random_state=10),cv=5,step=200,scoring='roc_auc')rfeCV.fit(X_train,y_train)##查看特征排名print(pd.Series(rfeCV.ranking_,index=X.columns))
10.1.3嵌入法SelectFromModel类
参数
说明estimator监督学习器,必须包含coef_或feature_importances_属性threshold
用于特征选择的阈值,设置方法如下:
若为浮点型:则表示阈值的绝对大小
若为字符串,可设为:”mean”(默认)(权重或重要性的均值)
“median”(权重或重要性的中位数)
若estimator包含“l1”正则化项,则默认值为1e-510.1.3嵌入法例10-8嵌入法实现特征选择feature_selection.SelectFromModel嵌入式特征消除法fromsklearn.feature_selectionimportSelectFromModelfromsklearn.ensembleimportRandomForestClassifier#使用随机森林作为监督学习器select=SelectFromModel(RandomForestClassifier(n_estimators=200,random_state=10),max_features=7,threshold='median')select.fit(train_X,train_y)support=pd.Series(select.get_support(),index=X_train.columns)print(support[support==True])#输出选择的特征目录特征选择过滤法装袋法嵌入法案例:对中学教育学生成绩数据集进行特征选择多项式特征案例:对makecircles同心圆数据集使用多项式特征特征联合案例:对Boston房价预测实现特征联合10.2.1目标对中学教育学生成绩数据集采用不同的方法进行特征选择。10.2.2数据集该数据计算了两所葡萄牙学校中学教育的学生成绩。数据属性包括学生成绩、人口统计、社会和学校相关特征,它是通过使用学校报告和问卷收集的。目标属性为G3,学生第三学期是最终的成绩。属性说明school
学生所在学校sex
学生的性别(“F”-女性或“M”-男性)age
学生年龄(数字:从15到22)address
学生的家庭地址类型(二进制:“U”-城市或“R”-农村)famsize
家庭成员数量(二进制:“LE3”-小于或等于3或“GT3”-大于3)Pstatus
父母的婚姻状况(二进制:“T”-同居或“A”-分开)Medu
母亲受教育程度(数字:0-无,1-小学教育(四年级),2-5至9年级,3-中学教育或4-高等教育)Fedu
父亲受教育程度(数字:0-无,1-小学教育(四年级),2-5至9年级,3-中学教育或4-高等教育)Mjob
母亲的职业(名义:“教师”、“保健”相关、民事“服务”(例如行政或警察)、“在家”或“其他”)Fjob父亲的职业(名义:“教师”、“保健”相关、民事“服务”(例如行政或警察)、“在家”或“其他”)Reason选择这所学校的理由(接近“家”、学校“声誉”、“课程”偏好或“其他”)Guardian学生的监护人(“母亲”、“父亲”或“其他”)Traveltime家到学校的路途时间(数字:1-<15分钟,2-15至30分钟,3-30分钟至1小时,或4->1小时)studytime
每周学习时间(数字:1-<2小时,2-2至5小时,3-5至10小时,或4->10小时)10.2.2数据集属性说明failures
转班次数(数字:n如果1<=n<3,否则为4)schoolup
额外的教育支持(二进制:是或否)famsup
家庭教育支持(二进制:是或否)paid
课程科目(数学或葡萄牙语)内的额外付费课程(二进制:是或否)activities
课外活动(二进制:是或否)nursery
就读托儿所(二进制:是或否)higher
想接受高等教育(二进制:是或否)internet
在家上网(二进制:是或否)romantic
有浪漫关系(二进制:是或否)famrel
家庭关系的质量(数值:从1-非常差到5-非常好)freetime
放学后的空闲时间(数字:从1-非常低到5-非常高)goout
与朋友外出(数字:从1-非常低到5-非常高)Dalc
工作日饮酒量(数字:从1-非常低到5-非常高)Walc
周末饮酒量(数字:从1-非常低到5-非常高)health
当前健康状况(数字:从1-非常差到5-非常好)absences
学校缺勤次数(数字:从0到93)G1
第一期成绩(数字:从0到20)G2
第二期成绩(数字:从0到20)G3
最终成绩(数字:从0到20,输出目标)10.2.3实现代码1.导入必要的包importpandasaspdimportnumpyasnpimportwarningswarnings.filterwarnings("ignore")2.读入数据集data=pd.read_csv("d:/datasets/student-por.csv",delimiter=";")3.随机查看5个样本data.sample(5)10.2.3实现代码4.查看数据的样本量、缺失情况以及数据类型()输出结果如下:10.2.3实现代码5.对object类型数据进行标签编码fromsklearn.preprocessingimportLabelEncoderLe=LabelEncoder()forkindata.columns:#标签编码、遍历所有的类型为“object”的特征
ifdata[k].dtype=="object":data[k]=Le.fit_transform(data[k])#编码6.查看编码后数据类型()输出结果如下:10.2.3实现代码7.特征标签分离X=data.drop("G3",axis=1)Y=data[“G3”]8.过滤法-方差选择法fromsklearn.feature_selectionimportVarianceThresholdsel_var=VarianceThreshold(threshold=0.9)sel_var_x=sel_var.fit_transform(X)print(sel_var_x.shape[1])#输出方差选择后的特征数量方差选择后的特征数量为:1310.2.3实现代码9.查看特征选择情况fori,jinzip(sel_var.get_support(),X.columns):ifi:print(j,end=",")选中的特征:age,Medu,Fedu,Mjob,reason,famrel,freetime,goout,Walc,health,absences,G1,G210.2.3实现代码10.过滤法-卡方选择法(指定保留的特征数)fromsklearn.feature_selectionimportSelectKBestfromsklearn.feature_selectionimportchi2sel_chi=SelectKBest(chi2,k=10).fit(X,Y)fori,jinzip(sel_chi.get_support(),X.columns):ifi:print(j,end=",")选中的特征:school,Medu,Fedu,Mjob,reason,failures,Dalc,absences,G1,G210.2.3实现代码11.过滤法-卡方选择法(指定保留特征数的比例)fromsklearn.feature_selectionimportSelectPercentilefromsklearn.feature_selectionimportchi2sel_chi_p=SelectPercentile(chi2,percentile=20).fit(X,Y)fori,jinzip(sel_chi_p.get_support(),X.columns):ifi:print(j,end=",")选中的特征:school,Mjob,failures,Dalc,absences,G1,G210.2.3实现代码12.递归特征消除法REFfromsklearn.feature_selectionimportRFEfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressionfromsklearn.neighborsimportKNeighborsClassifierX_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.15,random_state=5)rfe=RFE(LogisticRegression(),n_features_to_select=5)rfe.fit(X_train,y_train)#模型训练以及特征选择fori,jinzip(rfe.support_,X.columns):#输出选中的特征
ifi:print(j,end="")选中的特征为:school,age,freetime,G1,G210.2.3实现代码13.嵌入法fromsklearn.feature_selectionimportSelectFromModelfromsklearn.ensembleimportRandomForestClassifierselect=SelectFromModel(RandomForestClassifier(n_estimators=200,random_state=10),threshold="1.25*mean")select.fit(X_train,y_train)#模型训练以及特征选择fori,jinzip(select.get_support(),X.columns):#输出选中的特征
ifi:print(j,end="")选中的特征为:age,goout,absences,G1,G2目录特征选择过滤法装袋法嵌入法案例:对中学教育学生成绩数据集进行特征选择多项式特征案例:对makecircles同心圆数据集使用多项式特征特征联合案例:对Boston房价预测实现特征联合10.3多项式特征多项式特征(PolynomialFeatures)是组合原始特征的所有多项式组合创建一个新的特征组合,新的特征组合包含等于以及小于指定阶数的所有多项式组合,将低维的特征转化为高维度的多项式特征。如原始特征为(a,b)两个特征,那么二阶的多项式特征组合就包含(1,a,b,a*a,a*b,b*b)6个特征。目录特征选择过滤法装袋法嵌入法案例:对中学教育学生成绩数据集进行特征选择多项式特征案例:对makecircles同心圆数据集使用多项式特征特征联合案例:对Boston房价预测实现特征联合对makecircles同心圆数据集使用多项式特征10.4.1目标
构建多项式特征,实现同心圆上点的正确区分。10.4.2数据集介绍 sklearn.datasets中的模块make_circles()生成仿真数据集。参数n_samples设定样本的数量,noise设定噪声的大小,factor设定内外圆半径的比例因子。很明显,该数据集上的点线性不可分。10.4.3实现代码1.生成仿真数据doublecirclesimportpandasaspdfromsklearn.datasetsimportmake_circlesfromsklearn.model_selectionimporttrain_test_splitdata=make_circles(n_samples=10000,factor=0.3,noise=0.15)X=pd.DataFrame(data[0])Y=data[1]X_train,X_test,y_train,y_test=train_test_split(X,data[1],train_size=0.8)10.4.3实现代码2.可视化仿真数据importmatplotlib.pyplotaspltplt.scatter(X.iloc[:,0],X.iloc[:,1],c=Y)plt.title("doublecircles")doublecircles可视化如下图:10.4.3实现代码3.逻辑回归分类doublecircles数据lr=LogisticRegression()lr.fit(X_train,y_train)print("训练集正确率(拟合精度):",lr.score(X_train,y_train))训练集正确率(拟合精度):0.625625print("测试集正确率:",lr.score(X_test,y_test))测试集正确率:0.619可见在原始数据集上直接进行逻辑回归,分类的正确率较低。10.4.3实现代码4.多项式特征fromsklearn.preprocessingimportPolynomialFeaturespf=PolynomialFeatures(degree=2)X_train_pf=pf.fit_transform(X_train)X_test_pf=pf.transform(X_test)10.4.3实现代码5.逻辑回归分类doublecircles数据lr_pf=LogisticRegression()lr_pf.fit(X_train_pf,y_train)print("训练集正确率(拟合精度):",lr_pf.score(X_train_pf,y_train))训练集正确率(拟合精度):0.988625print("测试集正确率:",lr_pf.score(X_test_pf,y_test))测试集正确率:0.9895可见对原始数据集进行多项式特征升维后,再进行逻辑回归,分类的正确率得到较大的提高。目录特征选择过滤法装袋法嵌入法案例:对中学教育学生成绩数据集进行特征选择多项式特征案例:对makecircles同心圆数据集使用多项式特征特征联合案例:对Boston房价预测实现特征联合10.5特征联合特征联合(FeatureUnion),不同于特征选择,通过特征联合,通常会生成比原始数据维度更大的数据集。如图将列表中的transformer并行应用于数据,然后将多transformer的结果横向连接。实现多个特征提取机制组合到一个transformer中,拼接成一个更大的特征向量矩阵。10.5特征联合FeatureUnion实现特征联合。FeatureUnion用法:FeatureUnion([('D_1',D1(…)),('D_2',D2(…)), ('D_3',D3(…)), …])其中D1,D2,D3为不同的降维方法,D_1,D_2,D_3为每个transformer指定的名字。使用make_union构建FeatureUnion,不需要为每个transformer命名。make_union用法:make_union([(D1(…),#D2(…), D3(…) …])目录特征选择案例:对中学教育学生成绩数据集进行特征选择多项式特征案例:对makecircles同心圆数据集使用多项式特征特征联合案例:对Boston房价预测实现特征联合10.6.1目标本案例仅为展示如何实现特征联合,将13维的Boston房价数据集,采用PCA降维为4维,采用PolynomialFeatures(degree=3),升维为164维,然后将其组合成168维的数据集,如图所示。10.6.2数据集介绍样本总数:10000特征数量:13个相关特征(即13个指标变量),1个目标变量(房价)。特征说明:特征说明CRIM城镇人均犯罪率ZN大于25,000平方英尺的地块划分为住宅用地的比例INDUS每个城镇非零售业务的比例CHAS查尔斯河虚拟变量(如果1则沿河;0则不沿河)NOX一氧化氮浓度(每千万)RM每间住宅的平均房间数AGE自住房屋是在1940年之前建造的比例DIS到加州五个就业中心的加权距离RAD对径向高速公路的可达性指数TAX每10,000美元的全价物业税PTRATIO城镇的学生与教师比例B-1000(Bk-0.63)^2其中Bk是城镇的黑人的比例LSTAT低社会阶层人口比例%MEDV以1000美元为单位的自住房屋的中位数价格10.6.3实现代码1.导入必要的包importpandasaspdfromsklearn.decompositionimportPCAfromsklearn.pipelineimportFeatureUnionfromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.pipelineimportmake_unionfromsklearn.pipelineimportFeatureUnion2.读入数据data=pd.read_csv("d:/datasets/HousingData.csv")#读取csv文件10.6.3实现代码3.测试集训练集分离fromsklearn.model_selectionimporttrain_test_splitdata=data.dropna()X=data.iloc[:,:-1]Y=data.iloc[:,-1]X_train,X_test,y_train,y_test=train_test_split(X,Y,train_size=0.8)10.6.3实现代码4.FeatureUnion#构建FeatureUnion,需要为每个transformer命名fea_un=FeatureUnion([('pca',PCA(n_components=4)),
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年马鞍山师范高等专科学校单招职业适应性考试题库及答案详解1套
- 福山区长江社区招聘社区网格员备考题库附答案详解
- 金阳县热水河乡招聘社区网格员备考题库附答案详解
- 汉阴县双河口镇招聘社区网格员备考题库附答案详解
- 2026年石家庄邮电职业技术学院单招综合素质考试题库及完整答案详解1套
- 2026年辽宁师范高等专科学校单招职业适应性考试题库附答案详解
- 2026年绵阳飞行职业学院单招职业技能考试题库及完整答案详解1套
- 2026年肇庆医学高等专科学校单招职业适应性测试题库参考答案详解
- 2026年漯河食品职业学院单招职业倾向性测试题库及参考答案详解一套
- 2026年长沙南方职业学院单招职业倾向性测试题库及参考答案详解
- 金属矿床开采新技术技术
- FBCDZ系列通风机为对旋式防爆主要通风机
- GB/T 37669-2019自动导引车(AGV)在危险生产环境应用的安全规范
- 第四章 AP1000反应堆结构设计(杜圣华)
- 几起重大工程质量安全事故原因
- 初中数学教学大纲
- 设备供货安装方案(通用版)
- 中考物理题型二《开放、推理类题》
- 第二节 金属的腐蚀和防护PPT课件
- 2011年天津市高考物理试卷
- 九年一贯制学校小学初中深度一体化办学策略的调研报告
评论
0/150
提交评论