在技術(shù)行業(yè),分析和挖掘商業(yè)數(shù)據(jù)的技能正變得越來越重要。公司若有線上業(yè)務(wù),可開發(fā)利用線上產(chǎn)生的數(shù)據(jù),以改進(jìn)自身業(yè)務(wù),或?qū)?shù)據(jù)出售給其他公司。重組或分析這些可能具有商業(yè)價(jià)值的海量信息,只有掌握專業(yè)知識的數(shù)據(jù)科學(xué)(或數(shù)據(jù)挖掘)專業(yè)人士才能做得到。數(shù)據(jù)科學(xué)采用機(jī)器學(xué)習(xí)技術(shù)將數(shù)據(jù)轉(zhuǎn)化為模型,以便預(yù)測業(yè)務(wù)領(lǐng)域高度重視的特定實(shí)體的行為。這些算法和技術(shù)在當(dāng)今以技術(shù)為主導(dǎo)的業(yè)務(wù)領(lǐng)域是必不可少的。本書講解這些算法和技術(shù),并介紹如何將其部署到真實(shí)的商業(yè)環(huán)境。你將學(xué)到最常用的機(jī)器學(xué)習(xí)技術(shù),并有機(jī)會在一系列旨在提高商業(yè)智能的練習(xí)和應(yīng)用中使用它們。從本書學(xué)到的技能,可用于實(shí)際工作。為了充分掌握書中所討論的各個主題,我們希望你已熟悉Python編程語言、線性代數(shù)和統(tǒng)計(jì)方法。
網(wǎng)上有很多關(guān)于這些主題的教程和課程,但我們建議你閱讀Python官方文檔
(https://docs.python.org/) ,閱讀A. Bluman的Elementary Statistics以及由G. Casella和R. L. Berger合著的Statistical Inference ,理解主要的統(tǒng)計(jì)概念和方法。學(xué)習(xí)線性代數(shù),可閱讀G. Strang所寫的Linear Algebra and Its Applications
本章作為入門章節(jié),目的是讓你熟悉Python機(jī)器學(xué)習(xí)的專業(yè)人士所使用的更為高級的庫和工具,比如NumPy, pandas和matplotlib ,幫你掌握必要技術(shù)知識,以便實(shí)現(xiàn)后續(xù)章節(jié)的各種技術(shù)。講解本書所用庫之前,我們先來闡明機(jī)器學(xué)習(xí)領(lǐng)域的主要概念,并通過一個實(shí)例,展示在真實(shí)場景中機(jī)器學(xué)習(xí)算法如何給出有用的預(yù)測信息。
1.1機(jī)器學(xué)習(xí)常用概念
本書討論最常用的機(jī)器學(xué)習(xí)算法,并在練習(xí)中加以運(yùn)用,從而使你熟悉它們。為了解釋這些算法,幫你理解本書內(nèi)容,我們先大體看下幾個常用概念,后面會詳細(xì)介紹。
首先,若要為機(jī)器學(xué)習(xí)下定義,一個較為貼切的定義是,機(jī)器學(xué)習(xí)是計(jì)算機(jī)科學(xué)的一個分支,從模式識別、人工智能和計(jì)算學(xué)習(xí)理論發(fā)展而來。我們也可以將機(jī)器學(xué)習(xí)看作是數(shù)據(jù)挖掘工具,側(cè)重于用數(shù)據(jù)分析方法理解給定的數(shù)據(jù)。該學(xué)科的目的是,開發(fā)能夠從先前觀測的數(shù)據(jù),通過可調(diào)整的參數(shù)(通常為由雙精度數(shù)值組成的數(shù)組)進(jìn)行學(xué)習(xí)的程序,為了改善預(yù)測結(jié)果,將參數(shù)設(shè)計(jì)為可自動調(diào)整的。計(jì)算機(jī)用這種方式可預(yù)測某種行為,概括( generalize )數(shù)據(jù)的內(nèi)在結(jié)構(gòu),而不只是像常見的數(shù)據(jù)庫系統(tǒng)那樣對數(shù)值進(jìn)行排序(或檢索)。因此,機(jī)器學(xué)習(xí)跟計(jì)算統(tǒng)計(jì)11相關(guān),也是嘗試根據(jù)先前數(shù)據(jù)預(yù)測某種行為。機(jī)器學(xué)習(xí)方法常見的行業(yè)應(yīng)用有垃圾郵件過濾器、搜索引擎、光學(xué)字符識別(OCR )和計(jì)算機(jī)視覺。既已給出該學(xué)科的定義,我們接下來更詳細(xì)地介紹每種機(jī)器學(xué)習(xí)問題所用術(shù)語。
任何學(xué)習(xí)問題都始于一個包含n個樣本個體的數(shù)據(jù)集,未知數(shù)據(jù)的特性( properties )根據(jù)數(shù)據(jù)集來預(yù)測。每個個體通常包含一個以上的數(shù)值,因此它是一個向量。向量的組成元素[2叫作特征(feature )。例如,根據(jù)二手車的制造時間、顏色和能耗等車況信息預(yù)測其價(jià)格。二手車數(shù)據(jù)集中,每輛車表示成一個特征向量x(1),對應(yīng)這輛車的顏色、能耗等車況信息。每輛車還有一個與之對應(yīng)的目標(biāo)(或標(biāo)簽)變量y(i),即二手車的價(jià)格。一個訓(xùn)練樣例( training example )由一對(x(i), y()組成。由N個數(shù)據(jù)點(diǎn)組成、用于學(xué)習(xí)的整個集合叫作訓(xùn)練集(x(), y(i);=1..N,。符號x表示特征(輸入)值空間, y為目標(biāo)(輸出)值空間。為解決問題選用的機(jī)器學(xué)習(xí)算法用數(shù)學(xué)模型來描述,模型包含一些參數(shù),需在訓(xùn)練集上調(diào)試。訓(xùn)練完成后,模型的預(yù)測性能用另外兩個數(shù)據(jù)集來評估:驗(yàn)證集和訓(xùn)練集。驗(yàn)證集用來從多個模型中選擇能給出最佳結(jié)果的那個,測試集通常用來決定所選用模型的實(shí)際準(zhǔn)確率( precision ) [3],通常,數(shù)據(jù)集的50%劃作訓(xùn)練集,驗(yàn)證集和測試集則各使用25%的數(shù)據(jù)。
學(xué)習(xí)問題可分為兩大類(本書對這兩類均有大量介紹)。
無監(jiān)督學(xué)習(xí):給定的訓(xùn)練集只有作為輸入的特征向量x,而未給出任何相對應(yīng)的標(biāo)簽。該類學(xué)習(xí)的目標(biāo)通常為,用聚類算法找出數(shù)據(jù)中的相似樣例,或?qū)?shù)據(jù)從高維空間映射( project )到維數(shù)更少的空間(盲信號分離算法,比如主成分分析PCA )。因?yàn)槊總€訓(xùn)練樣例通常沒有目標(biāo)值,所以無法直接用訓(xùn)練數(shù)據(jù)評估模型的錯誤率;這就需要使用其他方法,評估簇內(nèi)元素的相似度以及簇間元素的差異程度。這是無監(jiān)督和有監(jiān)督學(xué)習(xí)的一個主要不同點(diǎn)。
有監(jiān)督學(xué)習(xí)[4] :給定訓(xùn)練集的每個個體是一對作為輸入的特征向量和標(biāo)簽。該類學(xué)習(xí)的任務(wù)是推斷各個參數(shù),預(yù)測測試數(shù)據(jù)的目標(biāo)值。這些問題可進(jìn)一步分為:
分類:數(shù)據(jù)的目標(biāo)值屬于兩個或以上類別,分類的目標(biāo)是學(xué)習(xí)如何預(yù)測訓(xùn)練集中未標(biāo)記的數(shù)據(jù)的
類別。分類是一種離散型(與之對應(yīng)的是連續(xù)型)有監(jiān)督學(xué)習(xí)方法,標(biāo)簽所代表的類別有限。手
寫體數(shù)字識別是分類問題的實(shí)際應(yīng)用,其目標(biāo)是將每個特征向量匹配到一組數(shù)量有限的離散型類
別中的某個類別。
回歸:標(biāo)簽為連續(xù)型變量。例如,根據(jù)孩子的年齡和體重預(yù)測身高就是一個回歸問題。
本書第2章集中介紹無監(jiān)督學(xué)習(xí)方法,第3章討論最常用的有監(jiān)督學(xué)習(xí)算法。第4章著手講解Web挖掘技術(shù),也可將其看作有監(jiān)督和無監(jiān)督方法。第5章講解推薦系統(tǒng),屬于有監(jiān)督學(xué)習(xí)范疇。第6章介紹DjangoWeb框架。第7章詳細(xì)介紹推薦系統(tǒng)(用到Django框架和第5章相關(guān)知識)的實(shí)現(xiàn)。我們以一個Django Web挖掘應(yīng)用實(shí)例結(jié)束本書,實(shí)現(xiàn)該應(yīng)用需使用從第4章學(xué)到的一些技術(shù)。學(xué)完本書,你應(yīng)該能夠理解不同的機(jī)器學(xué)習(xí)方法,并有能力將其部署到用Django實(shí)現(xiàn)的真實(shí)Web應(yīng)用。
本章接下來我們將給出一個實(shí)例,展示機(jī)器學(xué)習(xí)如何用于實(shí)際業(yè)務(wù)問題,還將給出Python庫( NumPy、pandas和matplotib )教程。只有掌握這些庫的用法,才能實(shí)現(xiàn)從后續(xù)章節(jié)學(xué)到的各種算法。
機(jī)器學(xué)習(xí)示例
為了進(jìn)一步解釋機(jī)器學(xué)習(xí)可以拿真實(shí)數(shù)據(jù)做什么,我們一起來看下面這個例子(下面的代碼可從作者的GitHub主頁該書的文件夾下找到,地址為
https://github.com/ai2010/machine
Learning_for_the_web/tree/master/chapter_1/。我們從UCI機(jī)器學(xué)習(xí)數(shù)據(jù)庫(
http://archive.ics.uci.edu/ )下載因特網(wǎng)廣告數(shù)據(jù)集( Internet Advertisements Data Set ,
http://archive.ics.uci.edu/ml/datasets/Internet+Advertisements )。這些Web廣告從各種各樣的網(wǎng)頁收集而來,每個網(wǎng)頁被轉(zhuǎn)換為一個特征向量,其元素為數(shù)值類型。從ad.names文件,我們可以看到前三個特征表示網(wǎng)頁中廣告圖像的尺寸,其他特征表示圖像的URL或在文本中出現(xiàn)了哪些特定詞語(共有1558個特征)。根據(jù)網(wǎng)頁中是否有廣告,標(biāo)簽的取值為ad或nonad,舉個例子,一個網(wǎng)頁在ad.data文件中是這么表示的:
125,125, ..., 1. 0, 1, o,ad.
根據(jù)這些數(shù)據(jù),一個經(jīng)典的機(jī)器學(xué)習(xí)任務(wù)是找到一個模型,預(yù)測哪些網(wǎng)頁是廣告,哪些不是廣告(分類)。首先來看一下包含全部特征向量和標(biāo)簽的ad.data文件,我們發(fā)現(xiàn)它包含一些用?表示的缺失值。我們可以用Python的pandas庫將?轉(zhuǎn)換為-1 ( pandas庫詳細(xì)教程見下節(jié)) :
讀入ad.data文件中的數(shù)據(jù),創(chuàng)建一個DataFrame對象,先把每個?替換為一個特殊的元素(replace函數(shù)) ,然后再替換為-1 (fillna函數(shù))。這樣每個標(biāo)簽都被轉(zhuǎn)換為數(shù)值類型元素(數(shù)據(jù)中的其他瘦身元素亦同) :
每個ad.標(biāo)簽轉(zhuǎn)換為1,而nonad.則被替換為0,所有的列(特征)需要是浮點(diǎn)型的數(shù)值(用astype函數(shù)將標(biāo)簽轉(zhuǎn)換為浮點(diǎn)型,在lambda函數(shù)中用to_numeric函數(shù)將d轉(zhuǎn)換為數(shù)值型)。
我們使用scikit-learn庫(見第3章)提供的支持向量機(jī)( Support Vector Machine , SVM )算法預(yù)測數(shù)據(jù)集中20%數(shù)據(jù)的標(biāo)簽。首先,將數(shù)據(jù)分為兩部分:訓(xùn)練集(80% )和測試集(20% ) :
上述代碼,執(zhí)行切分?jǐn)?shù)據(jù)集之前,用NumPy庫(教程見下一節(jié))封裝的函數(shù),打亂數(shù)據(jù)的順序
( random.shuffle函數(shù)) ,確保兩個數(shù)據(jù)集的各行數(shù)據(jù)是隨機(jī)選取的。切片操作中的-1,表示數(shù)組的最后一列不予考慮。
現(xiàn)在,我們用訓(xùn)練數(shù)據(jù)訓(xùn)練SVM模型:
我們聲明
一個SVM模型,指定參數(shù),并將模型賦給clf變量。調(diào)用fit函數(shù),用訓(xùn)練數(shù)據(jù)擬合(fit )模型(更多內(nèi)容見第3章)。預(yù)測20%測試數(shù)據(jù)的平均正確率( mean accuracy ) ,用score函數(shù)來計(jì)算,代碼如下:
運(yùn)行上述代碼(完整代碼見作者GitHub主頁chapter_1文件夾) ,得到92%的正確率,也就是說測試集標(biāo)簽的預(yù)測結(jié)果中, 92%的預(yù)測標(biāo)簽跟實(shí)際標(biāo)簽相同。這就是機(jī)器學(xué)習(xí)的威力所在:根據(jù)以往數(shù)據(jù),我們能夠推斷一個網(wǎng)頁是否包含廣告。為了實(shí)現(xiàn)預(yù)測功能,我們做了必要的準(zhǔn)備工作,用NumPy和pandas庫準(zhǔn)備和預(yù)處理數(shù)據(jù),然后用scikit-learn庫封裝的SVM算法處理清洗過的數(shù)據(jù)。鑒于本書將大量使用NumPy和pandas (有時也會用到matplotlib )庫,下面幾節(jié)將分別介紹這些庫的安裝方法以及用它們處理(甚至創(chuàng)建)數(shù)據(jù)的方法。
安裝和導(dǎo)入模塊(庫)
繼續(xù)討論這些庫之前,我們先講怎樣在Python中安裝模塊。常用的模塊安裝方法是,在終端使用pip命令:
然后,通常使用下述語句導(dǎo)入模塊:
其中, numpy是包名, np指代numpy ,做了這一步操作之后,該庫中的所有函數(shù)X都可以用np.X而不必用numpy.x訪問。本書從此往后假定所有的庫(scipy, scikit-learn, pandas, scrapy和nltk等)都用上面這種方式來安裝和導(dǎo)入。
本文節(jié)選自《機(jī)器學(xué)習(xí)Web應(yīng)用》
這是一本結(jié)合Python語言講述Web下機(jī)器學(xué)習(xí)的圖書,本書內(nèi)容全面,既能夠讓讀者熟悉最基本的機(jī)器學(xué)習(xí)的相關(guān)概念,也能夠了解Web下數(shù)據(jù)挖掘的工具和技術(shù),除此之外,書中還會介紹與Django框架有關(guān)的知識以及數(shù)據(jù)庫管理等內(nèi)容,幫助讀者掌握聚類和分類技術(shù)并用Python實(shí)現(xiàn)它們。
聯(lián)系客服