《Spark編程基礎(chǔ)及項目實踐》課件08Spark-MLlib_第1頁
《Spark編程基礎(chǔ)及項目實踐》課件08Spark-MLlib_第2頁
《Spark編程基礎(chǔ)及項目實踐》課件08Spark-MLlib_第3頁
《Spark編程基礎(chǔ)及項目實踐》課件08Spark-MLlib_第4頁
《Spark編程基礎(chǔ)及項目實踐》課件08Spark-MLlib_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

項目8SparkMLlib學(xué)習(xí)目標(biāo)(1)(4)學(xué)習(xí)SparkMLlib基礎(chǔ)知識學(xué)習(xí)分類回歸算法預(yù)測學(xué)習(xí)目標(biāo)(2)學(xué)習(xí)使用SparkMLlib完成數(shù)據(jù)的基本統(tǒng)計(3)學(xué)習(xí)特征的提取轉(zhuǎn)換和選擇的基本方法任務(wù)1初識機器學(xué)習(xí)8.1.1機器學(xué)習(xí)的概念機器學(xué)習(xí)是一類算法的總稱,其核心是“使用算法解析數(shù)據(jù),從中學(xué)習(xí),然后對世界上的某件事情做出決定或預(yù)測”。這些算法企圖從大量歷史數(shù)據(jù)中挖掘出其中隱含的規(guī)律,并用于預(yù)測或分類,更具體地說,可以把機器學(xué)習(xí)看作尋找一個函數(shù),輸入是樣本數(shù)據(jù),輸出是期望的結(jié)果,只是這個函數(shù)過于復(fù)雜,以至于不太方便形式化表達(dá)。這意味著,與其顯式地編寫程序來執(zhí)行某些任務(wù),不如教計算機如何開發(fā)一個算法來完成任務(wù)。需要注意的是,機器學(xué)習(xí)的目標(biāo)是使學(xué)到的函數(shù)很好地適用于“新樣本”,而不僅僅是在訓(xùn)練樣本上表現(xiàn)得很好。學(xué)到的函數(shù)適用于新樣本的能力,被稱為泛化(generalization)能力。8.1.1機器學(xué)習(xí)的概念綜上所述,機器學(xué)習(xí)是學(xué)習(xí)得到更好的函數(shù)從而更合適處理樣本,而通常學(xué)習(xí)一個好的函數(shù)需要以下6個步驟:(2)(3)(4)(5)(6)(1)場景解析數(shù)據(jù)預(yù)處理特征工程模型訓(xùn)練模型評估離線/在線服務(wù)8.1.2機器學(xué)習(xí)的分類機器學(xué)習(xí)是一個龐大的家族體系,涉及眾多算法、任務(wù)和學(xué)習(xí)理論。按任務(wù)類型分,機器學(xué)習(xí)模型可以分為回歸模型、分類模型和結(jié)構(gòu)化學(xué)習(xí)模型。從方法的角度分,可以分為線性模型和非線性模型,線性模型較為簡單,但作用不可忽視。線性模型是非線性模型的基礎(chǔ),很多非線性模型都是在線性模型的基礎(chǔ)上變換而來的。非線性模型又可以分為傳統(tǒng)機器學(xué)習(xí)模型(如SVM、KNN、決策樹等)和深度學(xué)習(xí)模型。按照學(xué)習(xí)方式分,機器學(xué)習(xí)模型可以分為監(jiān)督學(xué)習(xí)、無監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)和強化學(xué)習(xí)。8.1.2機器學(xué)習(xí)的分類監(jiān)督學(xué)習(xí)01監(jiān)督學(xué)習(xí)(supervisedlearning)主要分兩種類型:分類和回歸。在分類中,機器被訓(xùn)練成將一個組劃分為特定的類?;貧w是指每個進入算法的訓(xùn)練數(shù)據(jù)樣本都有對應(yīng)的期望值,進行機器學(xué)習(xí)的過程實際上就是特征值和目標(biāo)隊列映射的過程。例如,機器使用先前的(標(biāo)記的)數(shù)據(jù)來預(yù)測未來。使用氣象事件的歷史數(shù)據(jù)(平均氣溫、濕度和降水量),手機天氣應(yīng)用程序可以查看當(dāng)前天氣,并在未來的時間內(nèi)對天氣進行預(yù)測。常見的監(jiān)督學(xué)習(xí)算法見表8-1。表8-1監(jiān)督學(xué)習(xí)算法8.1.2機器學(xué)習(xí)的分類無監(jiān)督學(xué)習(xí)02無監(jiān)督學(xué)習(xí)(unsupervisedlearning)指訓(xùn)練樣本不依賴于先前數(shù)據(jù)的機器學(xué)習(xí)算法。既然是沒有目標(biāo)隊列,也就缺少了特征環(huán)境下的最終結(jié)果,那么這樣的數(shù)據(jù)可能對一些回歸和分類的場景就不適合了。無監(jiān)督學(xué)習(xí)分為聚類和降維。聚類用于根據(jù)屬性和行為對象進行分組。這與分類不同,因為這些組不是提供的。聚類的一個例子是將一個組劃分成不同的子組(如基于年齡和婚姻狀況),然后應(yīng)用到有針對性的營銷方案中。降維通過找到共同點來減少數(shù)據(jù)集的變量。大多數(shù)大數(shù)據(jù)可視化使用降維來識別趨勢和規(guī)則。常見的無監(jiān)督學(xué)習(xí)算法見表8-2。表8-2無監(jiān)督學(xué)習(xí)算法8.1.2機器學(xué)習(xí)的分類半監(jiān)督學(xué)習(xí)03半監(jiān)督學(xué)習(xí)(semi-supervisedlearning)是最近幾年逐漸開始流行的一種機器學(xué)習(xí)種類。在一些場景下獲得打標(biāo)數(shù)據(jù)是很耗費資源的,但是無監(jiān)督學(xué)習(xí)對于解決分類和回歸這樣場景的問題又有一些難度。所以人們開始嘗試通過對樣本的部分打標(biāo)來進行機器學(xué)習(xí)算法的使用,這種部分打標(biāo)樣本的訓(xùn)練數(shù)據(jù)的算法應(yīng)用,就是半監(jiān)督學(xué)習(xí)。8.1.2機器學(xué)習(xí)的分類強化學(xué)習(xí)04強化學(xué)習(xí)(reinforcementlearning)是一種比較復(fù)雜的機器學(xué)習(xí)種類,強調(diào)的是系統(tǒng)與外界不斷地交互,獲得外界的反饋,然后決定自身的行為。強化學(xué)習(xí)是目前人工智能領(lǐng)域的一個熱點算法種類,典型的案例包括無人汽車駕駛和阿爾法狗下圍棋。機器學(xué)習(xí)的這些種類都有各自的常用算法,目前被應(yīng)用到各種領(lǐng)域。例如,監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)主要被應(yīng)用在傳統(tǒng)企業(yè)數(shù)據(jù)應(yīng)用場景中;半監(jiān)督學(xué)習(xí)主要應(yīng)用到圖像識別領(lǐng)域和圖像處理領(lǐng)域,這是因為圖像中存在大量的非標(biāo)識數(shù)據(jù);強化學(xué)習(xí)主要應(yīng)用到機器人控制及系統(tǒng)控制領(lǐng)域。8.1.3MLlib數(shù)據(jù)類型01本地向量本地向量存儲在單機上,其由整型、從零開始的索引值及浮點型的元素值組成。MLlib提供了兩種類型的本地向量:稠密向量使用一個雙精度浮點型數(shù)組來表示其中每一維元素。稀疏向量則是基于一個整型索引數(shù)組和一個雙精度浮點型的值數(shù)組。8.1.3MLlib數(shù)據(jù)類型01本地向量使用SparkShell進行舉例,代碼如下。//創(chuàng)建稠密本地向量scala>valdv:Vector=Vectors.dense(1.0,0.0,3.0)dv:org.apache.spark.mllib.linalg.Vector=[1.0,0.0,3.0]//第一種方法:創(chuàng)建疏密本地向量,第二個參數(shù)數(shù)組指定了非零元素的索引,而第三個參數(shù)數(shù)組則//給定了非零元素值scala>valsv1:Vector=Vectors.sparse(3,Array(0,2),Array(1.0,3.0))sv1:org.apache.spark.mllib.linalg.Vector=(3,[0,2],[1.0,3.0])//第二種方法:創(chuàng)建疏密本地向量,第二個參數(shù)是一個序列,其中每個元素都是一個非零值的元組scala>valsv2:Vector=Vectors.sparse(3,Seq((0,2.0),(2,8.0)))sv2:org.apache.spark.mllib.linalg.Vector=(3,[0,2],[2.0,8.0])8.1.3MLlib數(shù)據(jù)類型02標(biāo)記向量標(biāo)注點是一種帶有標(biāo)簽(label/response)的本地向量,它可以是稠密的或是稀疏的。在MLlib中,標(biāo)注點可以用于監(jiān)督學(xué)習(xí)算法。標(biāo)簽是用雙精度浮點型來存儲的,因此在回歸和分類問題上可使用標(biāo)注點。使用SparkShell進行舉例,代碼如下。importorg.apache.spark.mllib.linalg.Vectorsimportorg.apache.spark.mllib.regression.LabeledPoint//創(chuàng)建一個標(biāo)簽為1.0(分類中可視為正樣本)的稠密向量標(biāo)注點valpos=LabeledPoint(1.0,Vectors.dense(1.0,0.0,3.0))//創(chuàng)建一個標(biāo)簽為0.0(分類中可視為負(fù)樣本)的稀疏向量標(biāo)注點valneg=LabeledPoint(0.0,Vectors.sparse(3,Array(0,2),Array(1.0,3.0)))8.1.3MLlib數(shù)據(jù)類型03本地矩陣本地矩陣存儲在本地主機上,它具有整數(shù)類型的行和列索引及雙精度浮點類型值。MLlib支持稠密矩陣與稀疏矩陣兩種,稠密矩陣的所有元素的值存儲在以列為主要順序的雙精度數(shù)組中,稀疏矩陣的所有元素存儲在以列為主要順序的壓縮稀疏列(CSC)模式中。CSC模式請參考/~mcrob/toolbox/c++/sparseMatrix/sparse_matrix_compression.html。例如,稠密矩陣存儲在具有矩陣大小的一維陣列中。表示方式為:[1.0,3.0,5.0,2.0,4.0,6.0](3,2)。8.1.3MLlib數(shù)據(jù)類型03本地矩陣本地矩陣的基類是org.apache.spark.mllib.linalg.Matrix。DenseMatrix和SparseMatrix均是它的實現(xiàn)類,和本地向量類似,MLlib也為本地矩陣提供了相應(yīng)的工具類Matrices,調(diào)用工廠方法dense即可創(chuàng)建實例,創(chuàng)建稠密矩陣的代碼如下。scala>importorg.apache.spark.mllib.linalg.{Matrix,Matrices}importorg.apache.spark.mllib.linalg.{Matrix,Matrices}//創(chuàng)建一個3行2列的稠密矩陣[[1.0,2.0],[3.0,4.0],[5.0,6.0]]//請注意,這里的數(shù)組參數(shù)是列先序的scala>valdm:Matrix=Matrices.dense(3,2,Array(1.0,3.0,5.0,2.0,4.0,6.0))dm:org.apache.spark.mllib.linalg.Matrix=1.02.03.04.05.06.08.1.3MLlib數(shù)據(jù)類型03本地矩陣這里可以看出列優(yōu)先的排列方式,即按照列的方式從數(shù)組中提取元素,也可以創(chuàng)建一個3行2列的稀疏矩陣[[9.0,0.0],[0.0,8.0],[0.0,6.0]]。//第一個數(shù)組參數(shù)表示列指針,即每一列元素的開始索引值//第二個數(shù)組參數(shù)表示行索引,即對應(yīng)的元素是屬于哪一行//第三個數(shù)組即是按列先序排列的所有非零元素,通過列指針和行索引即可判斷每個元素所在的位置scala>valsm:Matrix=Matrices.sparse(3,2,Array(0,1,3),Array(0,2,1),Array(9,6,8))sm:org.apache.spark.mllib.linalg.Matrix=3x2CSCMatrix(0,0)9.0(2,1)6.0(1,1)8.08.1.3MLlib數(shù)據(jù)類型04分布式矩陣分布式矩陣具有長整數(shù)類型的行和列索引及雙精度浮點類型值,其數(shù)據(jù)存儲在多個RDD上。選擇正確的格式來存儲大型和分布式矩陣非常重要。將分布式矩陣轉(zhuǎn)換為不同的格式可能需要全局進行調(diào)整存儲,所以選擇合適的分布式矩陣的存儲方式非常重要,目前已經(jīng)實現(xiàn)了4種類型的分布式矩陣:無索引行矩陣、有索引行矩陣、坐標(biāo)矩陣和塊矩陣。8.1.3MLlib數(shù)據(jù)類型04分布式矩陣行矩陣是一個面向行的分布式矩陣,其不具有行索引和列索引,其中每一行都是一個本地的向量,我們使用本地存儲模擬存儲這些數(shù)據(jù)。在創(chuàng)建完行矩陣實例后,通過其自帶的computeColumnSummaryStatistics()方法獲取該矩陣的一些統(tǒng)計摘要信息,并可以對其進行分解。用SparkShell來演示無索引行矩陣的創(chuàng)建,首先創(chuàng)建RDD[Vector],然后創(chuàng)建rows并以rows作為參數(shù)直接創(chuàng)建行矩陣mat,最后統(tǒng)計mat的行數(shù)和列數(shù)。1)無索引行矩陣8.1.3MLlib數(shù)據(jù)類型04分布式矩陣有索引行矩陣IndexedRowMatrix是對行矩陣RowMatrix的拓展,其中包含每一行的行索引值,這個索引值可以被用來識別不同行,或是進行諸如join之類的操作。一個索引行矩陣是由IndexedRow組成的,其數(shù)據(jù)存儲在一個由IndexedRow組成的RDD中,IndexedRow中的每一行都有一個帶長整型的索引值用來存儲索引信息。2)有索引行矩陣8.1.3MLlib數(shù)據(jù)類型04分布式矩陣坐標(biāo)矩陣CoordinateMatrix由矩陣類型MatrixEntry的RDD組成,而MatrixEntry中封裝了非零元素的行、列信息及非零元素的值,矩陣項MatrixEntry是一個三元組:(i:Long,j:Long,value:Double)。其中i是行索引,j是列索引,value是該位置的值。CoordinateMatrix只有當(dāng)矩陣的兩個維度都很大且矩陣非常稀疏時才會被使用。3)坐標(biāo)矩陣8.1.3MLlib數(shù)據(jù)類型04分布式矩陣塊矩陣是由矩陣塊MatrixBlocks的RDD構(gòu)成的分布式矩陣,其中一個MatrixBlock封裝了一個元組((Int,Int),Matrix),其中(Int,Int)是塊索引,并且Matrix是給定索引處的子矩陣。塊矩陣支持諸如加法add()和乘法multiply()等方法。除此之外,塊矩陣還有一個輔助功能validate()方法,該方法可以用來檢查塊矩陣是否被成功創(chuàng)建。4)塊矩陣8.1.3MLlib數(shù)據(jù)類型04分布式矩陣索引行矩陣和坐標(biāo)矩陣可以通過調(diào)用toBlockMatrix()來創(chuàng)建塊矩陣,調(diào)用該方法創(chuàng)建的塊矩陣的默認(rèn)大小為1024×1024。以下面的矩陣為例,先使用MatrixEntry創(chuàng)建出坐標(biāo)矩陣,再轉(zhuǎn)換為塊矩陣,最后將矩陣A與其轉(zhuǎn)置矩陣進行乘法運算,代碼如下。8.1.4MLlib基本統(tǒng)計實踐

01概況統(tǒng)計實踐我們使用汽車數(shù)據(jù)集,它是一類多重變量分析的數(shù)據(jù)集,是常用的分類實驗數(shù)據(jù)集,通過/ml/machinelearningdatabases/autos/imports85.data下載數(shù)據(jù)集,使用第10、11、12、13項數(shù)據(jù),分別代表輪距、長度、寬度和高度。對于RDD[Vector]類型的變量,SparkMLlib提供了一種稱為colStats()的統(tǒng)計方法,調(diào)用該方法會返回一個類型為MultivariateStatisticalSummary的實例。通過這個實例,我們可以獲得每一列的最大值、最小值、均值、方差、總數(shù)等。8.1.4MLlib基本統(tǒng)計實踐

01概況統(tǒng)計實踐具體代碼如下。importorg.apache.spark.mllib.linalg.{Vector,Ventors}importorg.apache.spark.mllib.stat.{MultivariateStatisticalSummary,Statistics}//根據(jù)數(shù)據(jù)集的第10、11、12、13屬性轉(zhuǎn)換成RDD[Vector]valobservations=sc.textFile("/home/imports-85.data").map(_.split(",")).map(p=>Vectors.dense(p(9).toDouble,p(10).toDouble,p(11).toDouble,p(12).toDouble))//調(diào)用colStats()方法,得到一個MultivariateStatisticalSummary類型的變量scala>valsummary:MultivariateStatisticalSummary=Statistics.colStats(observations)//查看這些數(shù)據(jù)集統(tǒng)計后的結(jié)果scala>println(summary.count)205//每列均值8.1.4MLlib基本統(tǒng)計實踐

01概況統(tǒng)計實踐具體代碼如下。scala>println(summary.mean)[98.75658536585362,174.04926829268288,65.90780487804875,53.724878048780475]//每列方差scala>println(summary.variance)[36.26178240076516,152.20868818747027,4.6018995695839315,5.970799617407945]//每列最大值scala>println(summary.max)[120.9,208.1,72.3,59.8]//每列最小值scala>println(summary.min)[86.6,141.1,60.3,47.8]8.1.4MLlib基本統(tǒng)計實踐

01概況統(tǒng)計實踐具體代碼如下。scala>println(summary.normL1)[20245.100000000024,35680.10000000003,13511.099999999993,11013.600000000008]scala>println(summary.normL2)[1416.5925137455722,2498.2285463904245,944.1534462151793,770.0145193436292]scala>println(summary.numNonzeros)[205.0,205.0,205.0,205.0]8.1.4MLlib基本統(tǒng)計實踐

01概況統(tǒng)計實踐其中,主要方法的含義與返回值類型見表8-3。表8-3統(tǒng)計表格8.1.4MLlib基本統(tǒng)計實踐

02相關(guān)性實踐相關(guān)系數(shù)是用來反映變量之間關(guān)系密切程度的統(tǒng)計指標(biāo)。變量間相關(guān)系數(shù)絕對值越大,則變量間相關(guān)性越強(值越接近1或-1),當(dāng)取值為0時,表示不相關(guān),取值為(0~-1]表示負(fù)相關(guān),取值為(0,1]表示正相關(guān)。MLlib提供了用于計算多系數(shù)數(shù)據(jù)之間兩兩相關(guān)的靈活算法,它支持Pearson相關(guān)和Spearman相關(guān)。Statistics提供了計算系列數(shù)據(jù)相關(guān)性的方法,它根據(jù)輸入類型的不同,輸出的結(jié)果也會發(fā)生相應(yīng)的變化。如果輸入的是兩個RDD[Double],則輸出的是一個Double類型的結(jié)果;如果輸入的是一個RDD[Vector],則對應(yīng)輸出的是一個相關(guān)系數(shù)矩陣。8.1.4MLlib基本統(tǒng)計實踐

02相關(guān)性實踐我們?nèi)匀皇褂蒙鲜鰯?shù)據(jù)集進行實踐,代碼如下。scala>importorg.apache.spark.SparkContextscala>importorg.apache.spark.mllib.linalg._scala>importorg.apache.spark.mllib.stat.Statistics//將RDD1命名為seriesX,含義是車輛長度RDDscala>valseriesX=sc.textFile("/home/imports-85.data").map(_.split(",")).map(p=>p(10).toDouble)seriesX:org.apache.spark.rdd.RDD[Double]=MapPartitionsRDD[74]atmapat<console>:37//將RDD2命名為seriesY,含義是車輛寬度RDD8.1.4MLlib基本統(tǒng)計實踐

02相關(guān)性實踐我們?nèi)匀皇褂蒙鲜鰯?shù)據(jù)集進行實踐,代碼如下。scala>valseriesY=sc.textFile("/home/imports85.data").map(_.split(",")).map(p=>p(11).toDouble)seriesY:org.apache.spark.rdd.RDD[Double]=MapPartitionsRDD[78]atmapat<console>:37//調(diào)用Statistics的corr方法查看車輛長度與寬度的相關(guān)性scala>valcorrelation:Double=Statistics.corr(seriesX,seriesY,"pearson")correlation:Double=0.8411182684812752scala>print(correlation)0.8411182684812752這說明車輛的長度和寬度之間的相關(guān)性為0.8411182684812752,車輛長度與寬度之間的相關(guān)性非常高。8.1.4MLlib基本統(tǒng)計實踐

02相關(guān)性實踐上述方法輸入的系數(shù)是兩個RDD[Double]類型,然后使用一個RDD[Vector]來作為傳入?yún)?shù),從而得到一個相關(guān)矩陣。代碼如下。scala>valdata=sc.textFile("/home/imports-85.data").map(_.split(",")).map(p=>Vectors.dense(p(10).toDouble,p(11).toDouble))data:org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector]=MapPartitionsRDD[86]atmapat<console>:37//調(diào)用Statistics包中的corr()函數(shù),同樣可以選擇pearson或spearman,得到相關(guān)系數(shù)矩陣scala>valcorrelMatrix1:Matrix=Statistics.corr(data,"pearson")correlMatrix1:org.apache.spark.mllib.linalg.Matrix=1.00.84111826848127520.84111826848127521.08.1.4MLlib基本統(tǒng)計實踐

02相關(guān)性實踐相關(guān)矩陣也稱相關(guān)系數(shù)矩陣,它是由矩陣各列間的相關(guān)系數(shù)構(gòu)成的。在上述實例中,相關(guān)矩陣第0行第1列的元素是原矩陣data的第0列和第1列的相關(guān)系數(shù)??梢圆榭匆幌律鲜鰀ata數(shù)據(jù)矩陣。data.foreach{x=>println(x)}[168.8,64.1][168.8,64.1][171.2,65.5]……8.1.4MLlib基本統(tǒng)計實踐

03分層抽樣實踐分層抽樣(stratifiedsampling),顧名思義,就是將數(shù)據(jù)根據(jù)不同的特征分成不同的組,然后按特定條件從不同的組中獲取樣本,并重新組成新的數(shù)組。對于分層抽樣,sampleByKey()和sampleByKeyExact()在RDD的鍵值對上執(zhí)行,將鍵視為標(biāo)簽,將值視為特定屬性。sampleByKey()需要對數(shù)據(jù)進行遍歷,并輸入數(shù)據(jù)的期望,從而確定抽樣樣本。sampleByKeyExact()方法比sampleByKey()更加復(fù)雜,單預(yù)測精準(zhǔn)程度更高。8.1.4MLlib基本統(tǒng)計實踐

04假設(shè)檢驗實踐在統(tǒng)計分析過程中,假設(shè)檢驗是非常常用的工具,假設(shè)檢驗的基本思想是小概率反證法思想。小概率思想是指小概率事件(P<0.01或P<0.05)在一次試驗中基本上不會發(fā)生。反證法思想是先提出假設(shè)(假設(shè)H0),再用適當(dāng)?shù)慕y(tǒng)計方法確定假設(shè)成立的可能性大小,若可能性小,則認(rèn)為假設(shè)不成立,若可能性大,則還不能認(rèn)為假設(shè)不成立??梢允褂迷摲椒ㄅ袛嘟Y(jié)果是否統(tǒng)計充分,還可用來判斷該結(jié)果是否為隨機生成的。8.1.4MLlib基本統(tǒng)計實踐

04假設(shè)檢驗實踐//導(dǎo)入相關(guān)包importorg.apache.spark.mllib.linalg._importorg.apache.spark.mllib.regression.LabeledPointimportorg.apache.spark.mllib.stat.Statisticsimportorg.apache.spark.mllib.stat.test.ChiSqTestResultimportorg.apache.spark.rdd.RDD//數(shù)據(jù)集組成的向量值,可以使用汽車數(shù)據(jù)集組成向量值//valtest=sc.textFile("/home/imports85.data").map(_.split(",")).map(p=>Vectors.//dense(p(0).toDouble,p(1).toDouble,p(2).toDouble,p(3).toDouble)).first8.1.4MLlib基本統(tǒng)計實踐

04假設(shè)檢驗實踐valvec:Vector=Vectors.dense(0.1,0.15,0.2,0.3,0.25)//適合度檢驗valgoodnessOfFitTestResult=Statistics.chiSqTest(vec)println(s"$goodnessOfFitTestResult\\n")//創(chuàng)建一個矩陣((1.0,2.0),(3.0,4.0),(5.0,6.0))valmat:Matrix=Matrices.dense(3,2,Array(1.0,3.0,5.0,2.0,4.0,6.0))//使用矩陣進行獨立性檢測valindependenceTestResult=Statistics.chiSqTest(mat)println(s"$independenceTestResult\\n")任務(wù)2特征提取和轉(zhuǎn)換8.2.1特征提取特征提取是機器學(xué)習(xí)中很常用的數(shù)據(jù)處理方式,一般都出現(xiàn)在實際搭建模型之前,以達(dá)到特征空間維度的變化(常見的是降維操作)。特征提取是通過適當(dāng)變換把已有樣本的D個特征轉(zhuǎn)換成d(d<D)個新特征。這樣做的主要目的有:降低特征空間的維度,使后續(xù)的分類器設(shè)計在計算上更容易實現(xiàn);消除原有特征之間的相關(guān)度,減少數(shù)據(jù)信息的冗余,以更有利于分類。8.2.1特征提取1.TF-IDF“詞頻逆文檔頻率”(TF-IDF)是一種在文本挖掘中廣泛使用的特征向量化方法,它可以體現(xiàn)一個文檔中的詞語在語料庫中的重要性。TF表示詞頻,IDF表示逆文檔頻率。(1)TF:HashingTF是一個Transformer,在文本處理中,接收詞條的集合然后把這些集合轉(zhuǎn)化成固定長度的特征向量。這個算法在哈希的同時會統(tǒng)計各個詞條的詞頻。(2)IDF:IDF是一個Estimator,在一個數(shù)據(jù)集上應(yīng)用它的fit()方法,產(chǎn)生一個IDFModel。該IDFModel接收特征向量(由HashingTF產(chǎn)生),然后計算每一個詞在文檔中出現(xiàn)的頻次。IDF會減少那些在語料庫中出現(xiàn)頻率較高的詞的權(quán)重。8.2.1特征提取1.TF-IDF下面的代碼段從一組句子開始,將每個句子使用Tokenizer分成單詞。對于每個句子(單詞包),我們使用HashingTF將句子散列為特征向量,然后使用IDF重新縮放特征向量。特征向量可以傳遞給學(xué)習(xí)算法。提前準(zhǔn)備文本文件kmeans_data.txt,其內(nèi)容如下。0.00.00.00.10.10.10.20.20.29.09.09.09.19.19.19.29.29.2代碼如下。見書本P194-195。8.2.1特征提取2.詞向量化Word2VecWord2Vec將一個單詞轉(zhuǎn)換為分布式的詞向量的格式,它將單詞序列化為新模型Word2VecModel。該模型將每個單詞映射到一個唯一的固定大小的向量,使用Word2VecModel文檔中所有單詞的平均值將每個文檔轉(zhuǎn)換為向量。轉(zhuǎn)換后的模型可以用來實現(xiàn)相似度計算、機器翻譯與解析等,如圖8-1所示。圖8-1轉(zhuǎn)換模型8.2.1特征提取2.詞向量化Word2Vec在MLlib中創(chuàng)建Word2Vec對象需要設(shè)置很多參數(shù),這里給出具體參數(shù)說明?!inalvalinputCol:Param[String]:輸入列名。·finalvalmaxIter:IntParam:最大迭代次數(shù)?!inalvalminCount:IntParam:Word2Vec模型中詞匯出現(xiàn)的最小次數(shù),默認(rèn)是5。·finalvalnumPartitions:IntParam:單詞句子分區(qū)數(shù),默認(rèn)是1?!inalvaloutputCol:Param[String]:輸出列名?!inalvalseed:LongParam:自由度?!inalvalstepSize:DoubleParam:每次迭代的步驟大小?!inalvalvectorSize:IntParam:轉(zhuǎn)換的維度,默認(rèn)是100。8.2.1特征提取3.CountVectorizerCountVectorizer旨在通過計數(shù)方法將一組文本文檔轉(zhuǎn)換為向量。當(dāng)先驗字典不可用時,CountVectorizer可以用作Estimator提取詞匯表,并生成一個CountVectorizerModel。該模型為詞匯表上的文檔生成稀疏表示,然后可以將其傳遞給其他算法,如LDA。例子有如表8-4所示的文檔,分別是數(shù)據(jù)id和text。表8-4數(shù)據(jù)id和text8.2.1特征提取3.CountVectorizer每行text都是Array[String]類型的文檔。調(diào)用擬合CountVectorizer產(chǎn)生CountVectorizerModel詞匯(a,b,c)。然后轉(zhuǎn)換后的輸出列vector見表8-5。表8-5數(shù)據(jù)id、text和Vector8.2.1特征提取3.CountVectorizer下面給出兩個詞匯庫,分別是"a","b","c","e","f"和"a","b","b","c","a",并使用CountVectorizer統(tǒng)計詞庫中的單詞數(shù),同時設(shè)定統(tǒng)計結(jié)果的過濾條件為詞匯表的最大量為3且該統(tǒng)計詞匯至少要在2個文檔中出現(xiàn)過,因此統(tǒng)計結(jié)果只統(tǒng)計了"a","b","c"。代碼如下。importspark.implicits._importorg.apache.spark.ml.feature.{CountVectorizer,CountVectorizerModel}//假設(shè)有如下DataFrame,其包含id和text兩列,可以被看成是一個包含兩個文檔的詞語庫valdf=spark.createDataFrame(Seq((0,Array("a","b","c","e","f")),(1,Array("a","b","b","c","a")))).toDF("id","text")//這里設(shè)定詞匯表的最大量為3,設(shè)定詞匯表中的詞至少要在兩個文檔中出現(xiàn)過,并過濾偶然出8.2.1特征提取3.CountVectorizer//現(xiàn)的詞匯e和f。通過CountVectorizer設(shè)定參數(shù)生成一個CountVectorizerModelvalcvModel:CountVectorizerModel=newCountVectorizer().setInputCol("text").setOutputCol("features").setVocabSize(3).setMinDF(2).fit(df)//通過調(diào)用CountVectorizerModel的vocabulary方法,獲得模型的詞匯表scala>cvModel.vocabularyres7:Array[String]=Array(b,a,c)//從打印結(jié)果可以看到,詞匯表中有a、b、c三個詞,且這三個詞都在兩個文檔中出現(xiàn)過(前文設(shè)定//了minDF為2)//使用這一模型對DataFrame進行變換,可以得到文檔的向量化表示scala>cvModel.transform(df).show(false)8.2.1特征提取3.CountVectorizer結(jié)果如圖8-2所示。表8-5數(shù)據(jù)id、text和Vector圖8-2結(jié)果輸出8.2.2常用特征轉(zhuǎn)換分詞器(Tokenizer)提供了將文本切分成單詞的功能,該函數(shù)的輸入通常是一段句子或文本,然后將句子切分成詞匯,并輸出這些詞匯。表8-6提供了3條數(shù)據(jù),每條數(shù)據(jù)有2個字段,分別是序號id和預(yù)處理數(shù)據(jù)sentence,使用下面的實例來講解如何用分詞器Tokenizer和正則分詞器RegexTokenizer將文本分割為單詞。1.分詞器表8-6文本表8.2.2常用特征轉(zhuǎn)換1.分詞器importorg.apache.spark.ml.feature.{RegexTokenizer,Tokenizer}importorg.apache.spark.sql.SparkSessionimportorg.apache.spark.sql.functions._valsentenceDataFrame=spark.createDataFrame(Seq((0,"HiIheardaboutSpark"),(1,"IwishJavacouldusecaseclasses"),(2,"Logistic,regression,models,are,neat"))).toDF("id","sentence")//創(chuàng)建tokenizer,設(shè)置標(biāo)記輸入列名為sentence,輸出列名為words//使用默認(rèn)“\s”匹配空格valtokenizer=newTokenizer().setInputCol("sentence").setOutputCol("words")8.2.2常用特征轉(zhuǎn)換1.分詞器//創(chuàng)建regexTokenizer,設(shè)置輸入列為sentence,輸出列為words,匹配正則表達(dá)式為“\\W”//\W匹配任何非單詞字符,等價于[^A-Za-z0-9_]scala>valregexTokenizer=newRegexTokenizer().setInputCol("sentence").setOutputCol("words").setPattern("\W")valcountTokens=udf{(words:Seq[String])=>words.length}valtokenized=tokenizer.transform(sentenceDataFrame)scala>tokenized.select("sentence","words").withColumn("tokens",countTokens(col("words"))).show(false)結(jié)果如圖8-3所示。圖8-3tokenized分解結(jié)果8.2.2常用特征轉(zhuǎn)換1.分詞器scala>valregexTokenized=regexTokenizer.transform(sentenceDataFrame)scala>regexTokenized.select("sentence","words").withColumn("tokens",countTokens(col("words"))).show(false)c結(jié)果如圖8-4所示。圖8-4regexTokenized語句分解結(jié)果通過配置不同的參數(shù)Pattern,可以看到兩個輸出結(jié)果是不同的,結(jié)果一的tokens第三行為1,因為Pattern沒有設(shè)置,使用默認(rèn)匹配空格;結(jié)果二的tokens第三行為5,因為Pattern設(shè)置為匹配所有非單詞字符。8.2.2常用特征轉(zhuǎn)換2.排除詞排除詞(StopWordsRemover)是從輸入中排除指定的詞,通常是因為詞經(jīng)常出現(xiàn)但這些詞沒有意義。下面用一個例子來說明排除詞的用法,如表8-7所示分別是數(shù)據(jù)id和raw。表8-7id和raw表在filtered,過濾掉了停用詞“I”“the”“have”和“a”,使用StopWordsRemover進行處理,raw作為輸入列,filtered作為輸出列,希望得到如表8-8所示的結(jié)果。表8-8過濾表8.2.2常用特征轉(zhuǎn)換2.排除詞代碼如下。importorg.apache.spark.ml.feature.StopWordsRemover//設(shè)置輸入列名和輸出列名,默認(rèn)排除英語單詞,但這并不是很準(zhǔn)確valremover=newStopWordsRemover().setInputCol("raw").setOutputCol("filtered")valdataSet=spark.createDataFrame(Seq((0,Seq("I","saw","the","red","baloon")),(1,Seq("Mary","had","a","little","lamb")))).toDF("id","raw")remover.transform(dataSet).show(false)8.2.2常用特征轉(zhuǎn)換3.n-gramn-gramn-gram是一種將輸入的字符串?dāng)?shù)組轉(zhuǎn)換成n-gram的特征變換器,如果輸入數(shù)組的值為空則忽略,通過轉(zhuǎn)換返回一個n-gram數(shù)組,數(shù)組中的每個元素由一個空格分隔的單詞字符串表示。需要注意的是,當(dāng)輸入為空時,返回空數(shù)組。當(dāng)輸入數(shù)組長度小于n(每個ngram的元素數(shù))時,不返回n-gram。8.2.2常用特征轉(zhuǎn)換3.n-gram在MLlib中創(chuàng)建ngram對象需要設(shè)置很多參數(shù),說明如下?!inalvalinputCol:Param[String]:輸入列名?!aln:IntParam:最小ngram的長度,大于等于1,默認(rèn)是2?!inalvaloutputCol:Param[String]:輸出列名。8.2.2常用特征轉(zhuǎn)換3.n-gram下面用一個例子來說明排除詞的用法,如表8-9所示的數(shù)據(jù)分別是數(shù)據(jù)id和words。表8-9id和words數(shù)據(jù)表使用n-gram將words下的單詞分割成由單詞字符串組成的數(shù)組,長度為2,希望得到如表8-10所示的結(jié)果。表8-10單詞分割表8.2.2常用特征轉(zhuǎn)換3.n-gram代碼如下。importorg.apache.spark.ml.feature.NGramvalwordDataFrame=spark.createDataFrame(Seq((0,Array("Hi","I","heard","about","Spark")),(1,Array("I","wish","Java","could","use","case","classes")),(2,Array("Logistic","regression","models","are","neat")))).toDF("id","words")//新建ngram,設(shè)置ngram的長度、輸入列和輸出列valngram=newNGram().setN(2).setInputCol("words").setOutputCol("ngrams")//通過ngram進行轉(zhuǎn)換valngramDataFrame=ngram.transform(wordDataFrame)ngramDataFrame.select("ngrams").show(false)8.2.2常用特征轉(zhuǎn)換3.n-gram結(jié)果如圖8-5所示。圖8-5n-gram轉(zhuǎn)換結(jié)果8.2.2常用特征轉(zhuǎn)換4.二值化二值化器采用通用參數(shù)inputcol和outputcol,以及二值化閾值。大于閾值的特征值被二值化為1.0;等于或小于閾值的值被二值化為0.0。inputcol支持Vector和Double類型。下面使用二值化將一組消費人群按照年齡50歲進行區(qū)分,分別為老年人和非老年人,數(shù)據(jù)見表8-11。表8-11id和age數(shù)據(jù)表8.2.2常用特征轉(zhuǎn)換4.二值化使用Binarizer按照age進行二值化,區(qū)分老年人和非老年人,閾值為50.0,希望得到如表8-12所示的結(jié)果。表8-12二值化結(jié)果表8.2.2常用特征轉(zhuǎn)換4.二值化scala>importorg.apache.spark.ml.feature.Binarizerscala>valdata=Array((0,34.0),(1,56.0),(2,50.0),(3,60.0),(4,25.0))data:Array[(Int,Double)]=Array((0,34.0),(1,56.0),(2,50.0),(3,60.0),(4,25.0))//將數(shù)組轉(zhuǎn)換為DataFramescala>valdataFrame=spark.createDataFrame(data).toDF("id","age")//初始化Binarizer對象并進行設(shè)定:setThreshold是設(shè)置閾值,setInputCol是設(shè)置需要進行//二值化的輸入列,setOutputCol是設(shè)置輸出列valbinarizer:Binarizer=newBinarizer().setInputCol("age").setOutputCol("binarized_feature").setThreshold(50.0)//使用transform方法將DataFrame進行二值化valbinarizedDataFrame=binarizer.transform(dataFrame)//展示結(jié)果println(s"BinarizeroutputwithThreshold=${binarizer.getThreshold}")binarizedDataFrame.show()8.2.2常用特征轉(zhuǎn)換4.二值化結(jié)果如圖8-6所示。圖8-6二值化結(jié)果18.2.2常用特征轉(zhuǎn)換5.連續(xù)型數(shù)據(jù)處理之給定邊界離散化(Bucketizer)Bucketizer將一列連續(xù)的特征轉(zhuǎn)換為(離散的)特征區(qū)間,區(qū)間由用戶指定。其中,創(chuàng)建Bucketizer需要設(shè)置一個參數(shù)splites(分箱數(shù)),說明如下:分箱數(shù)為n+1時,將產(chǎn)生n個區(qū)間。除了最后一個區(qū)間外,每個區(qū)間范圍[x,y]由分箱的x、y決定。分箱必須是嚴(yán)格遞增的。分箱(區(qū)間)建在分箱(區(qū)間)指定外的值將被歸為錯誤。8.2.2常用特征轉(zhuǎn)換5.連續(xù)型數(shù)據(jù)處理之給定邊界離散化(Bucketizer)代碼如下。scala>importorg.apache.spark.ml.feature.Bucketizerscala>valarray=Array((1,13.0),(2,16.0),(3,23.0),(4,35.0),(5,56.0),(6,44.0))//將數(shù)據(jù)轉(zhuǎn)換為DataFramescala>valdf=spark.createDataFrame(array).toDF("id","age")//設(shè)定邊界,分為5個年齡組:[0,20),[20,30),[30,40),[40,50),[50,正無窮)//注:人的年齡當(dāng)然不可能正無窮,這里只是為了給大家演示正無窮PositiveInfinity的//用法,負(fù)無窮是NegativeInfinityscala>valsplits=Array(0,20,30,40,50,Double.PositiveInfinity)//初始化Bucketizer對象并進行設(shè)定:setSplits方法用于設(shè)置劃分依據(jù)scala>valbucketizer=newBucketizer().setSplits(splits).setInputCol("age").setOutputCol("bucketizer_feature")//transform方法將DataFrame二值化scala>valbucketizerdf=bucketizer.transform(df)//show方法用于展示結(jié)果scala>bucketizerdf.show8.2.2常用特征轉(zhuǎn)換5.連續(xù)型數(shù)據(jù)處理之給定邊界離散化(Bucketizer)結(jié)果如圖8-7所示。圖8-7二值化結(jié)果28.2.2常用特征轉(zhuǎn)換6.主成分分析主成分分析(principalcomponentsanalysis,PCA)是圖像處理中經(jīng)常用到的降維方法,在處理有關(guān)數(shù)字圖像方面的問題時,如圖像查詢問題,在一個存有幾萬、幾百萬甚至更多圖像的數(shù)據(jù)庫中查詢一幅相近的圖像。8.2.2常用特征轉(zhuǎn)換6.主成分分析PCA是一種統(tǒng)計過程,它使用正交變換將可能相關(guān)變量的一組觀察值轉(zhuǎn)換為稱為主成分的線性不相關(guān)變量的一組值。PCA類使用PCA訓(xùn)練模型將向量投影到低維空間。下面的示例顯示了如何將5維特征向量投影到3維主成分中。代碼如下。importorg.apache.spark.ml.feature.PCAimportorg.apache.spark.ml.linalg.Vectors//創(chuàng)建一個5維向量valdata=Array(Vectors.sparse(5,Seq((1,1.0),(3,7.0))),Vectors.dense(2.0,0.0,3.0,4.0,5.0),Vectors.dense(4.0,0.0,0.0,6.0,7.0))//將向量轉(zhuǎn)換為DataFrame形式valdf=spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")df.show8.2.2常用特征轉(zhuǎn)換6.主成分分析結(jié)果如圖8-8所示。圖8-8DataFrame圖//創(chuàng)建PCA對象,輸入列名為features,輸出列名為pcaFeatures,過濾表格為df,維度為3valpca=newPCA().setInputCol("features").setOutputCol("pcaFeatures").setK(3).fit(df)valresult=pca.transform(df).select("pcaFeatures")result.show(false)結(jié)果如圖8-9所示。圖8-9PCA結(jié)果圖8.2.2常用特征轉(zhuǎn)換7.StringIndexerStringIndexer轉(zhuǎn)換器可以把一列類別型的特征(或標(biāo)簽)進行編碼,使其數(shù)值化,索引的范圍從零開始,該過程可以使得相應(yīng)的特征索引化,使得某些無法接收類別型特征的算法可以使用,并提高諸如決策樹等機器學(xué)習(xí)算法的效率。8.2.2常用特征轉(zhuǎn)換7.StringIndexer索引構(gòu)建的順序為標(biāo)簽的頻率,優(yōu)先編碼頻率較大的標(biāo)簽,所以出現(xiàn)頻率最高的標(biāo)簽為0號。如果輸入的是數(shù)值型的,我們會把它轉(zhuǎn)化成字符型,然后對其進行編碼。importorg.apache.spark.ml.feature.{StringIndexer,StringIndexerModel}//創(chuàng)建一個DataFrame,它只包含一個id和categoryscala>valdf1=spark.createDataFrame(Seq(|(0,"a"),|(1,"b"),|(2,"c"),|(3,"a"),|(4,"a"),|(5,"c"))).toDF("id","category")8.2.2常用特征轉(zhuǎn)換7.StringIndexerdf1:org.apache.spark.sql.DataFrame=[id:int,category:string]//創(chuàng)建一個StringIndexer對象,設(shè)定輸入、輸出列名,其余參數(shù)采用默認(rèn)值按照字母的出//現(xiàn)頻率降序排序,并對這個DataFrame進行訓(xùn)練,產(chǎn)生StringIndexerModel對象scala>valindexer=newStringIndexer().|setInputCol("category").|setOutputCol("categoryIndex")scala>valmodel=indexer.fit(df1)//隨后即可利用該對象對DataFrame進行轉(zhuǎn)換操作,StringIndexerModel依次按照出現(xiàn)頻率//的降序進行排序,即出現(xiàn)最多的a被編號成0,中間多的c為1,最少的b為2scala>valindexed1=model.transform(df1)scala>indexed1.show()8.2.2常用特征轉(zhuǎn)換7.StringIndexer結(jié)果如圖8-10所示。圖8-10StringIndexer結(jié)果圖18.2.2常用特征轉(zhuǎn)換8.IndexToString與StringIndexer相對應(yīng),IndexToString的作用是把標(biāo)簽索引的一列重新映射回原有的字符型標(biāo)簽。其主要使用場景一般都是和StringIndexer配合,先用StringIndexer將標(biāo)簽轉(zhuǎn)化成標(biāo)簽索引,進行模型訓(xùn)練,然后在預(yù)測標(biāo)簽時把標(biāo)簽索引轉(zhuǎn)化成原有的字符標(biāo)簽。當(dāng)然,也可以另外定義其他標(biāo)簽。具體代碼見P207-208。8.2.2常用特征轉(zhuǎn)換8.IndexToString結(jié)果如圖8-11所示。圖8-11StringIndexer結(jié)果圖28.2.2常用特征轉(zhuǎn)換9.VectorIndexerStringIndexer是針對單個類別型特征進行轉(zhuǎn)換的,如果所有特征都已經(jīng)被組織在一個向量中,又想對其中某些單個分量進行處理,SparkMLlib提供了VectorIndexer類來解決向量數(shù)據(jù)集中的類別性特征轉(zhuǎn)換。VectorIndexer將Vectors的數(shù)據(jù)集中的特性進行分類轉(zhuǎn)換,它既可以決定哪些特征被分類,也可以將原始值轉(zhuǎn)換為類別的索引。8.2.2常用特征轉(zhuǎn)換9.VectorIndexer操作步驟如下。(1)設(shè)置Vector類型的輸入列和參數(shù)maxCategories。(2)根據(jù)每列的不同值數(shù)量確定哪些特征應(yīng)該是分類的,小于等于maxCategories的認(rèn)定為類別型特征轉(zhuǎn)換,其他列依舊是原始值。(3)為每列數(shù)字從小到大排列,從0開始的類別索引,然后是1,以此類推。(4)將原始值轉(zhuǎn)換為索引值。8.2.2常用特征轉(zhuǎn)換9.VectorIndexer下面舉個例子,輸入為一個數(shù)據(jù)集,然后使用VectorIndexer訓(xùn)練出模型,通過設(shè)置maxCategories為2,來決定哪些特征需要被作為類別特征,將類別特征轉(zhuǎn)換為索引,即只有種類小于2的特征才被認(rèn)為是類別型特征,否則被認(rèn)為是連續(xù)型特征。結(jié)果如圖8-12所示。具體代碼見P217。圖8-12VectorIndexer結(jié)果圖8.2.2常用特征轉(zhuǎn)換10.StandardScaler基于特征值的均值(mean)和標(biāo)準(zhǔn)差(standarddeviation)進行數(shù)據(jù)的標(biāo)準(zhǔn)化。它的計算公式:標(biāo)準(zhǔn)化數(shù)據(jù)=(原數(shù)據(jù)-均值)/標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化后的變量值圍繞0上下波動,大于0說明高于平均水平,小于0說明低于平均水平。StandardScaler將行向量數(shù)據(jù)集的所有屬性值進行標(biāo)準(zhǔn)化,代碼如下。importorg.apache.spark.ml.feature.StandardScalervaldataFrame=spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt")//setWithMean是否減均值,setWithStd是否將數(shù)據(jù)除以標(biāo)準(zhǔn)差//這里沒有減均值但有除以標(biāo)準(zhǔn)差valscaler=newStandardScaler().setInputCol("features")8.2.2常用特征轉(zhuǎn)換10.StandardScaler

.setOutputCol("scaledFeatures").setWithStd(true).setWithMean(false)valscalerModel=scaler.fit(dataFrame)valscaledData=scalerModel.transform(dataFrame)scaledData.show()結(jié)果如圖8-13所示。圖8-13StandardScaler結(jié)果圖8.2.3特征選擇特征選擇(featureselection)指的是在特征向量中篩選出有價值的特征,將其組成新的特征向量的過程。特征選擇應(yīng)用在高維數(shù)據(jù)分析中十分重要,它可以剔除掉冗余和無關(guān)的特征,從而提升學(xué)習(xí)器的性能。VectorSlicer卡方選擇器(ChiSqSelector)RFormula8.2.3特征選擇1.VectorSlicerVectorSlicer是一個轉(zhuǎn)換器,輸入為特征向量,輸出為原始特征向量子集。VectorSlicer接收帶有特定索引的向量列,通過對這些索引的值進行篩選得到新的向量集??山邮杖缦聝煞N索引。(1)整數(shù)索引,setIndices()。(2)字符串索引代表向量中特征的名字,此類要求向量列有AttributeGroup,因為該工具根據(jù)Attribute來匹配名字字段。8.2.3特征選擇1.VectorSlicer下面通過一段代碼來說明VectorSlicer的使用方法。8.2.3特征選擇1.VectorSlicer下面通過一段代碼來說明VectorSlicer的使用方法。8.2.3特征選擇1.VectorSlicer結(jié)果如圖8-14所示。圖8-14VectorSlicer結(jié)果圖8.2.3特征選擇2.卡方選擇器卡方選擇是統(tǒng)計學(xué)上常用的一種有監(jiān)督特征選擇方法,它通過對特征和真實標(biāo)簽之間進行卡方檢驗,來判斷該特征和真實標(biāo)簽的關(guān)聯(lián)程度,進而確定哪些特性被選擇使用。這其中涉及數(shù)學(xué)統(tǒng)計概率論的基本知識??ǚ竭x擇器(ChiSqSelector)支持5種選擇方法:percentilenumTopFeaturesfprfdrfwr8.2.3特征選擇2.卡方選擇器下面通過一段代碼來說明ChiSqSelector的使用方法。8.2.3特征選擇2.卡方選擇器結(jié)果如圖8-15所示。圖8-15卡方選擇器結(jié)果圖8.2.3特征選擇3.RFormulaRFormula與線性代數(shù)知識關(guān)聯(lián)性很高,可以選擇性學(xué)習(xí)。通過R模型公式(Rmodelformu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論