日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Spark-ML-数据获取/处理/准备

發(fā)布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spark-ML-数据获取/处理/准备 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

獲取公開數(shù)據(jù)集

UCL機(jī)器學(xué)習(xí)知識庫:包括近300個不同大小和類型的數(shù)據(jù)集,可用于分類、回歸、聚類 和推薦系統(tǒng)任務(wù)。數(shù)據(jù)集列表位于:http://archive.ics.uci.edu/ml/。
Amazon AWS公開數(shù)據(jù)集:包含的通常是大型數(shù)據(jù)集,可通過Amazon S3訪問。這些數(shù)據(jù) 集包括人類 基因組項(xiàng)目 、 Common Crawl 網(wǎng)頁語料 庫、維基百 科數(shù)據(jù)和 Google Books Ngrams。相關(guān)信息可參見:http://aws.amazon.com/publicdatasets/。
Kaggle:這里集合了Kaggle舉行的各種機(jī)器學(xué)習(xí)競賽所用的數(shù)據(jù)集。它們覆蓋分類、回 歸、排名、推薦系統(tǒng)以及圖像分析領(lǐng)域,可從Competitions區(qū)域下載:http://www.kaggle.com/ competitions。
KDnuggets:這里包含一個詳細(xì)的公開數(shù)據(jù)集列表,其中一些上面提到過的。該列表位 于:http://www.kdnuggets.com/datasets/index.html。
注意:
Spark 1.2.0引入了一個實(shí)驗(yàn)性質(zhì)的新MLlib API,位于ml包下(現(xiàn)有的接口 則位于mllib包下)。新API旨在加強(qiáng)原有的API和接口的設(shè)計,從而更容易銜接 數(shù)據(jù)流程的各個環(huán)節(jié)。這些環(huán)節(jié)包括特征提取、正則化、數(shù)據(jù)集轉(zhuǎn)化、模型訓(xùn)練 和交叉驗(yàn)證。
新API仍處于實(shí)現(xiàn)階段,在后續(xù)的版本中可能會出現(xiàn)重大的變更。因此,后 續(xù)的章節(jié)將只關(guān)注相對更成熟的現(xiàn)有MLlib API。隨著版本的更新,本書所提到 的各種特征提取方法和模型將會簡單地橋接到新API中。但新API的核心思路和 大部分底層代碼仍會保持原樣。

探索與可視化數(shù)據(jù)

  • 用戶數(shù)據(jù)
  • 電影數(shù)據(jù)
  • 評級數(shù)據(jù)
  • 處理與轉(zhuǎn)換數(shù)據(jù)

    過濾掉或刪除非規(guī)整或有值缺失的數(shù)據(jù):這通常是必須的,但的確會損失這些數(shù)據(jù)里那 些好的信息。
    填充非規(guī)整或缺失的數(shù)據(jù):可以根據(jù)其他的數(shù)據(jù)來填充非規(guī)整或缺失的數(shù)據(jù)。方法包括 用零值、全局期望或中值來填充,或是根據(jù)相鄰或類似的數(shù)據(jù)點(diǎn)來做插值(通常針對時 序數(shù)據(jù))等。選擇正確的方式并不容易,它會因數(shù)據(jù)、應(yīng)用場景和個人經(jīng)驗(yàn)而不同。
    對異常值做魯棒處理:異常值的主要問題在于即使它們是極值也不一定就是錯的。到底 是對是錯通常很難分辨。異常值可被移除或是填充,但的確存在某些統(tǒng)計技術(shù)(如魯棒 回歸)可用于處理異常值或是極值。
    對可能的異常值進(jìn)行轉(zhuǎn)換:另一種處理異常值或極值的方法是進(jìn)行轉(zhuǎn)換。對那些可能存 在異常值或值域覆蓋過大的特征,利用如對數(shù)或高斯核對其轉(zhuǎn)換。這類轉(zhuǎn)換有助于降低 變量存在的值跳躍的影響,并將非線性關(guān)系變?yōu)榫€性的。

    從數(shù)據(jù)中提取有用特征

    數(shù)值特征(numerical feature):這些特征通常為實(shí)數(shù)或整數(shù),比如之前例子中提到的年齡。
    ? 類別特征(categorical feature):它們的取值只能是可能狀態(tài)集合中的某一種。我們數(shù)據(jù) 集中的用戶性別、職業(yè)或電影類別便是這類。
    ? 文本特征(text feature):它們派生自數(shù)據(jù)中的文本內(nèi)容,比如電影名、描述或是評論。
    注意:

    ? 分詞(tokenization):首先會應(yīng)用某些分詞方法來將文本分隔為一個由詞(一般如單詞、 數(shù)字等)組成的集合。可用的方法如空白分隔法。這種方法在空白處對文本分隔并可能 還刪除其他如標(biāo)點(diǎn)符號和其他非字母或數(shù)字字符。? 刪除停用詞(stop words removal):之后,它通常會刪除常見的單詞,比如theandbut (這些詞被稱作停用詞)。? 提取詞干(stemming):下一步則是詞干的提取。這是指將各個詞簡化為其基本的形式或 者干詞。常見的例子如復(fù)數(shù)變?yōu)閱螖?shù)(比如dogs變?yōu)閐og等)。提取的方法有很多種,文本 處理算法庫中常常會包括多種詞干提取方法。? 向量化(vectorization):最后一步就是用向量來表示處理好的詞。二元向量可能是最為 簡單的表示方式。它用10來分別表示是否存在某個詞。從根本上說,這與之前提到的k 之1編碼相同。與k之1相同,它需要一個詞的字典來實(shí)現(xiàn)詞到索引序號的映射。隨著遇到 的詞增多,各種詞可能達(dá)數(shù)百萬。由此,使用稀疏矩陣來表示就很關(guān)鍵。這種表示只記 錄某個詞是否出現(xiàn)過,從而節(jié)省內(nèi)存和磁盤空間,以及計算時間。

    ? 其他特征:大部分其他特征都最終表示為數(shù)值。比如圖像、視頻和音頻可被表示為數(shù)值 數(shù)據(jù)的集合。地理位置則可由經(jīng)緯度或地理散列(geohash)表示。

    用軟件包提取特征

    Spark支持Scala、Java和Python的綁定。我們可以通過這些語言所開發(fā)的軟件包,借助其中完 善的工具箱來實(shí)現(xiàn)特征的處理和提取,以及向量表示。特征提取可借助的軟件包有scikit-learn、gensim、scikit-image、matplotlib、Python的NLTK、Java編寫的OpenNLP以及用Scala編寫的Breeze和Chalk。實(shí)際上,Breeze自Spark 1.0開始就成為Spark的一部分了。后幾章也會介紹如何使用Breeze
    的線性代數(shù)功能。

    代碼

    MovieLens 100k數(shù)據(jù)集

    import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.mllib.stat.Statistics import scala.math._ import org.apache.spark.mllib._ import org.apache.spark.sql.catalyst.expressions.Length import org.apache.spark.mllib.feature.Normalizer import org.apache.spark.mllib.linalg._ object Mian {def convertYear(x: String): Int = {try {return (x.substring(x.length()-4)).toInt} catch {case t: Throwable => return 1990}}def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("ml").setMaster("local")val sc = new SparkContext(conf)val userData = sc.textFile("data/u.user")//println(data.first())val userFields = userData.map(line => line.split("|"))val numUsers = userFields.map(fields => fields(0)).count()val numGenders = userFields.map(fields => fields(2)).distinct().count()val numOccupations = userFields.map(fields => fields(3)).distinct().count()val numZipCodes = userFields.map(fields => fields(4)).distinct().count()println("用戶: %d,性別: %d,職業(yè):%d,郵編:%d".format(numUsers,numGenders,numOccupations,numZipCodes))val movieData = sc.textFile("data/u.item")println("電影數(shù)量:%d".format(movieData.count()))val movieFields = movieData.map(line => line.split("|"))val years = movieFields.map(field => field(2)).map(x => convertYear(x))val yearsFilter = years.filter(x=>x!=1990)val numMovie = years.count()val movieAge = yearsFilter.map(y => 1998-y).countByValue()val rattingData = sc.textFile("data/u.data")val rattingFields = rattingData.map(line=>line.split("\t"))val rattings = rattingFields.map(field => field(2).toInt)val numRatting = rattings.count()val maxRatting = rattings.reduce((x, y) => math.max(x, y))val minRatting = rattings.reduce((x, y) => math.min(x, y))val meanRatting = rattings.reduce((x,y) => (x+y)) / numRattingval rattingsPerUser = numRatting / numUsersval rattingsPerMovie = numRatting / numMovieprintln("最小評分:",minRatting)println("最大評分:",maxRatting)println("平均評分:",meanRatting)println("每個用戶平均評分:",rattingsPerUser)println("每個電影平均評分:",rattingsPerMovie)val userRattingGrpuped = rattingFields.map(field => (field(0).toInt,field(2).toInt)).groupByKey()//用戶評級次數(shù)val userRattingByUser = userRattingGrpuped.map((k) => (k._1,k._2.size))// userRattingByUser.take(5)println(userRattingByUser.take(5).toMap)val allOccupations = userFields.map(fields => fields(3)).distinct().collect()println(allOccupations.sorted.toString())val normalizer = new Normalizer()val v = Vectors.dense(1.0,2.0,3.0)//正則化println(normalizer.transform(v))} }

    總結(jié)

    以上是生活随笔為你收集整理的Spark-ML-数据获取/处理/准备的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。