我的主要工作总结:
- 核心是==特征工程==,为小队构造、筛选出了针对不同情况下的最合适的特征,最高时涉及到的将近400个特征,每个特征我都亲自考察过它牵扯到的背景、公式及含义
- 为小队提供最好的单个模型结果:-1.78258,为最终的模型融合做好准备
- 对模型融合进行了尝试,最好时达到:-1.95196,稍逊于最优的结果:-1.97267
预测分子中原子对之间的作用力–即耦合常数 scalar_coupling_constant
静 电 力 f = q 1 q 2 4 π ϵ 0 r 2 静 电 势 能 = q 1 q 2 4 π ϵ 0 r 诱 导 势 能 = − α 2 μ 1 2 4 π ϵ 0 r 6 色 散 势 能 = − 3 I 1 I 2 α 1 α 2 4 π ϵ 0 ( I 1 + I 2 ) r 6 静电力f=\frac{q_1q_2}{4\pi\epsilon_0r^2}\\ 静电势能=\frac{q_1q_2}{4\pi\epsilon_0r}\\ 诱导势能=-\frac{\alpha_2\mu_1^2}{4\pi\epsilon_0r^6}\\ 色散势能=-\frac{3I_1I_2\alpha_1\alpha_2}{4\pi\epsilon_0(I_1+I_2)r^6} 静电力f=4πϵ0r2q1q2静电势能=4πϵ0rq1q2诱导势能=−4πϵ0r6α2μ12色散势能=−4πϵ0(I1+I2)r63I1I2α1α2
qm9为外部特征群,包含了有机分子的计算几何,能量,电子和热力学性质。
- ‘rc_A’,分子转动的转动常数
- ‘rc_B’,分子转动的转动常数
- ‘rc_C’,分子转动的转动常数
- ‘mu’,分子的偶极矩,dipole_moments.csv contains X,Y,Z values per molecule and sqrt(X2+Y2+Z^2)=mu
- ‘alpha’,分子极化率
- ‘homo’,分子中已占有分子的能级最高轨道的能级
- ‘lumo’,分子中未占有电子的能级最低轨道的能级
- ‘gap’,lumo-home,光环境下是否稳定(gap越小,分子越容易激发)
- ‘r2’,分子的空间范围
- ‘zpve’,分子在零点(绝对零度,0k)的振动能
- ‘U0’,分子在0k时的内能
- ‘U’,分子在298.15k(25℃)的内能 U=电子能量+振动能量+转动能量
- ‘H’,分子在298.15k(25℃)的焓(H=U+PV)p为压强,v为体积
- ‘G’,分子在298.15k(25℃)的自由能(吉布斯),(G=H-TS)t温度,s熵,特征的热力学过程中,系统减少的内能可转化为对外做功的部分
- ‘Cv’,分子在298.15k(25℃)的热容量
- 每个自由度下都有自己的振动频率
- ‘freqs_min’,分子中所有自由度下最小的振动频率
- ‘freqs_max’,分子中所有自由度下最大的振动频率
- ‘freqs_mean’,分子中所有自由度下平均的振动频率
- ‘linear’,分子是否为线性
- ‘mulliken_min’,分子中原子最小的mulliken charge
- ‘mulliken_max’,分子中原子最大的mulliken charge
- ‘mulliken_mean’,分子中原子的平均mulliken charge
- ‘mulliken_atom_0’,分子中的原子对的第一个原子的mulliken charge
- 'mulliken_atom_1’分子中的原子对的第一个原子的mulliken charge
basic 特征群,涉及到量子对最基本的距离,角度等相关性质
x_0,y_0,z_0,x_1,y_1,z_1 #原子对的坐标
atom_index_x,atom_index_y #原子对的原子在分子中的索引
atom_1 #原子对的第二个原子是哪个,因为第一个都是H,所以只记录了第二个原子
rad_1 #原子对的第二个原子的半径
ele_neg_1#原子对的第二个原子的电负性
dist #原子对的距离
dist_x,dist_y,dist_z#原子对分别在x,y,z轴上的距离
x_mean,y_mean,z_mean #分子中原子坐标在x,y,z轴上的平均值
x_std,y_std,z_std #分子中原子坐标在x,y,z轴上的标准差
x_min,y_min,z_min #分子中原子坐标在x,y,z轴上的最小值
x_max,y_max,z_max #分子中原子坐标在x,y,z轴上的最大值
x_mean_diff_0,y_mean_diff_0,z_mean_diff_0,x_mean_diff_1,y_mean_diff_1,z_mean_diff_1 #分子中原子坐标和分子中原子坐标平均值的差值
x_std_diff_0,y_std_diff_0,z_std_diff_0,x_std_diff_1,y_std_diff_1,z_std_diff_1 #分子中原子坐标和分子中原子坐标标准差的差值
x_min_diff_0,y_min_diff_0,z_min_diff_0,x_min_diff_1,y_min_diff_1,z_min_diff_1 #f分子中原子坐标和分子中原子坐标的最小值的差值
x_max_diff_0,y_max_diff_0,z_max_diff_0 ,x_max_diff_1,y_max_diff_1,z_max_diff_1 #f分子中原子坐标和分子中原子坐标的最大值的差值
type_0 # 将原子结合类型type分为type_0(数字),
type_1 #type_1(英文字母)
atom_index_closest_0 #分子中距离原子对第一个原子的最近的原子
atom_index_closest_1 #分子中距离原子对第二个原子的最近的原子
distance_closest_0 #身为原子对第一个原子时,构成的最近的原子对距离
distance_closest_1 #身为原子对第二个原子时,构成的最近的原子对距离
x_closest_0,y_closest_0,z_closest_0 ,#身为原子对的第一个原子时,构造的距离最近原子对的另一个原子的x坐标
x_closest_1,y_closest_1,z_closest_1 #身为原子对的第二个原子时,构造的距离最近原子对的另一个原子的x坐标
atom_index_farthest_0#分子中距离原子对第一个原子的最远的原子
atom_index_farthest_1#分子中距离原子对第二个原子的最远的原子
distance_farthest_0 #身为原子对的第一个原子时,构造的距离最远原子对的距离
distance_farthest_1 #身为原子对的第二个原子时,构造的距离最远原子对的距离
x_farthest_0,y_farthest_0,z_farthest_0,#身为原子对的第一个原子时,构造的距离最远原子对的另一个原子的x坐标
x_farthest_1,y_farthest_1,z_farthest_1 ,#身为原子对的第一个原子时,构造的距离最远原子对的另一个原子的x坐标
max_distance_x #原子对中第一个原子构成原子对的最大距离
max_distance_y #原子对中第二个原子构成原子对的最大距离
min_distance_x #原子对中第一个原子构成原子对的最小距离
min_distance_y #原子对中第二个原子构成原子对的最小距离
distance_center0 #分子中,原子对的第一个原子的坐标和该分子中原子的平均坐标的距离
distance_center1 #分子中,原子对的第二个原子的坐标和该分子中原子的平均坐标的距离
distance_c0 #分子中原子对的第一个原子到分子中距离最近的原子对的第一个原子的距离
,distance_c1 #分子中原子对的第二个原子到分子中距离最近的原子对的第二个原子的距离
distance_f0 #分子中原子对的第一个原子到分子中距离最远的原子对的第一个原子的距离
distance_f1 #分子中原子对的第二个原子到分子中距离最远的原子对的第二个原子的距离
cos_c0_c1 #原子对的第一个原子到其构成的距离最近的原子对向量,和原子对的第二个原子到其构成的距离最近的原子对向量的cos
cos_f0_f1 #原子对的第一个原子到其构成的距离最远的原子对向量,和原子对的第二个原子到其构成的距离最远的原子对向量的cos
cos_c0_f0 #原子对的第一个原子到其构成的距离最近的原子对向量,和原子对的第一个原子到其构成的距离最远的原子对向量的cos
cos_c1_f1 #原子对的第二个原子到其构成的距离最近的原子对向量,和原子对的第二个原子到其构成的距离最远的原子对向量的cos
cos_center0_center1 #原子对的第一原子到分子中心点的向量,和原子对的第二个原子到中心点的向量的cos,当atom_1或atom_0的坐标为分子的平均坐标时,cos为nan
cos_c0 #原子对的第一个原子到其构成的距离最近的原子对向量,和该原子对向量的cos
cos_c1 #原子对的第二个原子到其构成的距离最近的原子对向量,和该原子对向量的cos
cos_f0 #原子对的第一个原子到其构成的距离最远的原子对向量,和该原子对向量的cos
cos_f1 #原子对的第二个原子到其构成的距离最远的原子对向量,和该原子对向量的cos
cos_center0 # 原子对的第一原子到分子中心点的向量,和原子对的向量的cos,当atom_1的坐标为分子的平均坐标时,cos为nan
cos_center1 # 原子对的第二原子到分子中心点的向量,和原子对的向量的cos
molecule_couples #分子中有几个原子
atom_0_couples_count #分子中,组成原子对的第一个原子共形成了几个键
atom_1_couples_count #分子中,组成原子对的第二个原子共形成了几个键
molecule_dist_mean #分子中原子对的平均距离
molecule_dist_mean_diff #分子中,原子对的距离和原子对平均距离的差值
molecule_dist_std #分子中原子对距离的标准差
molecule_dist_std_diff #分子中原子对距离和原子对距离的标准差的差值
molecule_dist_mean_min #分子中原子对距离的最小值
molecule_dist_mean_min_diff #分子中原子对距离和原子对距离的标最小值的差值
molecule_type_dist_max #分子中原子对距离的最大值
molecule_type_dist_max_diff #分子中原子对距离和原子对距离的标最大值的差值
molecule_type_dist_mean ,molecule_type0_dist_mean ,molecule_type1_dist_mean #分子中不同类型(eg: type 1JHN, type0:1, type1: JHN)的原子对的平均距离
molecule_type_dist_mean_diff ,molecule_type0_dist_mean_diff,molecule_type1_dist_mean_diff #分子中不同类型的原子对距离的平均值和原子对距离的差值
molecule_type_dist_std,molecule_type0_dist_std,molecule_type1_dist_std #分子中不同类型的原子对距离的平均值
molecule_type_dist_std_diff,molecule_type0_dist_std_diff,molecule_type1_dist_std_diff #分子中不同类型的原子对距离的标准差和原子对距离的差值
molecule_type_dist_min,molecule_type0_dist_min,molecule_type1_dist_min #分子中不同类型的原子对距离的标准差
molecule_type_dist_min_diff,molecule_type0_dist_min_diff,molecule_type1_dist_min_diff #分子中不同类型的原子对距离的最小值和原子对距离的差值
molecule_type0_dist_max,molecule_type1_dist_max #分子中不同类型的原子对距离的最大值
molecule_type0_dist_max_diff,molecule_type1_dist_max_diff #分子中不同类型的原子对距离的最大值和原子对距离的差值
molecule_atom_1_dist_mean ,molecule_atom_1_dist_mean_diff,molecule_atom_1_dist_std,molecule_atom_1_dist_std_diff,molecule_atom_1_dist_min,molecule_atom_1_dist_min_diff,molecule_atom_1_dist_max,molecule_atom_1_dist_max_diff #分子中原子对的第二个原子类型形成原子对的相关信息 atom_0都是H,所以原子对第一个原子形成的原子对信息就不弄了
molecule_atom_index_0_x_1_mean,molecule_atom_index_0_x_1_mean_diff,molecule_atom_index_0_x_1_max,molecule_atom_index_0_x_1_max_diff,molecule_atom_index_0_x_1_min,molecule_atom_index_0_x_1_min_diff,molecule_atom_index_0_x_1_std,molecule_atom_index_0_x_1_std_diff,molecule_atom_index_0_y_1_mean,molecule_atom_index_0_y_1_mean_diff,molecule_atom_index_0_y_1_max,molecule_atom_index_0_y_1_max_diff,molecule_atom_index_0_y_1_min,molecule_atom_index_0_y_1_min_diff,molecule_atom_index_0_y_1_std,molecule_atom_index_0_y_1_std_diff,molecule_atom_index_0_z_1_mean,molecule_atom_index_0_z_1_mean_diff,molecule_atom_index_0_z_1_max,molecule_atom_index_0_z_1_max_diff,molecule_atom_index_0_z_1_min,molecule_atom_index_0_z_1_min_diff,molecule_atom_index_0_z_1_std,molecule_atom_index_0_z_1_std_diff #分子中原子对的第一个原子形成原子对时,第二个原子的相关信息
molecule_atom_index_1_x_0_mean,molecule_atom_index_1_x_0_mean_diff,molecule_atom_index_1_x_0_max,molecule_atom_index_1_x_0_max_diff,molecule_atom_index_1_x_0_min,molecule_atom_index_1_x_0_min_diff,molecule_atom_index_1_x_0_std,molecule_atom_index_1_x_0_std_diff,molecule_atom_index_1_y_0_mean,molecule_atom_index_1_y_0_mean_diff,molecule_atom_index_1_y_0_max,molecule_atom_index_1_y_0_max_diff,molecule_atom_index_1_y_0_min,molecule_atom_index_1_y_0_min_diff,molecule_atom_index_1_y_0_st,molecule_atom_index_1_y_0_std_diff,molecule_atom_index_1_z_0_mean,molecule_atom_index_1_z_0_mean_diff,molecule_atom_index_1_z_0_max,molecule_atom_index_1_z_0_max_diff,molecule_atom_index_1_z_0_min,molecule_atom_index_1_z_0_min_diff,molecule_atom_index_1_z_0_std,molecule_atom_index_1_z_0_std_diff #分子中原子对的第一个原子形成原子对时,第二个原子的相关信息
molecule_atom_index_0_dist_mean,molecule_atom_index_0_dist_mean_diff,molecule_atom_index_0_dist_std,molecule_atom_index_0_dist_std_diff,molecule_atom_index_0_dist_min,molecule_atom_index_0_dist_min_diff,molecule_atom_index_0_dist_max,molecule_atom_index_0_dist_max_diff #分子中原子对的第一个原子形成原子对时,原子对距离的相关信息
molecule_atom_index_1_dist_mean,molecule_atom_index_1_dist_mean_diff,molecule_atom_index_1_dist_std,molecule_atom_index_1_dist_std_diff,molecule_atom_index_1_dist_min,molecule_atom_index_1_dist_min_diff,molecule_atom_index_1_dist_max,molecule_atom_index_1_dist_max_diff #分子中原子对的第二个原子形成原子对时,原子对距离的相关信息
molecule_atom_index_0_dist_min_div
molecule_atom_index_0_dist_std_div
molecule_atom_index_1_dist_min_div
molecule_atom_index_1_dist_mean_div
继续深挖由距离产生的各种特征
inv_dist0 按分子名和atom_index_0分组,分子中以atom_index_0为第一个原子时的距离 1/sum(1/原子对距离^3)
inv_dist1 按分子名和atom_index_1分组,分子中以atom_index_1为第二个原子时的距离 1/sum(1/原子对距离^3)
inv_distp 为inv_dist0和inv_dist_1调和平均的一半
i n v _ d i s t 0 × i n v _ d i s t 1 i n v _ d i s t 0 + i n v _ d i s t 1 \frac{inv\_dist0\times inv\_dist1}{inv\_dist0+inv\_dist1} inv_dist0+inv_dist1inv_dist0×inv_dist1linkM0 按link0[原子对的第一个原子参与的原子对的耦合个数]分组后,分别求mean,inv_dist0-mean
linkM1 按link1[原子对的第二个原子参与的原子对的耦合个数]分组后,分别求mean,inv_dist1-mean
R0,R1 原子对两个原子的半径
E0,E1 原子对两个原子的电负性
inv_dist0R 按分子名和atom_index_0分组,分子中以atom_index_0为第一个原子时的距离
1 s u m ( 1 ( d − r 0 − r 1 ) 2 ) \frac{1}{sum(\frac{1}{(d-r0-r1)^2})} sum((d−r0−r1)21)1
- inv_dist1R 按分子名和atom_index_1分组,分子中以atom_index_1为第二个原子时的距离
1 s u m ( 1 ( d − r 0 − r 1 ) 2 ) \frac{1}{sum(\frac{1}{(d-r0-r1)^2})} sum((d−r0−r1)21)1inv_distpR inv_dist0R和inv_dist1R调和平均的一半
- inv_dist_0E 按分子名和atom_index_0分组,分子中以atom_index_0为第一个原子时的距离
1 s u m ( 1 ( d × ( 0.5 e 0 + 0.5 e 1 ) ) 2 ) \frac{1}{sum(\frac{1}{(d\times (0.5e0+0.5e1))^2})} sum((d×(0.5e0+0.5e1))21)1inv_dist_1E 按分子名和atom_index_1分组,分子中以atom_index_1为第二个原子时的距离
1 s u m ( 1 ( d × ( 0.5 e 0 + 0.5 e 1 ) ) 2 ) \frac{1}{sum(\frac{1}{(d\times (0.5e0+0.5e1))^2})} sum((d×(0.5e0+0.5e1))21)1
inv_dist_pE inv_dist0E和inv_dist1E调和平均的一半
min_molecule_atom_0_dist_xyz 分子中atom_index_0为第一个原子时,最小的键长
mean_molecule_atom_0_dist_xyz 分子中atom_index_0为第一个原子时,平均的键长
max_molecule_atom_0_dist_xyz 分子中atom_index_0为第一个原子时,最大的键长
sd_molecule_atom_0_dist_xyz 分子中atom_index_0为第一个原子时,键长的样本标准差
min_molecule_atom_1_dist_xyz 分子中atom_index_1为第二个原子时,最小的键长
mean_molecule_atom_1_dist_xyz 分子中atom_index_1为第二个原子时,平均的键长
max_molecule_atom_1_dist_xyz 分子中atom_index_1为第二个原子时,最大的键长
sd_molecule_atom_1_dist_xyz 分子中atom_index_1为第二个原子时,键长的样本标准差
distC0,distN0,distH0: c作为该分子中的原子对的第一个原子时,原子对的平均键长
distC1,distN1,distH1: c作为该分子中的原子对的第二个原子时,原子对的平均键长
adN1,adN2,adN3,adN4 按照分子名和atom_index_0分组后,原子对的第二个原子是N时,距离最近的4个键长
adO1,adO2,adO3,adO4, adH1,adH2,adH3,adH4, adF1,adF2,adF3,adF4, adC1,adC2,adC3,adC4 同上
NC,NH,NN,NF,N0 该分子中C,H,N,F,O个数各几个
atom_0,atom_1:原子对的两个原子
atom_2,atom_3,atom_4,atom_5,atom_6,atom_7,atom_8,atom_9:为距离原子对中心点最近的几个原子
d_1_0, d_2_0, d_2_1, d_3_0,d_3_1, d_3_2:atom_0,atom_1,atom_2,atom_3两两之间的距离
d_4_0, d_4_1, d_4_2, d_4_3, d_5_0, d_5_1,d_5_2, d_5_3, d_6_0, d_6_1, d_6_2, d_6_3, d_7_0, d_7_1,d_7_2, d_7_3, d_8_0, d_8_1, d_8_2, d_8_3, d_9_0, d_9_1,d_9_2, d_9_3:atom_4,atom_5,atom_6,atom_7,atom_8,atom_9分别到atom_0,atom_1,atom_2,atom_3的距离
是否成键相关特征
- n_bonds_x: 原子对第一个原子在分子中的成键数目
- n_no_bonds_x:原子对第一个原子在分子中的未成键数目
- dist_mean_no_bond_x:原子对第一个原子在分子中的未成键时的同其他原子距离的平均值
- dist_std_no_bond_x:原子对第一个原子在分子中的未成键时的同其他原子距离的标准差
- dist_median_no_bond_x:原子对第一个原子在分子中的未成键时的同其他原子距离的中值
- range_dist_x:原子对第一个原子在分子中同其他原子距离的范围
- range_dist_bond_x:原子对第一个原子在分子中的成键时的同其他原子距离的范围
- dist_no_bond_min_x:原子对第一个原子在分子中的未成键时的同其他原子距离的最小值
- dist_no_bond_max_x:原子对第一个原子在分子中的未成键时的同其他原子距离的最大值
- range_dist_no_bond_x:原子对第一个原子在分子中的未成键时的同其他原子距离的范围
- n_diff_x:原子对第一个原子在分子中成键时,同其他原子距离有多少不同值
- n_bonds_y: 原子对第二个原子在分子中的成键数目
- n_no_bonds_y:原子对第二个原子在分子中的未成键数目
- dist_mean_no_bond_y:原子对第二个原子在分子中的未成键时的同其他原子距离的平均值
- dist_std_no_bond_y:原子对第二个原子在分子中的未成键时的同其他原子距离的标准差
- dist_median_no_bond_y:原子对第二个原子在分子中的未成键时的同其他原子距离的中值
- range_dist_y:原子对第二个原子在分子中同其他原子距离的范围
- range_dist_bond_y:原子对第二个原子在分子中的成键时的同其他原子距离的范围
- dist_no_bond_min_y:原子对第二个原子在分子中的未成键时的同其他原子距离的最小值
- dist_no_bond_max_y:原子对第二个原子在分子中的未成键时的同其他原子距离的最大值
- range_dist_no_bond_y:原子对第二个原子在分子中的未成键时的同其他原子距离的范围
- n_diff_y:原子对第一个原子在分子中成键时,同其他原子距离有多少不同值
- x_dist_abs,y_dist_abs,z_dist_abs:距离分别在x,y,z轴上的绝对值
- dimension_x,dimension_y,dimension_z:分子中原子坐标分别在x,y,z上最大值-最小值
原子对耦合类型有8个类型[1JHC, 2JHH, 1JHN, 2JHN, 2JHC, 3JHH, 3JHC, 3JHN],由于1JHC类型的耦合常数有断层,所以根据原子对距离将其分为两个类型1JHC, 1JHC_high
特征采样方式
特征来源
top120
从所有特征中选出重要性前120个特征
top_90_10
giba_distance 前90重要特征+其他特征群的前10重要特征
top_60_10
giba_distance 前60重要特征+其他特征群的前10重要特征
top_60_5
giba_distance 前60重要特征+其他特征群的前5重要特征
top_50_5
giba_distance 前50重要特征+其他特征群的前5重要特征
gd_top20
giba_distance所有特征+其他特征群前20重要特征
gd_top15
giba_distance所有特征+其他特征群前15重要特征
gd_top10
giba_distance所有特征+其他特征群前10重要特征
gd_top8
giba_distance所有特征+其他特征群前8重要特征
gd_top5
giba_distance所有特征+其他特征集前5重要特征
gd_mulliken
giba_distance所有特征+qm9中mulliken相关特征
得到了对于不同耦合类型适合的特征选择,从而对不同的耦合类型选择不同的特征进行训练
对test_set预测fc,并将其当做特征,在上述特征选择的基础上,发现fc特征的添加,使得产生过拟合现象,故选择不用fc特征
通过比较在不同的参数下的结果,选择了两套参数
对于1JHC_high耦合类型
LGB_PARAMS = {
'objective': 'regression',
'metric': 'mae',
'verbosity': -1,
'boosting_type': 'gbdt',
'learning_rate': 0.2,
'num_leaves': 128,
'min_child_samples': 79,
'max_depth': 9,
'subsample_freq': 1,
'subsample': 0.9,
'bagging_seed': 11,
'reg_alpha': 0.1,
'reg_lambda': 0.3,
'colsample_bytree': 1.0
其他类型
LGB_PARAMS = {'num_leaves': 255,
'learning_rate': 0.2,
"boosting_type": "gbdt",
'objective': 'regression',
'max_depth': 9, "subsample_freq": 1,
"subsample": 0.9,
"bagging_seed": 11,
"metric": 'mae',
"verbosity": -1,
'reg_alpha': 0.8,
'reg_lambda': 0.2,
'colsample_bytree': 1.0
}</code></pre></li></ul></code></pre></li>
为小队提供了最好的单个模型结果
将我的第一,第二结果和其他公开的模型结果进行blending,最好时为对其取中值。
内存不够(kaggle平台提供16G)
读取csv文件时,不要将全部文件读入,可只读取需要的特征,和需要的行
df=pd.read_csv('x.csv',usecols=[需要的特证名集合],skiprows=[跳过的行数])
转换DataFrame中的数字类型:eg:int32->int8
使用gc模块及时释放内存
虽然python有自动清理内存的机制,但是只有达到阈值时才会触发清理机制,而gc模块可以方便的进行立刻清理内存
import gc
del df
gc.collect()
将测试集切分后,分别进行预测
本次比赛中原子对的耦合可分为8个类型,可以对test_set中不同类型的数据分别进行预测,以减少内存的使用
使用多个kenel,将特征工程分布在不同的kenel中/对结果分类型预测,最后整合
硬盘不够(kaggle平台提供4.9G)
保存文件时,压缩保存
#压缩保存csv文件
df.to_csv('xx.csv.gz',compression='gzip')
#读取压缩csv文件
pd.read_csv('xx.csv.gz',compression='gzip')
手机扫一扫
移动阅读更方便
你可能感兴趣的文章