Spark-ML-数据获取/处理/准备
獲取公開數(shù)據(jù)集
UCL機(jī)器學(xué)習(xí)知識(shí)庫:包括近300個(gè)不同大小和類型的數(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:這里包含一個(gè)詳細(xì)的公開數(shù)據(jù)集列表,其中一些上面提到過的。該列表位 于:http://www.kdnuggets.com/datasets/index.html。
注意:
Spark 1.2.0引入了一個(gè)實(shí)驗(yàn)性質(zhì)的新MLlib API,位于ml包下(現(xiàn)有的接口 則位于mllib包下)。新API旨在加強(qiáng)原有的API和接口的設(shè)計(jì),從而更容易銜接 數(shù)據(jù)流程的各個(gè)環(huán)節(jié)。這些環(huán)節(jié)包括特征提取、正則化、數(shù)據(jù)集轉(zhuǎn)化、模型訓(xùn)練 和交叉驗(yàn)證。
新API仍處于實(shí)現(xiàn)階段,在后續(xù)的版本中可能會(huì)出現(xiàn)重大的變更。因此,后 續(xù)的章節(jié)將只關(guān)注相對更成熟的現(xiàn)有MLlib API。隨著版本的更新,本書所提到 的各種特征提取方法和模型將會(huì)簡單地橋接到新API中。但新API的核心思路和 大部分底層代碼仍會(huì)保持原樣。
探索與可視化數(shù)據(jù)
處理與轉(zhuǎn)換數(shù)據(jù)
過濾掉或刪除非規(guī)整或有值缺失的數(shù)據(jù):這通常是必須的,但的確會(huì)損失這些數(shù)據(jù)里那 些好的信息。
填充非規(guī)整或缺失的數(shù)據(jù):可以根據(jù)其他的數(shù)據(jù)來填充非規(guī)整或缺失的數(shù)據(jù)。方法包括 用零值、全局期望或中值來填充,或是根據(jù)相鄰或類似的數(shù)據(jù)點(diǎn)來做插值(通常針對時(shí) 序數(shù)據(jù))等。選擇正確的方式并不容易,它會(huì)因數(shù)據(jù)、應(yīng)用場景和個(gè)人經(jīng)驗(yàn)而不同。
對異常值做魯棒處理:異常值的主要問題在于即使它們是極值也不一定就是錯(cuò)的。到底 是對是錯(cuò)通常很難分辨。異常值可被移除或是填充,但的確存在某些統(tǒng)計(jì)技術(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)容,比如電影名、描述或是評論。
注意:
? 其他特征:大部分其他特征都最終表示為數(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的一部分了。后幾章也會(huì)介紹如何使用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("每個(gè)用戶平均評分:",rattingsPerUser)println("每個(gè)電影平均評分:",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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DP——最优矩阵链乘最优三角剖分
- 下一篇: 用户通过WEB方式更改AD域帐户密码