《Spark大数据技术与应用案例教程》教案第16课提取鸢尾花的特征.docx

上传人:夺命阿水 文档编号:1242649 上传时间:2024-04-12 格式:DOCX 页数:9 大小:53.56KB
返回 下载 相关 举报
《Spark大数据技术与应用案例教程》教案第16课提取鸢尾花的特征.docx_第1页
第1页 / 共9页
《Spark大数据技术与应用案例教程》教案第16课提取鸢尾花的特征.docx_第2页
第2页 / 共9页
《Spark大数据技术与应用案例教程》教案第16课提取鸢尾花的特征.docx_第3页
第3页 / 共9页
《Spark大数据技术与应用案例教程》教案第16课提取鸢尾花的特征.docx_第4页
第4页 / 共9页
《Spark大数据技术与应用案例教程》教案第16课提取鸢尾花的特征.docx_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《《Spark大数据技术与应用案例教程》教案第16课提取鸢尾花的特征.docx》由会员分享,可在线阅读,更多相关《《Spark大数据技术与应用案例教程》教案第16课提取鸢尾花的特征.docx(9页珍藏版)》请在课桌文档上搜索。

1、课题提取莺尾花的特征课时2课时(90min)教学目标知识技能目标:(1)掌握常用的特征提取算法(2)掌握常用的特征转换算法(3)掌握常用的特征选择算法素质目标:(1)能熟练运用机器学习算法解决日常生活中的数据分析问题(2)培养自主学习意识,提升实践操作能力教学重难点教学重点:SParkMLlib的特征取、特征转换和特征!蟒教学难点:使用SparkMLlib的特征提取、特征转换和特征选择等特征化工具处理数据教学方法案例分析法、问答法、讨论法、讲授法教学用具电脑、投影仪、多媒体课件、教材教学过程主要教学内容及步骤课前任务【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过APP或其他学习软

2、件,完成课前任务了解SParkMLlib的特征提取、特征转换和特征选择算法。【学生】完成课前任务考勤【教师】使用APP进行签到【学生】班干部报请假人员及原因问题导入【教师】提出以下问题:什么是数据特征?【学生】思考、举用答传授新知【教师】通过学生的回答引入新知,介绍特征提取、特征转换和特征选择的相关知识一、特征提取特征提取是指从原始数据中提取有用的、可数的、可比较的特征的过程。它可以将复杂的数据转换成便于分析和处理的数据形式,同时减少计算量和存储空间.pyspark.ml包椅共的梯睡取算;抱括TF-IDFxWord2Vec等,1.TF-IDF【教师】介绍TF-IDF算法词频-逆文档频率(ter

3、mfrequency-inversedocumentfrequency.TF-IDF)算法是文本挖掘领域常用的特征提取方法。它用于评估一个词语对于语料库中的某个文档的重要程度,可应用于搜索引擎、推荐系统、文本分类、聚类分析等多个领域。词频(termfrequency,TF)表示一词语在文档中出现的频率。逆文档频率(inversedocumentfrequency,IDF)用于衡量一个词语在整个语料库中的稀有程度。TF-IDF算法的工作原理如下。一、笛T怀闩怀某个词语在文档中出现的次数(1)计算词频。词频=-FWsV、-文档的总词语数c,也.西怀宓b地幅它1(语料库的文档总数、(2)计算逆文档频

4、率。逆文粕频率一log(有小2、干五的五工也将J。包含该词语的文档数+1(3)计算TF-IDF.TF-IDF=词频?逆文档频率在SparkMLlib中,TF-IDF算法的实现步骤如下。首先使用HaShingTFo方法计算词频,该方法的基本格式如下。HashingTF(inputCol,OutputCol,numFeatures,binary)其中,参数inputCol表示输入列的名称;参数OUlPUtCOI表示输出列的名称;参数numFeatures(可选)表示特征向量的维度大小,默认值为262144;参数binary(可选)表示是否将特征向量中的非零值设置为1,默认值为FalSe.然后使用I

5、DFO方法计算每个词语的TFIDF度量值,该方法的基本格式如下。IDF(inputCol,otputCol,minDocFreq)其中,参数inputCol表示输入列的名称,该输入列为HaShingTF()方法的输出列;参数OUtPUlCOI表示输出列的名称;参数minDocFreq(可选)表示词语至少出现在语料库中的minDocFreq个文档中才会被考虑,默认值为Oe【教师】通过例子,帮助学生掌握TF-IDF算法的应用【例5-1使用TF-IDF算法计算每个词语的TF-IDF度量值,输出结果如图5-5所示。IIIabeISlfeatures1二二:二二二二二二二二;二二二二二二二二二二二二二二

6、二二二二二二二二二二二二二二二二二二0I(2000.(202,467.845.891,1209,1263.1286.1S8J.1720,1996,(O.M471S05599453.0.W31471805599453.0.69314718055M4S3,0.0.0.28768207245178085.0.6931471805599453,0.28768207245178085,0.6931471805599453,0.6931471805599453.0.6931471805S99453)I|1(2000.(66.BO,344,466,6690,S91.1048.1209.1S7S,1585,1

7、69S).(0.693147180S5994S3.0.69314nBOSS9MS3.0.6931471SOSS99453.06931471805599453,0.6931471805599453.0.6931471805599453,0.0.0.6931471805599453.0.28768207245178085.0.6931471805599453.0.28768207245178085.0.28768207245178085)2I(2000.(7.40.312.488.547.K3JS1.891,1286.1S85.1605.1695J.(0.69n47180559945J.0.693

8、H71805SMS3,0.6931471SOSS9M53.0.6931471805599453,0.6931471805S99453,0.6931471805599453.0.6931471805599453,0.0.0.28768207245178085,0.28768207245178085,0.6931471805599453t0.28768207245178085)|图5-5TFlDF算法的输出结果hadoopbogon-$pysparkfrompyspark.ml.featureimportHashingTF,IDFfrompyspark.sql.functionsimportspl

9、it#定义数据data=(0,ApacheSparkisafastandgenera!-purposeclustercomputingsystem),(1,Hadoopisanopen-sourcesoftwareframeworkforstoringandprocessingbigdata),(2,SparkandHadoopareoftenusedtogethertoprocesslarge-scaledatasets)# 创建DataFramedf=spark.createDataFrame(data,labels,text)# 将text列的文本拆分为单词,并将该列的列名修改为word

10、sdf=df.withColumn(words,split(df.tex(,)# 创建HashingTF对象hashingTF=HashingTF(inputCol=,words,OutputCol=rawFeatures,numFeatures=2(XX)# 执行转换操作,应用HaShingTF模型进行数据转换featurizedDa(a=hashingTF.transfrm(df)# 创建IDF对象idf=IDF(inputCol=rawFeatures,OutputCol=features*)# i川练IDF模型idfModel=idf.fit(FeaturizedData)# 应用ID

11、F模型进行数据转换rescaledData=idfModel.transfbn(featurizedData)#选择标签和特征列并显示结果rescaledData-select(labeIs,features).shoWftnmcate=False)【高手点拨】DataFrame的withColumn(columnName,COl)方法用于在现有DataFrame中添加、替换或修改列。其中,参数COlumnName表示要添加或修改的列的名称;参数col表示要添加或替换的列的值或表达式。在机器学习中,训练和测试模型的数据集可以不同也可以相同,即可以将数据集划分为训练集和测试集,也可以不划分。Sp

12、arkMLIib提供了一些训练好的模型,开发人员可以直接使用transfOrm()方法应用这些模型对数据进行转换操作。输出结果中特征列features的数据说明如表5-2所示。表5-2输出结果中特征列的数据说明特征列数据说明2000代表特征向量的维度大小为2000202.467,845,891.1209,1263,1286.1583.1720,1996oApache,Spark,is,a,fast,and,general-purpose,cluster,computing,system*的哈希值0.6931471805599453,0.6931471805599453,0.6931471805

13、599453.0.6931471805599453表示每个词语的TF-IDF度量值2.Word2Vec【教师】介绍WordZVec算法词向量(Word2Vec)是一种基于神经网络的自然语言处理模型,用于将词语表示为高维向量。WOrd2Vec模型一旦训练完成,就可以使用该模型获得每个词语的向量表示.这些向量可以作为输入特征用于各种任务,如文档分类、情感分析和推荐系统等。WOrd2Vec()方法的基本格式如下。Word2Vec(inputCol,outputCol,VectorSize,minCount,Partitions,maxIter,StepSize,seed,windowSize,max

14、SentenceLength,inputTokenizer,OutputWordEmbeddings)其中,常用参数的含义如下。inputCol:表示输入列的名称.OUtPUICol:表示输出列的名称。(详见教材)【小提示】本书只讲解每个方法的常用参数,未提到的参数请自行查阅官方文档进行学习。【教师】通过例子,帮助学生掌握Word2VeC算法的应用【例5-2使用VVord2Vec算法将单词表示为高维向量,输出结果如图5-6所示。hadoop()bogon$pysparkfrompyspark.ml.featureimportWord2Vecfrompyspark.sql.functionsim

15、portsplit,col#定义一些句子,每个句子分解为单词组成的列表Seq=IheardaboutSparkandIloveSpark.split(),IwishJavacouldusecaseclasses.split(,),Logisticregressionmodelsareneat.split()1顺建DataFrame,将列表中的每个元素转换为一行数据,并将列名命名为textdf=spark.createDataFrame(s,)forsinseq,text)舱!J建Word2Vec对象,设置输入和输出列、词向量的维度大小和最小词频word2Vec=Word2Vec(inputCo

16、l=text,outputCol=result,vectorSize=3,minCount=0)相Il练Word2Vec模型model=word2Vec.fit(df)#应用Word2Vec模型迸行数据转换result=model.transform(df)result.select(text,result).show(truncate=False)result.select(text,result*).shw(truncateFalse)ItextIresult-I(I,heard,about,SparkfandtI,love,SparkI(-0.0632904237136244810.02

17、1146534476429224r-0.01727932202629745II.wish.Java9could,use.case,classes(-0.008821263876078385.-0.011005219338195664.-0,008713434317282267I(Logistic,regression,models,are,neat0.0799966722726822,*0.010457423329353333l0.01600616276264191)图5-6WOrd2Vec算法的输出结果二、特征转换【教师】介绍常用的特征转换算法特征转换是指1各原始数据中特征值的表示形式转换为

18、新的特征表示形式,以便更好地进行城分析和模型训练。特征转换可以通过对原始特征进行加工、组合、降维等方式来实现。PySPark.ml包提供了大量特征转换算法,常用的特征转换算法如下。(1)Tokenizer.Tokenizer用于分割给定的文本数据,将文本中的句子转换为4的、独立的单词序列。TokeniZerO方法的基本格式如下。Tokenizer(inputCol,outputCol)其中,参数inputCol表示输入列的名称;参数OUlPUtCol表示输出列的名称。(2)BinarizereBinarizer可以将某个特征的取值二值化,即将小于某个阈值的值设置为0,大于等于该阈值的值设置为L

19、BinariZer()方法的基本格式如下。BinarizeKinpuiCoI,outputCol,threshold)其中,参数inputCol表示输入列的名称;参数outputCol表示输出列的名称;参数threshold(可选)表示阈值,默认值为0.0(3)StringIndexereSuingIndexer可以将原始的字符串类型的特征映射到一个整数序列上,其中不同的字符串会被映射到唯一的整数值上。SIringIndeXer。方法的基本格式如下。StringIndexer(inpulCol,outputCol.handleinvalid.StringOrderType)其中,参数input

20、Col表示输入列的名称;参数outputCol表示输出列的名称;参数HandleInvalid表示如何处理无效的输入数据,可选值包括error(抛出异常)、skip(期诅该特征值)和keep(将其视为一个新的特征值),默认值为error;参数s(ringOrderType表示字符串的索引顺序类型,可选值包括frequencyDesc(按照出现频率降序排序)、FrequencyAsc(按照出现频率升序排序),alphabetDesc(按照字母表顺序降序排序)等,默认值为frequencyDesc.(4)NonnalizereNormaIiZer可以对每个样本进行规范化操作。NonnaIiZero

21、方法的基本格式如下。Normalizer(inputCol,outputCol,p)其中,参数inputCol表示输入列的名称;参数outputCol表示输出列的名称;参数P表示要使用的范数类型,常见的取值有LO(U范数)、2.0(L2范数)和np.inf(无穷范数),默认值为2.0.(5)MinMaxScalereMinMaxScaler可以将每个特征缩放到给定的范围,使所有特征都具有相同的重要性。MinMaXSCaIero方法的基本格式如下。MinMaxScaler(inputCol,outputCol,min,max)其中,参数i11putCol表示输入列的名称;参数OUlPUtCoI表

22、示输出列的名称;参数min(可选)表示特征缩放后的最小值,默认值为0.0;参数max(可选)表示特征缩放后的最大值,默认值为l.0(6)主成分分析(PCA).PCA可以将高维的数据转换为低维的数据,同时尽量保留原始数据中的关键信息.PCAo方法的基本格式如下.PCA(k,inputCol,outputCol)(7)VectorAssemblereVectorAssembler可以将多列娄照合并为单个向量列。VeClorASsemblero方法的基本格式如下.VectorAssembler(inputCols,outputCol,Iiandlehivalid)其中,参数inputCols表示输入

23、列的名称;参数outputCol表示输出列的名称;handieinvalid表示如何处理无效的输入数据,可选值包括error,skip和keep,默认值为error(8)SiandardScaIereStandardScaler用于对数据集中的特征j进行标准化处理。SlandardSCaler()方法的基本格式如下。StandardScaler(withMean,withStd,inputCol,outputCol)其中,参数WithMean表示是否将叫进行均值归一化处理,默认值为True;参数WiIhStd表示是否将数据进行标准差归一化处理,默认值为True;参数inputCol表示输入列的

24、名称;参数outputCol表示输出列的名称.【教师】通过例子,帮助学生掌握特征转换算法的应用【例5-3使用Binarizer算法将年龄进行二值化处理,将阈值设置为30,特征值超过30的映射为1.0,特征值小于30的映射为0.0,输出结果如图5-7所示.hadoop()bogon$pysparkfrompyspark.ml.featureimportBinarizerfrompyspark.sql.functionsimportcol#创建DataFramedata=SPark.CreaieDaiaFrameU(Bob,21),(,Mary,18),(William,35),name,age,

25、)(详见教材)binarized.data.select(name.age*,bin.age).show()-.-.Inameagebin_age-+IBob21.00.0Haryj18.010.0IWilliaml35.011.0-+图5-7Binarizer算法的输出结果【例5-4使用Stringlndexer算法将相同类别的水果映射为相同的数值,输出结果如图5-8所示。(hadoopbogon$pysparkfrompyspark.ml.featureimportStringIndexer#定义数据data=(*,ale.O),(orange,1),(banana,2),(apple,3

26、),(banana,4),(orange,5),(peach,6)(详见教材)indexed,show()+IfruitIidIlabelIIappleIIorangeIbananaIIappleIbananaIIorangeIpeachI00.012.021.030.041.052.0613.0图5-8StringIndexer算法的输出结果【例5-5分别使用Normalizer4MinMaxScalcr和StandardScaler算法对领三三彳tS1,输出结果如图5-9所示。non.data.show()+IidIfeaturesnormalized.features+I011.0.2.

27、0,3.0I0.26726124191242.|I1|4.0,5.0,6.0I(0.45584230583855.|I2|7,0,8.0,90I0.50257071103241.|+minmax.data.show()+IidIfeaturesminmax,scaled.featuresI01.0,2.0,3.0(3,)lIl4.0,5.0,6.00.5,0.5,0.5I27.0,8.0,901,0,1.0,1.0+stand.data.show()+IidIfeatures)standsrd.scaled.features)+I01,0,2.0,300,33333333333333.I14.

28、0,5.0,601.33333333333333.I27.0,8.0,9.02.33333333333333.+图5-9NormalizesMinMaXSCaIer和StandardSCaIel算法的输出结果hadoopbogon$pysparkfrompyspark.ml.featureimportNormalizer.StandardScaler,MinMaxScalerfrompyspark.ml.IinalgimportVectors(详见教材)三、特征选择【教师】介绍常用的特征选择算法特征选择是指从数据集中选择最优的特征子集,从而改进机器学习模型的性能并减少模型复杂度。pyspark

29、.ml包提供了大量的特征选择算法,常用的特征选择算法如下。(I)ChiSqSelectoreChiSqSelector可以选择与标签最相关的前numTopFeatures个特征.ChiSqSeIeCtOrO方法的基本格式如下。ChiSqSelector(nunTopFeatures,featuresCol,outputCol,IableCol)其中,参数numTopFeatures(可选)表示要选择的顶部特征数量,默认值为50;参数featuresCol表示输入特征列的名称;参数OUtPUtCoI表示输出列的名称;参数IableCol表示输入标签列的名称。(2)VectorSlicereVec

30、torSlicer可以提取特征向量中的特定特征列.VeClorSIiCer()方法的基本格式如下。VectorSlicer(inputCol,outputCol,indices,names)其中,参数inputCo)表示输入列的名称;参数OUtPUtCOl表示输出列的名称;参数indices(可选)表示要选择的特征在输入的特征向量中的索引;参数names(可选)表示要选择的特征的名称。【教师】通过例子,帮助学生掌握特征选择算法的应用【例56】读取SPark安装目录下自带的示例文件“usrIOCalsparkdatamllibSamPIe_libsvm_data.txt”,输出原始特征如图5-1

31、0所示。然后,使用ChiSqSelector实现特征选择,输出结果如图5-11所示。hadoop(bogon-$pysparkfrompyspark.inl.featureimportVectorAssembler,ChiSqSelectorfrompyspark.sql.functionsimportcol舱0建DataFramedata=SPark.read.formai(libsvm).load(file:/usrlocalSParkdaamllibSamPleibsvm_daia.lxT)data.show().(详见教材)data,show()result.select(label,

32、SelectedFeatures).show(truncate=False)IlabelIfeatures)+I0.0(692,127.128,129.I1.0(692,158,159,160.I1.0(692,124,125,126.I1.0(692,152,153,154.I1.0(692,151,152,153.I0.0(692,129,130,131.I1.0(692,158,159,160.II1.0(692,99,100,101,.I0.0(692,154,155,156.I0.0(692,(127,128,129.II1.0(692,154,155,156.II0.0(692,1

33、53,154,155.!0.0(692,151,152,153.I1.0(692,129,130,131.I0.0(692,154,155,156.I1.0(692,150,151,152.I0.0(692,124,125,126.I0.0(692,152,153,154.I1.0(692,97,98,99,12.I1.0(692,124,125,126.+onlyshowingtop20rows图5-10原始特征【学生】聆听、思考、理解、记录labelISelectedFeatures0-01(2.),)10|(2,0,1,251.0,253,0)1.0(2,O,l1252.O,252.O)

34、1-0|(2,0,1,254.0,254.0)10|(2,0,1,254.0,254.0)O.O|(2,)1-0|(2,0,1,253.0,254.0)10(2,0,19.0)0.0(2,0,20.0)O.O|(2,(,)10(2,(0,l,253.0,253.0)00|(2,)0.0|(2,)10|(2,0.1,254.0,253.0)O.O(2,0,72.0)10(2,0,l,255.0,254,0)00|(2,)0.0|(2,)101(2,0,1,253.0,253.0)10|(2,0,1,254.0,254.0)+-+nlyshowingtop20rows图5-U进行特征选择后的结果课

35、堂实践【教师】介绍“提取鱼尾花的特征”的大概流程,安排学生扫描微课二维码观看视频“提取莺尾花的特征“(详见教材),并要求学生进行相应操作打开PyCharm,在IrisFeaiurepy文件中继续编写应用程序,实现莺尾花数据的特征处理。具体实现步骤如下。步骤IA创建VectorAssenibler对象assembler,将所有特征列转换为单个特征列features。步骤2A对iris应用VeCtorASSemblCr模型assembler,得到数据转换结果data_with_features.首先使用IranSfOIm()方法将iris中的所有特征列转换为单个特征列然后使用SeleCt()方法选

36、取features列和IabeI列,仅保留转换后的特征列和原始标签列。步骤3A使用ShOWo方法显示特征合并后的结果。(详见教材)【参考代码】# 将所有特征列转换为单个特征列# 创建VectorAssembIer对象assembler=VectorAssembler(inputCols=sepaljength.sepal-width,petaljengthpetal_width.outputCol=features)# 应用VeCtorASSembler模型进行数据转换,并选取指定列data_with_features=assembler,transfbrm(iris).select(col(

37、features),col(label*)# 显示特征合并后的结果data_with_features.show()#对特征列进行降维#创建PCA对象PCa=PCA(k=2,inputCol=features,outputCol=pcaFeatures)制I练PCA模型model=pca.fit(daia_with_features)#应用PCA模型转换数据,并选取指定列iris_pca=model.transfbnn(data_with_features).selec(col(caFeaiures),col(label)#显示使用PCA降维后的数据iris_pca.show(runcaie=

38、False)#将字符串标签列转换为数值标签列殖)建StringIndexer对象IabeIJndexer=StringIndexer(inputCol=label,outputCol=label_index)判1|练并应用StringlndeXer模型indexed=label_indexer.flt(iris_pca).transfbnn(iris_pca)#显示将字符串标签列转换为数值标签列后的数据indexed.show()【运行结果】在PyCharm中运行代码,控制台输出的结果依次为特征合并后的数据、降维后的数据和将字符串标签列转换为数值标签列后的数据,如图5-12所示.,4.一一Ip

39、caFwturesIIBgIIIfeaturesI,pcaFtvrsXebXlXaM.lndlA”.,.IIt-2.827135V726790286,-5.64153X45573357IJrls-stsaI(5.Ir3.5,0.211Iris-setoseI,I(-2.827135972679e.IIris-MtOMI6.01r.-,.o4.II(-2.795952482X48W6,-5.145166883252942IXrls*stOSl.4.9r36.1.21llrls-stoselt(-2.Irls-stMe.llfz,n,ll.I-2.621523558165B6r-5.3773781

40、2120394)IZ11s*stosaltl(4.7r3.21.3re.2jlXrXs-stosal,(-2.62123SM16Se.IXrls-stM.l.6,j.1.1.5,.2llris-toiC械534742%T”WwmM-WvI.elH1-2.7827501151662,-5.8577HrlS-S.toM|ll.2.78275u5,5w.111,.mmm1.lH5.4,3.9,1.7.e.4IIrl-t0.lt-3.23K457367733795.I!rU-S.tolll.j.2jt457j677s5.lJpl,.Mt0M),ll(4.6,3.1.4,.5llris-seto,81(

41、-2.524157.-5.2326X92X9784287l.2.6wt524152j.|:rl,.Mt0M).1(5.6.3.4,1.5,0.2)1188111-2.884841164459158,-5.45129879769255jIXrU-s.tOSal1.2.m4ww4591.r1,.mmm,elI4.4,2.9,1.4.e.3llru-S.te|(-2-6253845327542.-4.743Q2574477577IlML(.2.623U4,32447.Irl,.Mtot.|e.ll(4.,3.1.1.S.e.lIIrl.-Stoe|I(-2.837498411963854,-5.26

42、80520270562295)llrls-setoallr-,ellS.A,3,7,1.5,.2)IIrlS*SetOSalIl-3.4816384447S8,-5.966458744481MIIrl*-StOSI(.jee4(163M4Ae.rls-st0MI.l4.8r3.4a.6r.2Irls-stOS01(-2.8982603795119207,-5.336244362769227jI.3(8937663795119.IXris-stOMI.0lI4.8.3.,1.4,B.IjlXrii-Setosal(-2.72S9e12J785879,-5.M6W3M1957862IIris-st

43、osal.27239912178S.IIrB-stOMI.lI(4.3r3e4l.lfe.lIIriS-SetosaII-2.28614265157?96,-4.811443821323543IXrls*stosal(2.28142651879.IIflt0Me.I(S.8r4.l.2v.2IlrlS-SemeIK-2.867799MeW18512,-6.5ea9185e222419Irls-stOSl.2.8677998M8418.IZrXs-stMIe.I5.7v4.4.1.5r0.4Xrls-stosaI-3.127473773?836023,-6.659478675883IZrls*s

44、tosal(-3.127473773983.IIris-MtOMl88lI(9.4r3.1.3v.4)IIrlS-SetosaI1(-2.8S88168946571686,-6.1328134545563)IIrls*stosal(2.88SS168946571.IIrH-ttOMIS.1,3.5.1.4.3Ilris-MtoselI-2.845825453385*.-5.433639S559853)IIris-stosI11.2.863026JM3M.IIrlsstOMIe.(5.7r3.8.1.7v.3Xrls-stosalI-3.312265136352215,-6.1939678180705IZ11s*

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号