




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
習題1一簡答題1.什么是機器學習?機器學習按照算法的學習方式分為哪幾類?答:機器學習是計算機從數(shù)據(jù)中學習到規(guī)律和模式,以應用在新數(shù)據(jù)上完成預測任務的一種技術。根據(jù)算法的學習方式可以分為監(jiān)督學習、無監(jiān)督學習、半監(jiān)督學習和強化學習。2.什么是監(jiān)督學習?什么是無監(jiān)督學習?二者的主要區(qū)別是什么?答:監(jiān)督學習是使用“標記好”的訓練數(shù)據(jù)進行訓練,并基于該數(shù)據(jù)預測輸出。無監(jiān)督學習不使用訓練數(shù)據(jù)集進行監(jiān)督,模型使用未標記的數(shù)據(jù)集進行訓練,并允許在沒有任何監(jiān)督的情況下對該數(shù)據(jù)進行操作。二者的主要區(qū)別是監(jiān)督學習是有導師,數(shù)據(jù)是標記好的。無監(jiān)督學習是無導師,數(shù)據(jù)沒有標記。3.什么是半監(jiān)督學習?它有什么優(yōu)勢?答:半監(jiān)督學習在訓練模型時同時使用了有標簽數(shù)據(jù)和無標簽數(shù)據(jù),其中小部分是有標簽數(shù)據(jù),大部分是無標簽數(shù)據(jù)。與有監(jiān)督學習相比,半監(jiān)督學習成本較低,但是仍能達到較高的準確度。4.分類、聚類、回歸、關聯(lián)這4種常用算法,哪些屬于有監(jiān)督學習,哪些屬于無監(jiān)督學習?答:分類、回歸屬于有監(jiān)督學習。聚類、關聯(lián)屬于無監(jiān)督學習。5.機器學習算法開發(fā)應用程序的步驟分為哪幾步?答:數(shù)據(jù)獲取、數(shù)據(jù)預處理、模型訓練、模型測試、模型應用二操作題1在自己的電腦上部署Python環(huán)境,并完成例1-1的helloworld項目創(chuàng)建。略2在自己的電腦上部署Spark環(huán)境,并完成例1-2的helloworld項目創(chuàng)建。略一簡答題1在機器學習的流程中,數(shù)據(jù)預處理的作用是什么?答:數(shù)據(jù)預處理的作用是,使數(shù)據(jù)符合后續(xù)的模型訓練和模型測試的要求。2數(shù)據(jù)預處理包括哪兩個方面?答:包括數(shù)據(jù)清洗和數(shù)據(jù)轉換。3什么是數(shù)據(jù)清洗,數(shù)據(jù)清洗主要包括哪幾個方面?答:數(shù)據(jù)清洗,就是將數(shù)據(jù)中缺失、不完整或有缺陷的數(shù)據(jù)進行處理,輸出正確完整的數(shù)據(jù)集。主要包括:數(shù)據(jù)過濾、重復值處理、缺失值處理、異常值處理。4什么是數(shù)據(jù)轉換,數(shù)據(jù)轉換主要包括哪幾個方面?答:數(shù)據(jù)轉換就是把清洗好的數(shù)據(jù)轉換成能夠輸入到算法模型的格式類型。主要包括:(1)將文字性類別數(shù)據(jù),編碼為數(shù)字。(2)從文本中提取有用的信息。(3)將數(shù)值類型數(shù)據(jù)轉換為類別數(shù)據(jù)。(4)對數(shù)值特征進行轉換。(5)對數(shù)據(jù)進行歸一化和標準化。(6)特征工程。二計算題1對表2-3中的數(shù)據(jù)進行清洗和填充。清洗的規(guī)則是:(1)刪除目標字段缺失的記錄。(2)刪除缺失值比例大于等于50%的記錄。清洗后對價格字段的缺失值做均值填充。表2-3:ID地區(qū)價格日期保質期等級1甲地區(qū)1002020-11-112年二級2乙地區(qū)1402020-08-093年一級3丙地區(qū)1202020-09-102年一級4甲地區(qū)Null2020-08-102年二級5乙地區(qū)1102020-09-302年Null6NullNullNull3年一級解:(1)數(shù)據(jù)清洗:ID地區(qū)價格日期保質期等級1甲地區(qū)1002020-11-112年二級2乙地區(qū)1402020-08-093年一級3丙地區(qū)1202020-09-102年一級4甲地區(qū)Null2020-08-102年二級(2)均值填充:ID地區(qū)價格日期保質期等級1甲地區(qū)1002020-11-112年二級2乙地區(qū)1402020-08-093年一級3丙地區(qū)1202020-09-102年一級4甲地區(qū)1202020-08-102年二級2已知A服從標準正態(tài)分布A~N(0,1),按照3σ原則找出對A的觀測值x=[1.22,-0.41,-0.3,1.46,-3.26,-0.02,-1.49,-0.46,0.69,-1.78]之中的異常值。解:A~N(0,1),均值μ=0,方差σ2=1,標準差σ=1,3σ=3因此-3.26是異常值,因為它與均值的距離超過了3.3對屬性A的觀測數(shù)據(jù)如下x=[47.5,66.5,44.5,49.4,57.8,47.9,59.0,30.5,54.9,61.7],共10個數(shù)據(jù),將x進行標準化操作。解:(1)均值μ=sum(x)/10=51.97(2)標準差S=sqrt(sum((x-μ)^2)/(10-1))=10.316(3)y=(x-μ)/S=[-0.43,1.41,-0.72,-0.25,0.57,-0.39,0.68,-2.08,0.28,0.94]4對屬性A的觀測數(shù)據(jù)如下x=[47.5,66.5,44.5,49.4,57.8,47.9,59.0,30.5,54.9,61.7],共10個數(shù)據(jù),將x進行歸一化操作。解:(1)min_x=30.5,max_x=66.5(2)y=(x-min_x)/(max_x-min_x)=[0.47,1.0,0.39,0.52,0.76,0.48,0.79,0.0,0.68,0.87]5語料集中有4個文檔:(1)IlikeSpark.(2)IlikePython.(3)WeuseSparkMLlib.(4)PythonandSparkaregood.計算文檔(1)中單詞Spark的TF-IDF(t,d)。解:文檔(1)有3個單詞,Spark出現(xiàn)1次,TF(t,d)=1/3語料集有4個文檔,Spark在3個文檔中出現(xiàn),IDF(t)=log(4/3)TF-IDF(t,d)=1/3*log(4/3)=0.0416三編程題1利用Python工具,對泰坦尼克數(shù)據(jù)集Titanic.csv進行數(shù)據(jù)預處理,要求如下:(1)讀取數(shù)據(jù),查看統(tǒng)計信息。(2)數(shù)據(jù)去重。(3)缺失值處理:去掉數(shù)據(jù)比例小于60%的列;去掉數(shù)據(jù)比例小于60%的行;對embarked字段空值用unknown填充。(4)文字轉數(shù)據(jù):將sex字段轉換male為0,female為1。將pclass和embarked字段進行oneHotKey轉換。(5)對name字段進行特征提取。從name字段中提取first_name,name是以逗號進行分割的,第一部分就是first_name。提取每一個first_name的詞頻-逆文本頻率(TF-IDF),作為新的字段name_tf-idf,替換原來的name字段。(6)對字段name_tf-idf進行數(shù)據(jù)標準化。解:代碼如下:importnumpyasnpimportpandasaspdpd.set_option('display.max_columns',None)print("----------(1)讀取數(shù)據(jù),查看統(tǒng)計信息,并做簡單可視化。---------")df01=pd.read_csv("titanic.csv",index_col="s")print(df01)#查看數(shù)據(jù)的行數(shù)與列數(shù),一般來說行代表樣本數(shù),列代表feature數(shù)print("行數(shù)和列數(shù)shape=",df01.shape)#查看數(shù)據(jù)的前5行print("df01的前5行數(shù)據(jù):\n",df01.head())#查看每一列的計數(shù)及數(shù)據(jù)類型等信息print("查看每一列的計數(shù)及數(shù)據(jù)類型等信息:")print(())#查看統(tǒng)計信息print("查看統(tǒng)計信息:\n",df01.describe())#用直方圖進行簡單可視化importmatplotlib.pyplotaspltdf01.hist(grid=False,figsize=(12,12))plt.show()print("----(2)數(shù)據(jù)去重-----")print("檢查df01種數(shù)據(jù)重復情況:")print(pd.DataFrame(df01.duplicated(keep="last")).describe())df01=df01.drop_duplicates()print("數(shù)據(jù)去重以后的df01的shape:")print(df01.shape)print("----(3)缺失值處理----")print("去掉數(shù)據(jù)比例小于cutoff的列:")defdrop_col(df,cutoff=0.6):#cutoff指的是有數(shù)據(jù)的比例n=len(df)forcolumnindf.columns:cnt=df[column].count()if(float(cnt)/n)<cutoff:df=df.drop(column,axis=1)returndfdf01=drop_col(df01)print("處理以后的df01的shape:")print(df01.shape)print("去掉數(shù)據(jù)比例小于cutoff的行:")defdrop_row(df,cutoff=0.6):#cutoff指的是有數(shù)據(jù)的比例n=df.shape[1]forrowindf.index:cnt=df.loc[row].count()ifcnt/n<cutoff:df=df.drop(row,axis=0)returndfdf01=drop_row(df01)print("處理以后df01的shape:")print(df01.shape)print("處理以后df01的info:")print(())print("觀察embarked字段哪個值最多:")print(df01["embarked"].groupby(df01["embarked"]).count())print("對embarked字段空值用unknown填充:")df01["embarked"].fillna("unknown",inplace=True)print("處理以后df01的info:")print(())print(df01)print("----(4)文字轉數(shù)據(jù)----")print("sex字段轉換male為0,female為1:")df01['sex']=df01.apply(lambdax:int("female"inx["sex"]),axis=1)print(df01)categorical_features=['pclass','embarked',]df_cat=pd.get_dummies(df01[categorical_features])print("將pclass和embarked進行oneHotKey轉換:")print(df_cat)df01=df01.drop(categorical_features,axis=1)df01=pd.concat([df01,df_cat],axis=1)print("轉換以后的結果:")print(df01)print("----(5)對name字段進行特征提取----")print("name字段中提取first_name:")df01["first_name"]=df01["name"].apply(lambdax:str(x).split(",")[0])print(())print(df01)print("統(tǒng)計name_count字段:")df02=df01['first_name'].groupby(df01['first_name']).count()df01['name_count']=df01['first_name'].apply(lambdax:df02[x])print(df01)print("統(tǒng)計name_tf-idf:")df01['name_tf-idf']=df01['name_count'].apply(lambdax:np.log10(1312/x))deldf01['name'];deldf01['name_count'];deldf01['first_name']print(df01)print("----(6)數(shù)據(jù)標準化----")fromsklearn.preprocessingimportStandardScalerss=StandardScaler()scale_features=['name_tf-idf']df01[scale_features]=ss.fit_transform(df01[scale_features])print("數(shù)據(jù)標準化以后的結果:")print(df01)2利用Spark工具,對泰坦尼克數(shù)據(jù)集Titanic.csv進行數(shù)據(jù)預處理,要求如下:(1)讀取數(shù)據(jù),查看統(tǒng)計信息。(2)數(shù)據(jù)去重。(3)缺失值處理:去掉數(shù)據(jù)比例小于60%的列;去掉數(shù)據(jù)比例小于60%的行;對embarked字段空值用unknown填充。(4)文字轉數(shù)據(jù):將sex字段轉換male為0,female為1。將pclass和embarked字段進行oneHotKey轉換。(5)對name字段進行特征提取。從name字段中提取first_name,name是以逗號進行分割的,第一部分就是first_name。提取每一個first_name的詞頻-逆文本頻率(TF-IDF),作為新的字段name_tf-idf,替換原來的name字段。(6)對字段name_tf-idf進行數(shù)據(jù)標準化。解:代碼如下:importorg.apache.log4j.{Level,Logger}importorg.apache.spark.ml.feature.{OneHotEncoderEstimator,StandardScaler,StringIndexer,VectorAssembler}importorg.apache.spark.sql.SparkSessionobjectxiti02_07{defmain(args:Array[String]):Unit={Logger.getLogger("akka").setLevel(Level.OFF)Logger.getLogger("org").setLevel(Level.OFF)valspark=SparkSession.builder().appName("aaa").master("local[*]").getOrCreate()println("----(1)讀取數(shù)據(jù),查看統(tǒng)計信息。----")valdf01=spark.read.option("inferSchema",true).option("header",true).csv("titanic.csv")df01.show(5)df01.describe().show()println("----(2)去除索引列s,并進行數(shù)據(jù)去重。----")valdf02=df01.drop("s").distinct()df02.show(5)df02.describe().show()println("----(3)缺失值處理----")println("去掉數(shù)據(jù)比例小于60%的列:")println(df02.select("age").filter("age>0andage<100").count())println(587.0/1312.0,821.0/1312.0,754.0/1312.0,77.0/1312.0,69.0/1312.0,347.0/1312.0)valdf03=df02.drop("home.dest","room","ticket","boat","age")df03.show(5)df03.createOrReplaceTempView("t_df03")println("去掉數(shù)據(jù)比例小于60%的行:")println("原來的行數(shù):")println(df03.count())defcheck01(a:String):Int={vallist01=a.split(",")list01.length}valdf04=spark.sql("select*,concat_ws(',',*)asconcat01fromt_df03")//df03.show(5,false)df04.createOrReplaceTempView("t_df04")spark.udf.register("check01",check01_)valdf05=spark.sql("select*,check01(concat01)asnot_null_numfromt_df04")//df04.show(5,false)df05.createOrReplaceTempView("t_df05")valdf06=spark.sql("select*fromt_df05wherenot_null_num/6.0>0.6")println("去除缺失值超過60%的行之后,所剩的行數(shù):")println(df06.count())df06.describe().show()println("對embarked字段空值用unknown填充:")valdf07=df06.na.fill("unknown")df07.describe().show()df07.createOrReplaceTempView("t_df07")println("----(4)文字轉數(shù)據(jù)----")println("將sex字段轉換male為0,female為1:")defchange01(a:String):Int={if(a.contains("female"))1else0}spark.udf.register("change01",change01_)valdf08=spark.sql("select*,change01(sex)assex_numfromt_df07").drop("sex","concat01","not_null_num").withColumnRenamed("sex_num","sex")df08.show(5)println("將pclass和embarked字段進行oneHotKey轉換:")valindexer01=newStringIndexer().setInputCol("pclass").setOutputCol("pclass_number").fit(df08)valdf09=indexer01.transform(df08)valindexer02=newStringIndexer().setInputCol("embarked").setOutputCol("embarked_number").fit(df09)valdf10=indexer02.transform(df09)valencoder01=newOneHotEncoderEstimator().setInputCols(Array("pclass_number","embarked_number")).setOutputCols(Array("pclass_vector","embarked_vector")).setDropLast(false).fit(df10)valdf11=encoder01.transform(df10).drop("pclass","embarked","pclass_number","embarked_number")df11.show(5,false)df11.createOrReplaceTempView("t_df11")println("----(5)對name字段進行特征提取----")defchange02(a:String):String={vallist01=a.split(",")list01(0).trim}println(change02("Minahan,MissDaisyE."))spark.udf.register("change02",change02_)println("從name字段中提取first_name:")valdf12=spark.sql("select*,change02(name)asfirst_namefromt_df11")df12.show(5)df12.createOrReplaceTempView("t_df12")println("提取每一個first_name的詞頻-逆文本頻率(TF-IDF),作為新的字段name_tf-idf,替換原來的name字段。")valdf13=spark.sql("selectfirst_name,count(first_name)asname_countfromt_df12groupbyfirst_name")df13.show(5)df13.createOrReplaceTempView("t_df13")valdf14=spark.sql("selectt_df12.*,t__countfromt_df12joint_df13ont_df12.first_name=t_df13.first_name")df14.show(5)df14.createOrReplaceTempView("t_df14")defchange03(a:Int):Double={math.log10(1312.0/a)}spark.udf.register("change03",change03_)valdf15=spark.sql("select*,change03(name_count)asname_tf_idffromt_df14").drop("name","first_name","name_count")df15.show(5)println("----(6)數(shù)據(jù)標準化-----")valvectorAssembler01=newVectorAssembler().setInputCols(Array("name_tf_idf")).setOutputCol("feature01")valdf16=vectorAssembler01.transform(df15)valscaler01=newStandardScaler().setWithMean(true).setWithStd(true).setInputCol("feature01").setOutputCol("scaled_name_tf_idf").fit(df16)valdf17=scaler01.transform(df16)df17.show(5,false)println("把所有的屬性進行匯總,并指定label標簽:")valvectorAssembler02=newVectorAssembler().setInputCols(Array("sex","pclass_vector","embarked_vector","scaled_name_tf_idf")).setOutputCol("feature02")valdf18=vectorAssembler02.transform(df17)df18.createOrReplaceTempView("t_df18")valdf19=spark.sql("selectfeature02asfeatures,survivedaslabelfromt_df18")df19.show(5,false)println("------數(shù)據(jù)預處理結束----------")}}一簡答題1.在機器學習中,什么是分類,分類的目的是什么?答:分類是找出數(shù)據(jù)庫中一組數(shù)據(jù)對象的共同特點并按照分類模式將其劃分為不同的類,其目的是通過分類模型,將數(shù)據(jù)庫中的數(shù)據(jù)項映射到某個給定的類別。2.建立分類模型時,數(shù)據(jù)集被劃分哪2部分?各自的作用是什么?答:數(shù)據(jù)集劃分成2部分:訓練集和測試集。用訓練集進行模型訓練,確定模型參數(shù)。用測試集進行驗證,檢驗模型的可靠性。3.衡量分類模型性能的常用指標有哪些?答:常用指標有:準確率(Accuracy)、精確率(Precision)、真陽性率、真陰性率、假陰性率(FNR)、假陽性率(FPR)、F分數(shù)、ROC曲線。4.決策樹按照某種分裂屬性進行分支的目的什么?為了使決策樹不能過于復雜,需要進行什么操作?答:按照某種分裂屬性進行分支,分支的目的是使得數(shù)據(jù)變“純凈”,即盡可能多的數(shù)據(jù)都有相同的類標號。為了使決策樹不能過于復雜,需要進行修剪。5.最近鄰算法的思想是什么?答:最近鄰算法的思想是,對于需要判斷類別的新樣本,需要選取距離這個新樣本最近的k個類別已知的樣本。然后讓這k個樣本進行投票,判定新樣本的所屬類別。6.支持向量機算法的原理是什么?答:支持向量機的原理是在特征空間中找到間隔最大的分類超平面,從而對數(shù)據(jù)進行高效的二分類。二、計算題1.根據(jù)下面的混淆矩陣表3-7求二分類模型的準確率、精確率、召回率、特異度、假陰性率、假陽性率、F1分數(shù)。表3-7:一個二分類器的混淆矩陣預測值PN實際值P12014N16100解:根據(jù)混淆矩陣,有:TP=120FN=14FP=16TN=100因此:準確率accuracy=(TP+TN)/(TP+FP+TN+FN)=(120+100)/(120+14+16+100)=220/250=0.880精確率Precision=TP/(TP+FP)=120/(120+16)=120/136=0.882召回率Recall=TP/(TP+FN)=120/(120+14)=120/134=0.896特異度Specificity=TN/(TN+FP)=100/(100+16)=100/116=0.862假陰性率FNR=1-Recall=1-0.896=0.104假陽性率FPR=1-Specificity=1-0.862=0.138F1分數(shù)F1_score=2(Precision*Recall)/(Precision+Recall)=2*0.882*0.896/(0.882+0.896)=0.8892.數(shù)據(jù)集D如表3-2所示。其中class作為類標號屬性,具有0和1這兩個值。ed表示受教育程度,作為分裂屬性。按照“受教育程度”分裂為3個子集D1、D2和D3。D1:ed=1,D2:ed=2,D3:ed=3。請用ID3方法計算信息增益(結果保留3位有效數(shù)字)。表3-2:數(shù)據(jù)集Dageedemployaddressincomedebtinccreddebtothdebtclass41317121769.311.359395.00860812711063117.31.3622024.00079804011514555.50.8560752.168925041115141202.92.658720.821280242202817.31.7874363.0565641412552510.20.39272.157303912096730.63.83387416.6681304311211383.60.1285921.2394080解:數(shù)據(jù)集D有8個樣本,有2個樣本class為1,有6個樣本class為0。所以D的熵為:H(D)=p1×log2(1/p1)+p2×log2(1/p2)=(2/8)*log2(8/2)+(6/8)*log2(8/6)=0.811分裂的子集D1,有5個樣本,class都是0,因此H(D1)=0分裂的子集D2,有2個樣本,class一個是0,一個是1,因此H(D2)=2*0.5log22=1分裂的子集D3,有1個樣本,class是1,因此H(D3)=0D1,D2和D3的熵總和為:H(D1,D2,D3)=5/8*0+2/8*1+1/8*0=0.25信息增益為Gain(D,教育程度)=H(D)-H(D1,D2,D3)=0.811-0.25=0.5613.數(shù)據(jù)集D如表3-2所示。其中class作為類標號屬性,具有0和1這兩個值。ed表示受教育程度,作為分裂屬性。按照“受教育程度”分裂為3個子集D1、D2和D3。D1:ed=1,D2:ed=2,D3:ed=3。請用C4.5方法計算信息增益比例(結果保留3位有效數(shù)字)。解:數(shù)據(jù)集D按照受教育程度劃分為5,2,1,因此H(D,教育程度)=5/8*log2(8/5)+2/8*log2(8/2)+1/8*log2(8/1)=1.299由第二題,Gain(D,教育程度)=0.561因此GainRatio(D,教育程度)=Gain(D,教育程度)/H(D,教育程度)=0.4324.數(shù)據(jù)集D如表3-2所示。其中class作為類標號屬性,具有0和1這兩個值。ed表示受教育程度,作為分裂屬性。按照“受教育程度”分裂為2個子集D1、D2。D1:ed=1,D2:ed=2or3。請用CART方法計算雜度削減(結果保留3位有效數(shù)字)。解:數(shù)據(jù)集D有8個樣本,有2個樣本class為1,有6個樣本class為0。所以D的吉尼指標為:gini(D)=1-(2/8)^2-(6/8)^2=0.375當用教育程度作為分裂屬性劃分時,D1:ed=1,有5個樣本。所以樣本被劃分到D1的概率為:P(D1)=5/8在D1的5個樣本中,class都為0。所以D1的吉尼指標為:gini(D1)=1-(1)^2=0D2:ed=2or3,有3個樣本。所以樣本被劃分到D2的概率為:P(D2)=3/8在D2的3個樣本中,class二個1,一個0。所以D2的吉尼指標為:gini(D2)=1-(1/3)^2-(2/3)^2=0.444按照年齡分裂導致的雜度削減為:φ(D)=gini(D)-P(D1)*gini(D1)-P(D2)*gini(D2)=0.375-5/8*0-3/8*0.444=0.2085。5.根據(jù)表3-8,利用樸素貝葉斯算法,判斷一個客戶(性別=女,婚姻狀態(tài)=已婚,是否有房=無房),是否會購買此保險。表3-8:購買保險情況統(tǒng)計表記錄性別婚姻狀態(tài)是否有房購買保險1女未婚無否2女未婚有否3女已婚有否4女已婚有否5女未婚有是6男未婚有是7男未婚有否8男已婚有否9男未婚有是10男未婚有是解:P(女|是)=1/4P(已|是)=0P(無|是)=0P(是)=4/10P(是|X)->P(X|是)P(是)=P(女,已,無|是)P(是)=P(女|是)P(已|是)P(無|是)P(是)=0P(女|否)=4/6P(已|否)=3/6P(無|否)=1/6P(否)=6/10P(否|X)->P(X|否)P(否)=P(女,已,無|否)P(否)=P(女|否)P(已|否)P(無|否)P(否)>0P(否|X)>P(是|X),所以這個客戶不會買保險。三、編程題1.文件xiti03_06.csv是一個4分類數(shù)據(jù)集,數(shù)據(jù)有3個維度,分別是x、y、z。目標字段為label,類標號為1、2、3、4。請利用Python的sklearn的支持向量機模型構建分類器,80%的數(shù)據(jù)作為訓練集,20%的數(shù)據(jù)作為測試集。輸出準確率、加權精確率、加權召回率、F1分數(shù),并判斷[2.12,2.10,1.89],[1.15,2.05,2.88]這兩個新樣本是什么類型。代碼如下:importpandasaspdimportnumpyasnp#引入數(shù)據(jù)集df=pd.read_csv("./xiti03_06.csv",header=None)#打印數(shù)據(jù)集,并轉換為arraydf.columns=["x","y","z","lable"]print(df)arr_data=df.loc[:,["x","y","z"]].valuesarr_target=df.loc[:,["lable"]].valuesprint(arr_data)print(arr_target)#劃分訓練集與測試集#常使用sklearn庫下的model_selection模塊的trian_test_split函數(shù),#在sklearn中常使用X表示數(shù)據(jù)(數(shù)據(jù)通常是二維矩陣),y表示標簽(目標是一個一維向量)fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(arr_data,arr_target,test_size=0.2,random_state=0)#引入支持向量機模型,并用訓練集進行訓練fromsklearn.svmimportSVCcls=SVC()cls.fit(X_train,y_train)##評估模型y_pred=cls.predict(X_test)fromsklearn.metricsimportclassification_reportdefevaluation(y_test,y_predict):accuracy=classification_report(y_test,y_predict,output_dict=True)['accuracy']s=classification_report(y_test,y_predict,output_dict=True)['weightedavg']precision=s['precision']recall=s['recall']f1_score=s['f1-score']returnaccuracy,precision,recall,f1_scorelist_evalucation=evaluation(y_test,y_pred)print("accuracy:{:.3f}".format(list_evalucation[0]))print("weightedprecision:{:.3f}".format(list_evalucation[1]))print("weightedrecall:{:.3f}".format(list_evalucation[2]))print("F1score:{:.3f}".format(list_evalucation[3]))#預測#判斷一個新的樣本是什么類型X_new=np.array([[2.12,2.10,1.89],[1.15,2.05,2.88]])prediction=cls.predict(X_new)print("Prediction:{}".format(prediction))輸出:accuracy:0.975weightedprecision:0.975weightedrecall:0.975F1score:0.975Prediction:[3.1.]2.文件xiti03_06.csv是一個4分類數(shù)據(jù)集,數(shù)據(jù)有3個維度,分別是x、y、z。目標字段為label,類標號為1、2、3、4。請利用Spark的MLlib的邏輯回歸模型構建分類器,80%的數(shù)據(jù)作為訓練集,20%的數(shù)據(jù)作為測試集。輸出準確率、加權精確率、加權召回率、F1分數(shù),并判斷[2.12,2.10,1.89],[1.15,2.05,2.88]這兩個新樣本是什么類型。代碼:importjava.util.Propertiesimportorg.apache.log4j.{Level,Logger}importorg.apache.spark.sql.{DataFrame,SparkSession}importorg.apache.spark.ml.feature.StringIndexerimportorg.apache.spark.ml.feature.VectorAssemblerimportorg.apache.spark.ml.evaluation.MulticlassClassificationEvaluatorimportorg.apache.spark.sql.types.DoubleTypeobjectxiti03_07{defmain(args:Array[String]):Unit={//把hadoop的winutil.exe文件拷貝到c:/bin///這一句設置winutil.exe文件的目錄在c:/bin/,集群運行要刪除System.setProperty("hadoop.home.dir","C:/")//不要讓spark輸出過多的日志Logger.getLogger("org").setLevel(Level.OFF)Logger.getLogger("akka").setLevel(Level.OFF)//1、創(chuàng)建sparkSession對象valspark=SparkSession.builder().appName("logistic").master("local[2]")//在D:\IdeaProjects\spark_chapter04中建立Warehouse目錄.config("spark.sql.warehouse.dir","D:\\IdeaProjects\\myspark01")//這個參數(shù)設置Warehouse目錄,集群運行要刪除.getOrCreate()//2讀取數(shù)據(jù)valdf=spark.read.csv("xiti03_06.csv")valdf01=df.withColumnRenamed("_c0","x").withColumnRenamed("_c1","y").withColumnRenamed("_c2","z").withColumnRenamed("_c3","class")println("----df01----")df01.show()//4數(shù)據(jù)加載,指定預測的目標字段label,參與預測的字段features//指定目標字段vallableIndexer=newStringIndexer().setInputCol("class").setOutputCol("label")valdf02=lableIndexer.fit(df01).transform(df01)println("----df02----")df02.show()//指定參與預測的字段valfeatures=Array("x","y","z")valdf03=df02.select(df02.col("x").cast(DoubleType).as("x"),df02.col("y").cast(DoubleType).as("y"),df02.col("z").cast(DoubleType).as("z"),df02.col("label"))println("----df03----")df03.show()valassembler=newVectorAssembler().setInputCols(features).setOutputCol("features")valdf04=assembler.transform(df03)println("----df04----")df04.show()//5劃分數(shù)據(jù)集為訓練集trainingData和測試集testDatavalseed=1234valArray(trainingData,testData)=df04.randomSplit(Array(0.8,0.2),seed)//6引入分類模型,并用訓練集訓練importorg.apache.spark.ml.classification.LogisticRegressionvalcls=newLogisticRegression()valmodel=cls.fit(trainingData)//7用測試集檢驗模型質量valpredictions=model.transform(testData)println("----predictions----")predictions.show()//真正類數(shù)(TruePositive,TP):被模型預測為正的正樣本。//假正類數(shù)(FalsePositive,FP):被模型預測為正的負樣本。//假負類數(shù)(FalseNegative,FN):被模型預測為負的正樣本。//真負類數(shù)(TrueNegative,TN):被模型預測為負的負樣本。//準確率(Accuracy),accuracy=(TP+TN)/N,表示所有預測結果有多少是正確的//精確率(Precision),weightedPrecision=TP/(TP+FP),表示預測成正樣本的結果中,有多少真的是正樣本//召回率(Recall),weightedRecall=TP/(TP+FN),表示實際的正樣本中,有多少被正確預測了//特異度(Specificity),TNR=TN/(FP+TN),表示實際的負樣本中,有多少被正確預測了//F1分數(shù),f1=(1+Precision*Recall)/(Precision+Recall)valevaluator=newMulticlassClassificationEvaluator()valf1=evaluator.setMetricName("f1").evaluate(predictions)valwp=evaluator.setMetricName("weightedPrecision").evaluate(predictions)valwr=evaluator.setMetricName("weightedRecall").evaluate(predictions)valaccuracy=evaluator.setMetricName("accuracy").evaluate(predictions)println("accuracy="+accuracy.formatted("%.3f"))//準確率(Accuracy)println("weightedPrecision="+wp.formatted("%.3f"))//精確率(Precision)println("weightedRecall="+wr.formatted("%.3f"))//召回率(Recall)println("f1="+f1.formatted("%.3f"))//f1分數(shù)//8預測新的樣本importspark.implicits._valdf05=Seq((2.12,2.10,1.89,"new"),(1.15,2.05,2.88,"new")).toDF("x","y","z","class")valdf06=lableIndexer.fit(df05).transform(df05)valdf07=assembler.transform(df06)valp07=model.transform(df07)println("----p07----")p07.select("prediction").show()}}輸出:accuracy=0.961weightedPrecision=0.961weightedRecall=0.961f1=0.961----p07----+----------+|prediction|+----------+|2.0||0.0|+----------+習題4一簡答題1.聚類是一種無監(jiān)督的學習算法,就是按照某個特定標準(如距離準則)把一個數(shù)據(jù)集分割成不同的簇(簇也稱為類),使得同一個簇內的數(shù)據(jù)對象的相似性盡可能_____,同時不在同一個簇中的數(shù)據(jù)對象的差異性也盡可能地______。(回答大或小)答:大;大。2.閔可夫斯基距離公式d=pk=1n答:曼哈頓距離;歐幾里得距離;切比雪夫距離3.對于高維空間的任意2個坐標點,歐幾里得距離、曼哈頓距離、切比雪夫距離三者的大小關系是:______>=_______>=________答:曼哈頓距離>=歐幾里得距離>=切比雪夫距離4.哪一種距離指標是衡量兩個向量夾角的余弦,只考慮向量的方向,不考慮向量的大小?答:余弦相似度二計算題1.計算x(1,2)和y(3,4)之間的曼哈頓距離、歐幾里得距離、切比雪夫距離、余弦相似度。解:(1)曼哈頓距離d=2+2=4(2)歐幾里得距離d=sqrt(4+4)=2.828(3)切比雪夫距離d=max(2,2)=2(4)余弦相似度cosθ=(3+8)/(sqrt(1+4)*sqrt(9+16))=0.9842.聚類1有2個點x1(0,1)、x2(1,0)。聚類2有2個點y1(5,6)和y2(6,5)。計算輪廓系數(shù)。距離指標用曼哈頓距離。解:a_x1=1+1=2b_x1=((5+5)+(6+4))/2=10s_x1=(b_x1-a_x1)/max(a_x1,b_x1)=0.8a_x2=2;b_x2=10;s_x2=0.8a_y1=2;b_y1=10;s_y1=0.8a_y2=2;b_y2=10;s_y2=0.8SC=0.8*4/4=0.8三編程題1.用Python進行聚類編程,完成以下要求:(1)導入sklearn自帶數(shù)據(jù)集breast_cancer,顯示相關信息,然后將數(shù)據(jù)集分為訓練集和測試集。#將sklearn自帶數(shù)據(jù)集breast_cance分為訓練集和測試儀集#將sklearn自帶數(shù)據(jù)集breast_cance分為訓練集和測試儀集fromsklearn.datasetsimportload_breast_cancer#導入數(shù)據(jù)breast_cancer=load_breast_cancer()X=breast_cancer.datay=breast_cancer.targetprint('數(shù)據(jù)集的長度:',len(breast_cancer))print('數(shù)據(jù)集的類型:',type(breast_cancer))#查看數(shù)據(jù)集信息print('數(shù)據(jù)集的數(shù)據(jù)為:','\n',X)print('數(shù)據(jù)集的數(shù)據(jù):\n',X)print('數(shù)據(jù)集的標簽:\n',y)#取出數(shù)據(jù)集的特征名breast_cancer_names=breast_cancer['feature_names']print('數(shù)據(jù)集的特征名:\n',breast_cancer_names)print('原始數(shù)據(jù)集數(shù)據(jù)的形狀:',X.shape)print('原始數(shù)據(jù)集標簽的形狀:',y.shape)#將數(shù)據(jù)集劃分為訓練集和測試集fromsklearn.model_selectionimporttrain_test_splitbreast_cancer_data_train,breast_cancer_data_test,breast_cancer_target_train,\breast_cancer_target_test=train_test_split(X,y,test_size=0.2,random_state=42)print('訓練集數(shù)據(jù)的形狀:',breast_cancer_data_train.shape)print('訓練集標簽的形狀:',breast_cancer_target_train.shape)print('測試集數(shù)據(jù)的形狀:',breast_cancer_data_test.shape)print('測試集標簽的形狀:',breast_cancer_target_test.shape)(2)對breast_cancer數(shù)據(jù)集進行標準化和歸一化操作。#對breast_cancer數(shù)據(jù)集進行標準化和歸一化fromsklearn.datasetsimportload_breast_cancer#導入數(shù)據(jù)breast_cancer=load_breast_cancer()X=breast_cancer.datay=breast_cancer.targetprint('數(shù)據(jù)集的長度:',len(breast_cancer))print('數(shù)據(jù)集的類型:',type(breast_cancer))#查看數(shù)據(jù)集信息print('數(shù)據(jù)集的數(shù)據(jù):\n',X)print('數(shù)據(jù)集的標簽:\n',y)#取出數(shù)據(jù)集的特征名breast_cancer_names=breast_cancer['feature_names']print('數(shù)據(jù)集的特征名:\n',breast_cancer_names)print('原始數(shù)據(jù)集數(shù)據(jù)的形狀:',X.shape)print('原始數(shù)據(jù)集標簽的形狀:',y.shape)fromsklearnimportpreprocessingprint('原數(shù)據(jù):\n',X)print('原數(shù)據(jù)均值:',X.mean(axis=0))print('原數(shù)據(jù)方差:',X.std(axis=0))X_scaled=preprocessing.scale(X)print('標準化后數(shù)據(jù):\n',X_scaled)print('標準化數(shù)據(jù)均值:',X_scaled.mean(axis=0))print('標準化數(shù)據(jù)方差:',X_scaled.std(axis=0))min_max_scaler=preprocessing.MinMaxScaler()X_train_minmax=min_max_scaler.fit_transform(X)print('歸一化后數(shù)據(jù):\n',X_train_minmax)print('歸一化數(shù)據(jù)均值:',X_train_minmax.mean(axis=0))print('歸一化數(shù)據(jù)方差:',X_train_minmax.std(axis=0))(3)對breast_cancer數(shù)據(jù)集進行PCA降維和IncrementalPCA降維操作。#對breast_cancer數(shù)據(jù)集進行PCA降維和IncrementalPCA降維操作fromsklearn.datasetsimportload_breast_cancerfromsklearn.decompositionimportPCA,IncrementalPCA#導入數(shù)據(jù)breast_cancer=load_breast_cancer()X=breast_cancer.datay=breast_cancer.targetprint('原始數(shù)據(jù)集數(shù)據(jù)的形狀:',X.shape)#IPCA降維ipca=IncrementalPCA(n_components=3,batch_size=10)X_ipca=ipca.fit_transform(X)print('原始數(shù)據(jù)集數(shù)據(jù)的形狀:',X_ipca.shape)#PCA降維pca=PCA(n_components=3)X_pca=pca.fit_transform(X)print('原始數(shù)據(jù)集數(shù)據(jù)的形狀:',X_pca.shape)(4)使用基于Python的Kmeans方法對PCA降維后的breast_cancer數(shù)據(jù)集進行聚類操作,對比原始數(shù)據(jù)與降維后數(shù)據(jù)的聚類結果。#使用基Kmeans方法對PCA降維后的breast_cancer數(shù)據(jù)集進行聚類操作importosos.environ["OMP_NUM_THREADS"]="3"fromsklearn.datasetsimportload_breast_cancerfromsklearn.decompositionimportPCA,IncrementalPCAfromsklearnimportmetricsfromsklearn.clusterimportKMeansimportmatplotlib.pyplotasplt#防止亂碼plt.rcParams['font.sans-serif']='SimHei'plt.rcParams['axes.unicode_minus']=False#導入數(shù)據(jù)breast_cancer=load_breast_cancer()X=breast_cancer.datay=breast_cancer.targetprint(breast_cancer.target_names)print('原始數(shù)據(jù)集數(shù)據(jù)的形狀為:',X.shape)#劃分子圖figure=plt.figure()axes1=figure.add_subplot(2,1,1)axes2=figure.add_subplot(2,1,2)#對原數(shù)據(jù)進行Kmeans聚類,創(chuàng)建聚類器并且訓練KMeans1=KMeans(n_clusters=3)#KMeans1.fit(X)#聚類y_pred=KMeans1.fit_predict(X)#獲取聚類標簽label_pred=KMeans1.labels_#繪圖x0=X[label_pred==0]x1=X[label_pred==1]axes1.scatter(x0[:,0],x0[:,1],c="r",marker='D',label=breast_cancer.target_names[0])axes1.scatter(x1[:,0],x1[:,1],c="g",marker='*',label=breast_cancer.target_names[1])axes1.legend()axes1.set_title('原數(shù)據(jù)直接K均值聚類')plt.show()#PCA降維pca=PCA(n_components=2)X_pca=pca.fit_transform(X)#對PCA降維后數(shù)據(jù)進行Kmeans聚類,創(chuàng)建聚類器并且訓練KMeans2=KMeans(n_clusters=3)#KMeans2.fit(X_pca)#聚類y_pred_pca=KMeans2.fit_predict(X_pca)#獲取聚類標簽label_pred=KMeans2.labels_#繪圖x0=X_pca[label_pred==0]x1=X_pca[label_pred==1]axes2.scatter(x0[:,0],x0[:,1],c='r',marker='D',label=breast_cancer.target_names[0])axes2.scatter(x1[:,0],x1[:,1],c='g',marker='*',label=breast_cancer.target_names[1])axes2.legend()axes2.set_title('PCA降維后K均值聚類')plt.show()#計算Calinski-Harabasz指數(shù)得分print('原始數(shù)據(jù)聚類得分:',metrics.calinski_harabasz_score(X,y_pred))print('降維后數(shù)據(jù)聚類得分:',metrics.calinski_harabasz_score(X_pca,y_pred_pca))(5)使用基于Python的Kmeans方法對IPCA降維后的breast_cancer數(shù)據(jù)集進行聚類操作,對比原始數(shù)據(jù)與降維后數(shù)據(jù)的聚類結果。#使用基Kmeans方法對IPCA降維后的breast_cancer數(shù)據(jù)集進行聚類操作importosos.environ["OMP_NUM_THREADS"]="3"fromsklearn.datasetsimportload_breast_cancerfromsklearn.decompositionimportPCA,IncrementalPCAfromsklearnimportmetricsfromsklearn.clusterimportKMeansimportmatplotlib.pyplotasplt#防止亂碼plt.rcParams['font.sans-serif']='SimHei'plt.rcParams['axes.unicode_minus']=False#導入數(shù)據(jù)breast_cancer=load_breast_cancer()X=breast_cancer.datay=breast_cancer.targetprint(breast_cancer.target_names)print('原始數(shù)據(jù)集數(shù)據(jù)的形狀為:',X.shape)#劃分子圖figure=plt.figure()axes1=figure.add_subplot(2,1,1)axes2=figure.add_subplot(2,1,2)#對原數(shù)據(jù)進行Kmeans聚類,創(chuàng)建聚類器并且訓練KMeans1=KMeans(n_clusters=3)#KMeans1.fit(X)#聚類y_pred=KMeans1.fit_predict(X)#獲取聚類標簽label_pred=KMeans1.labels_#繪圖x0=X[label_pred==0]x1=X[label_pred==1]axes1.scatter(x0[:,0],x0[:,1],c='r',marker='D',label=breast_cancer.target_names[0])axes1.scatter(x1[:,0],x1[:,1],c='g',marker='*',label=breast_cancer.target_names[1])axes1.legend()axes1.set_title('原數(shù)據(jù)直接K均值聚類')plt.show()#IPCA降維ipca=IncrementalPCA(n_components=2,batch_size=10)X_ipca=ipca.fit_transform(X)#對IPCA降維后數(shù)據(jù)進行Kmeans聚類,創(chuàng)建聚類器并且訓練KMeans2=KMeans(n_clusters=3)#KMeans2.fit(X_pca)#聚類y_pred_ipca=KMeans2.fit_predict(X_ipca)#獲取聚類標簽label_pred=KMeans2.labels_#繪圖x0=X_ipca[label_pred==0]x1=X_ipca[label_pred==1]axes2.scatter(x0[:,0],x0[:,1],c='r',marker='D',label=breast_cancer.target_names[0])axes2.scatter(x1[:,0],x1[:,1],c='g',marker='*',label=breast_cancer.target_names[1])axes2.legend()axes2.set_title('IPCA降維后K均值聚類')plt.show()#計算Calinski-Harabasz指數(shù)得分print('原始數(shù)據(jù)聚類得分:',metrics.calinski_harabasz_score(X,y_pred))print('降維后數(shù)據(jù)聚類得分:',metrics.calinski_harabasz_score(X_ipca,y_pred_ipca))2.使用Sparkk-means聚類方法分析足球隊的實力,該數(shù)據(jù)共16條,包含1個隊名和6個特征數(shù)據(jù),數(shù)據(jù)樣式如圖所示。/*k-means足球隊實力分析*/importorg.apache.spark.sql.SparkSessionimportorg.apache.spark.ml.linalg.Vectorsimportorg.apache.spark.ml.clustering.KMeansobjectSpark4_1{defmain(args:Array[String]):Unit={//創(chuàng)建spark接入點valspark=SparkSession.builder().master("local[*]").appName("KMeans").getOrCreate()//讀取數(shù)據(jù)valdf=spark.read//設置源數(shù)據(jù)格式.format("com.databricks.spark.csv")//一次只讀一行數(shù)據(jù).option("inferschema","true").option("header","true").load("C:\\Users\\Administrator\\Desktop\\unit4\\attack.txt")//注冊一個udf來將數(shù)據(jù)轉換為向量spark.udf.register("toVector",(a:Double,b:Double,c:Double,d:Double,e:Double,f:Double)=>Vectors.dense(a,b,c,d,e,f))//創(chuàng)建特征向量valfeatures=df.selectExpr("toVector(score,goal,shoot,straight,violated,offside)asfeature","team")//創(chuàng)建K-Means模型,分類3,設定特征列、預測列valkMeans=newKMeans().setK(3).setFeaturesCol("feature").setPredictionCol("prediction")//訓練模型
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 翠屏公安招聘警務輔助人員筆試真題2024
- 石大學前兒童保育學課件1-5泌尿系統(tǒng)
- 無人化操作下的安全監(jiān)控策略-洞察闡釋
- 生理學教育領域面臨的挑戰(zhàn)與AI解決方案
- 家庭托育點的運營模式與管理標準化探索
- 云邊協(xié)同下嵌入式AI與物聯(lián)網(wǎng)教學系統(tǒng)設計
- 政法隊伍管理與監(jiān)督機制的創(chuàng)新與完善
- 校企合作中的資源共享與利益共贏機制
- 2025至2030年中國電動升降機遙控器行業(yè)投資前景及策略咨詢報告
- 2025至2030年中國玻璃盤下水行業(yè)投資前景及策略咨詢報告
- 駕駛員雇傭協(xié)議書
- 時代樂章第三課自然之美 課件 2024-2025學年人教版(2024)初中美術上冊
- 三輪車租賃合同范本簡單(2024版)
- DL∕T 1100.1-2018 電力系統(tǒng)的時間同步系統(tǒng) 第1部分:技術規(guī)范
- 廣西貴百河聯(lián)考2023-2024學年高一下學期5月月考化學試題(解析版)
- CJ/T 158-2002 城市污水處理廠管道和設備色標
- 安徽省池州市貴池區(qū)2023-2024學年七年級下學期末歷史試卷
- 七年級上冊語文必背古詩詞
- 國開可編程控制器應用形考實訓任務四
- 一人出資一人出力合伙協(xié)議范本完整版
- 長安汽車使用說明書
評論
0/150
提交評論