文科汪入門「機(jī)器學(xué)習(xí)」

這個(gè)標(biāo)題有點(diǎn)嘩眾取寵了。文科汪是不假,不過我有三年的移動(dòng)(iOS)開發(fā)經(jīng)驗(yàn)嫩实。

不過之前也沒有接觸過「機(jī)器學(xué)習(xí)」,所以也盡量深入淺出窥岩,希望真的是文科生也看得懂甲献。

學(xué)習(xí)資源簡介

機(jī)器學(xué)習(xí)的相關(guān)學(xué)習(xí)資料汗牛充棟,很多有意學(xué)習(xí)的朋友被淹沒在浩瀚的資料中颂翼,不明所以晃洒。因此,找到適合自己程度的資料是很關(guān)鍵的朦乏。

最近在coursera上學(xué)習(xí)了一個(gè)關(guān)于機(jī)器學(xué)習(xí)方面的入門課程Machine Learning Foundations: A Case Study Approach(機(jī)器學(xué)習(xí)基礎(chǔ):個(gè)案研究法)球及。是華盛頓大學(xué)的一門線上公開課。

這個(gè)課程的特別之處呻疹,是從具體的案例(項(xiàng)目)入手吃引,去介紹機(jī)器學(xué)習(xí)、深度學(xué)習(xí)。比起純講理論、晦澀難懂的課程,友好太多赢赊。(之前看吳恩達(dá)的機(jī)器學(xué)習(xí)課程,就沒有堅(jiān)持看完——我程度太低)吕粗。這個(gè)課程從以下5個(gè)案例(項(xiàng)目)展開,分別介紹相關(guān)理論知識(shí):

  • 預(yù)測房價(jià)(Predicting house prices)
    • 引出Regression(回歸)
  • 從產(chǎn)品評論中判斷買家態(tài)度(Analyzing the sentiment of product reviews)
    • 引出Classification(分類)
  • 檢索維基百科的文章(Retrieving Wikipedia articles)
    • 引出Clustering(聚類)
  • 推薦歌曲(Recommending songs)
    • 引出Collaborative fitering(協(xié)同過濾)
  • 利用深度學(xué)習(xí)給圖片分類(識(shí)別圖片)(Classifying images with deep learning)
    • 引出Deep learning(深度學(xué)習(xí))旭愧、Neural networks(神經(jīng)網(wǎng)絡(luò))

主要概念及環(huán)境搭建

什么是機(jī)器學(xué)習(xí)

「機(jī)器學(xué)習(xí)(Machine Learning)」這個(gè)詞颅筋,1959年由美國的計(jì)算機(jī)科學(xué)家Arthur Samuel提出。

但是看完維基百科晦澀的定義后输枯,也沒搞清楚「機(jī)器學(xué)習(xí)(Machine Learning)」的具體定義议泵。就用coursera課程中的一張流程圖來理解什么是機(jī)器學(xué)習(xí)。

機(jī)器學(xué)習(xí)示意圖

從這張流程圖可以看到桃熄,首先先口,要有數(shù)據(jù),把數(shù)據(jù)喂給某個(gè)算法(或者叫模型)進(jìn)行「學(xué)習(xí)」瞳收,使其具有解決某種問題的能力(智力)碉京,我把這個(gè)過程,理解為「機(jī)器學(xué)習(xí)」螟深。

以前的軟件谐宙,是程序員寫好一系列的規(guī)則,運(yùn)行的時(shí)候按照這些規(guī)則來執(zhí)行界弧、解決問題凡蜻。而軟件加入「機(jī)器學(xué)習(xí)」之后,可以從喂入的數(shù)據(jù)中發(fā)現(xiàn)規(guī)則垢箕、學(xué)習(xí)規(guī)則划栓,然后解決問題,這樣看起來舰讹,軟件就比以前顯得智能多了茅姜。

可以看到,數(shù)據(jù)是前提條件月匣,這也解釋了為什么「機(jī)器學(xué)習(xí)」在1959年提出,到現(xiàn)在才「火」起來奋姿,因?yàn)楝F(xiàn)在各行各業(yè)產(chǎn)生的數(shù)據(jù)锄开,都數(shù)字化了,產(chǎn)生了足夠多的數(shù)據(jù)來應(yīng)用到「機(jī)器學(xué)習(xí)」中称诗。

吳恩達(dá)在接受WSJ采訪是也說過類似的觀點(diǎn):

你所在的行業(yè)或者你關(guān)注的行業(yè)是否會(huì)受到AI的影響萍悴,這里有一個(gè)模式或許有用。首先:這個(gè)行業(yè)資料已數(shù)字化,意味著活動(dòng)流程轉(zhuǎn)移到計(jì)算機(jī)上癣诱。這就產(chǎn)生了數(shù)據(jù)计维,給了AI運(yùn)用數(shù)據(jù)更加智能化處理業(yè)務(wù)的機(jī)會(huì)。

什么是深度學(xué)習(xí)撕予,與機(jī)器學(xué)習(xí)的異同

「深度學(xué)習(xí)(Deep Learning)」鲫惶,首先,它還是屬于「機(jī)器學(xué)習(xí)」的范疇实抡,是一種特殊的「機(jī)器學(xué)習(xí)」欠母。接下來也是通過課程中的兩張圖來簡單理解(這是個(gè)人理解,并不一定準(zhǔn)確):

傳統(tǒng)的機(jī)器學(xué)習(xí)吆寨,特征是「線性」的

可以看到赏淌,上面這張圖,是傳統(tǒng)的「機(jī)器學(xué)習(xí)」過程:1.喂數(shù)據(jù)啄清;2.學(xué)習(xí)(訓(xùn)練模型/算法)六水;3.解決問題(這里解決的實(shí)際問題,是通過買家對產(chǎn)品的評論辣卒,判斷買家是正面評價(jià)還是負(fù)面評價(jià)——后面會(huì)詳細(xì)介紹)

傳統(tǒng)的「機(jī)器學(xué)習(xí)」掷贾,是直接抽取數(shù)據(jù)的某些「特征(屬性)」(這些「特征」被稱為是「線性」的),最終形成問題的解決方案添寺。

深度學(xué)習(xí)胯盯,基于「神經(jīng)網(wǎng)絡(luò)」,并利用「非線性特征」

而有些問題(課程舉例的是「XOR問題」)计露,不能通過傳統(tǒng)的「機(jī)器學(xué)習(xí)」解決博脑,也就是說不能直接從「線性」的「特征」得出問題的解決方案。

這時(shí)候票罐,「非線性特征(non-linear features)」提供了問題的解決方向叉趣,而「『神經(jīng)網(wǎng)絡(luò)(neural networks)』則提供了一種非線性的數(shù)據(jù)表現(xiàn)形式」。

如上圖该押,我們不能直接通過數(shù)據(jù)的「特征」(x1, x2)得到問題的答案疗杉,所以對數(shù)據(jù)的「特征」進(jìn)行多層次的變換,得到一些「非線性特征」(z1, z2)——「神經(jīng)網(wǎng)絡(luò)」中的一層——最終形成問題的解決方案蚕礼。

圖片中的這種數(shù)據(jù)結(jié)構(gòu)烟具,叫做「圖(graphs)」,「神經(jīng)網(wǎng)絡(luò)」就是用這種數(shù)據(jù)結(jié)構(gòu)來表示的奠蹬。圖片中的是一個(gè)3層的神經(jīng)網(wǎng)絡(luò)朝聋,中間還可以有若干層。

「神經(jīng)網(wǎng)絡(luò)」囤躁,本質(zhì)上就是對數(shù)據(jù)進(jìn)行多層次的變換冀痕。

綜上荔睹,我們把上面這個(gè)過程,叫做深度學(xué)習(xí)——個(gè)人理解言蛇。另外僻他,因?yàn)椤干疃葘W(xué)習(xí)」是構(gòu)建在「神經(jīng)網(wǎng)絡(luò)」基礎(chǔ)之上的,所以也有人將「深度學(xué)習(xí)」和「神經(jīng)網(wǎng)絡(luò)」等同起來腊尚。

備注:「深度學(xué)習(xí)」又叫「hierarchical learning(分層學(xué)習(xí)吨拗、多層次學(xué)習(xí))」,我覺得這種叫法更能直觀反映這個(gè)學(xué)習(xí)過程跟伏。

環(huán)境搭建及基本操作

Python

此課程使用編程語言Python(python的中文意思:大蟒蛇)

Python可以很方便地操作數(shù)據(jù)丢胚,并有很多第三方工具可供使用,讓你可以輕松構(gòu)建想要的應(yīng)用程序受扳。(R語言是另一種可供替代的語言)

iPython Notebook

Python的編程環(huán)境携龟。界面如下(操作系統(tǒng):macOS):

iPython Notebook的目錄界面——是在瀏覽器中打開的

GraphLab Creat和SFrame

GraphLab CreatSFrame都是Python下的應(yīng)用于「機(jī)器學(xué)習(xí)」的庫(框架)。用來處理大量數(shù)據(jù)勘高。

GraphLab Creat峡蟋,是Carlos Guestrin教授(此公開課的講師之一)在2009年寫的一個(gè)開源框架,最初用于機(jī)器學(xué)習(xí)华望,后被廣泛用于數(shù)據(jù)挖掘(data-mining)

Carlos Guestrin教授蕊蝗,在2013年創(chuàng)建了一間叫Turi的公司,以繼續(xù)GraphLab項(xiàng)目赖舟。這間公司在2016年8月5日被Apple以2億美金收購蓬戚。

安裝

環(huán)境安裝,不在此贅述宾抓,可以參考官網(wǎng):Install GraphLab Create(需要先注冊子漩,下載使用。免費(fèi)使用一年)

也在在線使用:Install GraphLab Create on AWS for Coursera Students

基本操作:

iPython Notebook的編程操作界面
  • 啟動(dòng)GraphLab Create:import graphlab

這樣石洗,就可以使用GraphLab Creat中的所有工具了幢泼,包括SFrame和將要用到的算法。

快捷鍵shift + enter 就可以跳到下一行(新建一行)讲衫。

  • 加載數(shù)據(jù)缕棵,支持多種格式的數(shù)據(jù),CSV(逗號(hào)分隔文件):sf = graphlab.SFrame('people-example.csv')

備注:people-example.csv文件要放在同一目錄下(people-example.csv文件涉兽,就是一個(gè)表格類型的數(shù)據(jù)文件)招驴。

  • 顯示數(shù)據(jù):sf 或者sf.head()。直接輸入變量名枷畏,接著敲Shift+回車忽匈,這樣就會(huì)顯示前面幾行了(一個(gè)表格)。顯示后面幾行數(shù)據(jù):sf.tail()
  • 可視化數(shù)據(jù):直接用show()函數(shù)矿辽,比如sf.show()即可用圖表方式查看數(shù)據(jù)丹允。這種情況下,圖表會(huì)顯示在一個(gè)新的頁面上袋倔。

如果想直接iPython Notebook中看到可視化的數(shù)據(jù)雕蔽,需要進(jìn)行如下設(shè)置graphlab.canvas.set_target('ipynb') 這樣就可以在當(dāng)前頁面看到可視化的數(shù)據(jù)了,無需跳轉(zhuǎn)到其他頁面宾娜。

sf['age'].show(view = 'Categorical')批狐,表示顯示「age」這一列,并以「分類排序(Categorical)」的形式顯示前塔。

  • 檢索數(shù)據(jù)

  • 查看某一列的數(shù)據(jù)sf['Country']

  • 計(jì)算某一列的平均值sf['age'].mean()

  • 查看某列的最大值sf['age'].max()

  • 創(chuàng)建新的一列:sf['Full Name'] = sf['First Name'] + '' + sf['Last Name']嚣艇。「Full Name」是新建列的名稱华弓,等號(hào)后面是新建列的內(nèi)容食零。

在機(jī)器學(xué)習(xí)中,經(jīng)常要將一些列進(jìn)行轉(zhuǎn)換寂屏,建成新的一列贰谣,這個(gè)過程叫做「feature engineering」。上面代碼迁霎,就增加了一個(gè)「Full Name」特征吱抚。

  • 一些運(yùn)算

  • sf['age'] + 2:age列年齡都加2

  • sf['age'] * sf['age']:age列年齡相乘

  • Apply()函數(shù),讓你不用for循環(huán)考廉,就能改變每一行(需要改變的)秘豹。(實(shí)現(xiàn):將Country列中的所有USA改為United States)

先編寫函數(shù)

def transform_country(country):
   if country == 'USA'
       return 'United States'
   else:
       return country

應(yīng)用函數(shù),并賦值給Country列(這樣昌粤,每一行的USA就都會(huì)轉(zhuǎn)換為United States了)

sf['Country'] = sf['Country'].apply(transform_country)

案例一:regression, linear regression(回歸既绕、線性回歸)

這個(gè)案例,和吳恩達(dá)課程中的一樣——預(yù)測房價(jià)婚苹。

假設(shè)我們有一組房子的數(shù)據(jù)岸更,包括房子面積、房價(jià)膊升、房間個(gè)數(shù)怎炊、洗手間個(gè)數(shù)等屬性。如何通過這些數(shù)據(jù)廓译,預(yù)測未知房子的房價(jià)评肆?

如何實(shí)現(xiàn)?

正常情況下非区,我們想到利用一個(gè)坐標(biāo)(Y軸是售價(jià)瓜挽,X軸是房子面積),然后把所有已知數(shù)據(jù)標(biāo)上去征绸,然后「輸入」你要預(yù)測房子的面積久橙,你就會(huì)在Y軸得到一個(gè)大概的價(jià)格俄占。如下圖:

利用坐標(biāo)軸預(yù)測房價(jià)

以上這種預(yù)測是簡單、原始淆衷、不精確的缸榄。這時(shí)我們聰明的科學(xué)家想到了另一種解決問題的途徑——利用統(tǒng)計(jì)學(xué)常用的分析數(shù)據(jù)的方法——「線性回歸」,利用方程式祝拯,得到一條線甚带,這樣會(huì)得到更為精確的結(jié)果。如下圖:

利用統(tǒng)計(jì)學(xué)的「線性回歸」預(yù)測房價(jià)

當(dāng)然佳头,這里問題就會(huì)變成:如何找到(「擬合」出)哪條最為精確的線鹰贵?其中會(huì)涉及「二次方程」、「Residual sum of squares(RSS)(殘差平方和/最小平方法)」等等概念康嘉,我們這里暫且忽略碉输,有興趣的可看課程詳細(xì)了解。

當(dāng)我們努力得出一條線(或者叫構(gòu)造了一個(gè)(預(yù)測房價(jià)的)模型)凄鼻,如何確認(rèn)這個(gè)模型的準(zhǔn)確性呢腊瑟?

這時(shí)候我們會(huì)把上面提到的那組真實(shí)的房價(jià)數(shù)據(jù),劃分為兩部分块蚌,一個(gè)叫訓(xùn)練集(training set)闰非,一個(gè)叫測試集test set。訓(xùn)練集用于訓(xùn)練模型峭范,測試集用于評價(jià)模型的準(zhǔn)確性财松,并根據(jù)測試結(jié)果,按需調(diào)整模型的參數(shù)纱控,使模型更準(zhǔn)確辆毡。

將已有的房價(jià)數(shù)據(jù),分為「訓(xùn)練集」和「測試集」

具體到代碼:

  • 將數(shù)據(jù)隨機(jī)分為訓(xùn)練集和測試集:

train_data, test_data = sales.random_split(.8, seed = 0)

  • 利用訓(xùn)練集構(gòu)建(訓(xùn)練)模型:
    predict_house_price_model = graphlab.linear_regression.create(train_data, target = 'price', features = ['sqft_living'])

可以看到甜害,利用GraphLab中l(wèi)inear_regression的create()函數(shù)舶掖,輸入訓(xùn)練集,即可構(gòu)建預(yù)測房價(jià)的模型尔店。非常方便眨攘。

另外,最后一個(gè)參數(shù)features嚣州,傳入的是一個(gè)數(shù)組鲫售,而現(xiàn)在,這個(gè)數(shù)組只有一個(gè)元素该肴,就是房子的面積情竹。為了獲取更精確的預(yù)測結(jié)果,我們可以加入更多的特征匀哄,比如房子的房間數(shù)量秦效,洗手間數(shù)量(課程中也有構(gòu)建一個(gè)多特征的預(yù)測模型雏蛮,并比較了兩個(gè)模型的誤差)。

  • 評估模型的準(zhǔn)確性:

predict_house_price_model.evaluate(test_data)

利用evaluate()函數(shù)棉安,輸入test_data作為參數(shù)底扳,即可評估模型的準(zhǔn)確性。

  • 預(yù)測某個(gè)房子的房價(jià)

predict_house_price_model.predict(house1)

所以贡耽,總結(jié)一下,把機(jī)器學(xué)習(xí)應(yīng)用到房價(jià)預(yù)測中的流程:

  • 拿到一組數(shù)據(jù)鹊汛,并將其劃分為「訓(xùn)練集」和「測試集」蒲赂;
  • 利用「線性回歸」方法,傳入「訓(xùn)練集」構(gòu)建一個(gè)預(yù)測房價(jià)的模型(俗稱「喂數(shù)據(jù)」)刁憋;
  • 利用「測試集」滥嘴,評估模型的準(zhǔn)確性(誤差)。并根據(jù)準(zhǔn)確性至耻,對模型進(jìn)行必要的調(diào)整若皱;
  • 應(yīng)用模型預(yù)測房價(jià)。

示意圖如下:

機(jī)器學(xué)習(xí)尘颓,令程序更「聰明」

案例二:Classification(分類)

案例二需要解決的問題是:如何從購物評論中走触,判斷這個(gè)評價(jià)是好評還是差評?

課程中疤苹,利用分類(Classification)來解決此類問題互广,示意圖如下:

利用「分類」解決問題

另外,「分類」可以判斷多種類型(比如判斷一篇文章是關(guān)于「體育」的卧土,「金融」的惫皱,還是「科技」的)。

「分類」的其他應(yīng)用領(lǐng)域:判斷郵件是否為垃圾郵件尤莺;判斷圖片屬于哪類型——其實(shí)就是我們熟知的圖片識(shí)別了(后面會(huì)介紹到)旅敷;判斷一個(gè)人的健康狀況……

Decision Boundary/決策邊界

因?yàn)椤阜诸悺箚栴}的數(shù)據(jù),是離散的(區(qū)別于預(yù)測房價(jià)的數(shù)據(jù)颤霎,是線形的)媳谁,所以會(huì)有一個(gè)Decision Boundary/決策邊界的術(shù)語,如下示意圖:

Boundary/決策邊界

你可以理解為捷绑,決策邊界上的評論韩脑,不是差評,也不是好評粹污。

因此段多,我們也把這種「分類器」,成為「線性分類器(Linear calssifiers)」

看看代碼:

  • 將數(shù)據(jù)隨機(jī)分為訓(xùn)練集和測試集:

train_data,test_data = products.random_split(.8, seed=0)

  • 利用訓(xùn)練集構(gòu)建(訓(xùn)練)模型:
sentiment_model = graphlab.logistic_classifier.create(train_data,
                                                    target='sentiment',
                                                  features=['word_count'],
                                            validation_set=test_data)

  • 評估模型:

sentiment_model.evaluate(test_data, metric='roc_curve')

  • 應(yīng)用模型:

sentiment_model.predict(giraffe_reviews, output_type='probability')

通過代碼可以看出壮吩,應(yīng)用機(jī)器學(xué)習(xí)解決分類問題进苍,和案例一中是相仿的加缘,都是利用「訓(xùn)練集」「喂」數(shù)據(jù)給模型,得出預(yù)測模型觉啊,并對其進(jìn)行調(diào)整拣宏,以提高其精確性;最后再應(yīng)用模型解決實(shí)際問題杠人。

案例三:Clustering(聚類)

這個(gè)案例要解決的問題是:查找相似的文章(想象你在手機(jī)看著一篇自己喜歡的文章勋乾,計(jì)算機(jī)要找相似的文章給你)。所以嗡善,問題就變成:檢索文章的相似度辑莫。

而本質(zhì)上,這其實(shí)是一個(gè)多元化分類問題(Multiclass classification problem)(課程介紹「分類」時(shí)有提及)罩引。

我們要把若干文章進(jìn)行分組——科學(xué)家用一個(gè)術(shù)語表示這個(gè)過程——「聚類(Clustering)」各吨。(分為體育新聞、世界新聞袁铐、娛樂新聞等等幾大類)

而區(qū)別于上面講的「線性回歸」揭蜒,「Clustering(聚類)」是一個(gè)「Unsupervised learning(無監(jiān)督學(xué)習(xí))」,因?yàn)槲覀兊倪\(yùn)算不需要任何(給定的)標(biāo)簽剔桨。

輸入:這里的Training Data是文檔屉更,文檔id,文檔文本等這些東西领炫。

輸出:模型輸出的是聚類標(biāo)簽(cluster label)

但是沒有Test Data驗(yàn)證模型的準(zhǔn)確性偶垮。所以依靠的是一個(gè)叫做「Voronoi tessellation/沃羅諾伊圖」這樣一個(gè)東西來做評估。

示意圖:

Clustering(聚類)

案例會(huì)引出「詞袋模型(Bag of words model)」帝洪、「tf-idf」似舵、「最鄰近搜索(Nearest neighbor search)」等等這些術(shù)語,都是應(yīng)用于檢索文章相似度的葱峡,有興趣可以看課程詳細(xì)章節(jié)砚哗。

看看代碼:

  • 為整個(gè)文集people增加一列word_count

people['word_count'] = graphlab.text_analytics.count_words(people['text'])

  • 利用tf_idf()函數(shù),得出tf_idf值

(暫時(shí)將tf_idf理解為一個(gè)「可以增加生僻詞砰奕、關(guān)鍵詞的權(quán)重蛛芥,使評估文檔相似性更加準(zhǔn)確」的算法)

tfidf = graphlab.text_analytics.tf_idf(people['word_count'])

  • 構(gòu)建Nearest neighbor search模型

(Nearest neighbor search算法的Output返回的是一個(gè)集合,包含最相似的文章)

knn_model = graphlab.nearest_neighbors.create(people, features = ['tfidf'], label = 'name')

  • 應(yīng)用模型(檢索到相似的文章)

knn_model.query(obama)

返回的結(jié)果類似如下:

與Barack Obama這篇文章「距離」越近的军援,表示文章相似度越高仅淑。

reference_label distance rank
Barack Obama 0.0 1
Joe Biden 0.794117647059 2
Joe Lieberman 0.794685990338 3
Kelly Ayotte 0.811989100817 4
Bill Clinton 0.813852813853 5

案例四:Collaborative Fitering(協(xié)同過濾)

這個(gè)案例要解決的問題是:制作一個(gè)商品推薦系統(tǒng),推薦使用者需要的商品胸哥。

課程給出了幾種解決方案:

  • Solution 0: Popularity

最簡單的解決方案:市面上流行什么涯竟,就推薦什么。

缺點(diǎn):不夠個(gè)性化。

  • Solution 1: Classification model

「分類」庐船,案例二介紹過的银酬。

利用用戶信息、購物歷史筐钟、商品信息等其他信息作為參數(shù)揩瞪,做一個(gè)二元「分類器(Classifier)」,判斷購物者是否會(huì)想購買此商品篓冲。

優(yōu)點(diǎn):可以做到個(gè)性化李破;可以將購物情景(節(jié)日等)作為特征考慮進(jìn)去……

缺點(diǎn):特征可能不可用。

  • Solution 2: People who bought this also bought...

這個(gè)方案纹因,利用一種叫做「協(xié)同過濾/Collaborative filtering」的方法為用戶做推薦喷屋,但前提是:有其他人的歷史購物記錄、產(chǎn)品推薦實(shí)例瞭恰、用戶和商品的一般化關(guān)系。

這個(gè)方法狱庇,引出了「協(xié)同矩陣/co-occurrence matrix」:保存了人們一同購買的產(chǎn)品的信息惊畏。

缺點(diǎn):沒有利用到用戶特征、商品特征密任;「冷啟動(dòng)(Cold start problem)問題」——就是一個(gè)新注冊用戶颜启,或者上架了一件新商品,沒辦法做推薦浪讳。

  • Solution 3: Discovering hidden structure by matrix factorization

這種方案缰盏,引入「矩陣因子分解(Matrix factorization)」這個(gè)方法,是一種推理方式淹遵。通過把這個(gè)矩陣因式分解的方式來逼近它自身口猜。

但是「Matrix factorization」還是沒辦法解決「Cold start problem」這個(gè)問題

所以,將各種模型結(jié)合起來提高性能的方法透揣,能超越任何一種單一模型所能達(dá)到的性能济炎,這是一種常見并且十分有效的技術(shù)。

看看代碼(構(gòu)建歌曲推薦系統(tǒng)):

  • 將數(shù)據(jù)隨機(jī)分為訓(xùn)練集和測試集:

train_data,test_data = song_data.random_split(.8,seed=0)

  • 利用訓(xùn)練集構(gòu)建一個(gè)簡單的推薦模型(根據(jù)流程程度來推薦)
popularity_model = graphlab.popularity_recommender.create(train_data,
                                                        user_id='user_id',
                                                        item_id='song')

  • 利用訓(xùn)練集構(gòu)建一個(gè)更具個(gè)性化的推薦模型
personalized_model = graphlab.item_similarity_recommender.create(train_data,
                                                               user_id='user_id',
                                                               item_id='song')

  • 應(yīng)用模型

personalized_model.recommend(users=[users[0]])

  • 比較兩個(gè)模型的表現(xiàn)
if graphlab.version[:3] >= "1.6":
   model_performance = graphlab.compare(test_data, [popularity_model, personalized_model], user_sample=0.05)
   graphlab.show_comparison(model_performance,[popularity_model, personalized_model])
else:
   %matplotlib inline
   model_performance = graphlab.recommender.util.compare_models(test_data, [popularity_model, personalized_model], user_sample=.05)

評估推薦模型的性能辐真,用一個(gè)叫做「precision recall curve(精度-召回率曲線)」來評價(jià)(橫軸是recall须尚,縱軸是precision)。

曲線和橫縱坐標(biāo)圍成的區(qū)域的面積越大侍咱,表現(xiàn)越好耐床。如下圖:

評估推薦系統(tǒng)的precision recall curve

可以看到,personalized_model的表現(xiàn)是比popularity_model表現(xiàn)好的楔脯。

案例五:Deep learning(深度學(xué)習(xí))

這個(gè)案例要解決的問題是:圖像識(shí)別——具體是「基于展示照片的相似度選購商品」撩轰。

上面「主要概念」已經(jīng)介紹過,有些問題利用傳統(tǒng)的機(jī)器學(xué)習(xí)無法解決(課程中的「XOR」問題做引子),換言之就是不能直接從「線性」的「特征」得出問題的解決方案钧敞。需要用到「非線性的數(shù)據(jù)表現(xiàn)形式/non-linear features」蜡豹,而「神經(jīng)網(wǎng)絡(luò)」,提供了一種非線性的數(shù)據(jù)表現(xiàn)形式/non-linear features溉苛。(示意圖見上面「主要概念介紹」)

第一個(gè)讓神經(jīng)網(wǎng)絡(luò)大顯身手的領(lǐng)域:計(jì)算機(jī)視覺——分析圖像和視頻镜廉。

計(jì)算機(jī)視覺中,「image feature」相當(dāng)于「local detector/局部探測器」愚战,這些「探測器」結(jié)合起來就能做出預(yù)測(圖像識(shí)別)

例子:識(shí)別一張人臉:鼻子探測器娇唯、左眼探測器、右眼探測器寂玲、嘴巴探測器……如果所有探測器都探測到對應(yīng)的東西塔插,就可以預(yù)測這是一張人臉。

但是實(shí)際中是沒有「鼻子探測器」這些東西的拓哟。實(shí)際是應(yīng)用「image feature」:collections of locally interesting points——Combined to bulid classifiers想许。就是一些局部特征探測器/detectors of local features。

在以前断序,這些局部特征探測器都是手工完成的(SIFT features)流纹。

而「神經(jīng)網(wǎng)絡(luò)」方法,可以自動(dòng)去發(fā)現(xiàn)和識(shí)別這些特征违诗∈「神經(jīng)網(wǎng)絡(luò)」在不同的層里,抓取圖像特征诸迟,做到自動(dòng)學(xué)習(xí)茸炒。(深度學(xué)習(xí)令人振奮之處,就是它能從圖片中學(xué)習(xí)一些非常復(fù)雜的特征——識(shí)別德國交通信號(hào)燈準(zhǔn)確率:99.5%阵苇;識(shí)別谷歌那些門牌號(hào)數(shù)字準(zhǔn)確率:97.8%)壁公。

「神經(jīng)網(wǎng)絡(luò)」的局限:

  • 需要大量精確的數(shù)據(jù)
  • 計(jì)算代價(jià)昂貴
  • 很難調(diào)整:因?yàn)樘鄬樱鄥?shù)慎玖,太太太復(fù)雜贮尖。(所以如果倉促把過多的選擇和計(jì)算開銷攪在一起,會(huì)很難搞清楚趁怔,到低哪個(gè)「神經(jīng)網(wǎng)絡(luò)」比較適用湿硝。)

為解決這一問題,引進(jìn)「深度特征/deep features」:能夠幫助我們建立「神經(jīng)網(wǎng)絡(luò)」——甚至你沒有很多數(shù)據(jù)的時(shí)候润努。

Deep features = Deep learning + Transfer learning(遷移學(xué)習(xí))

「深度特征」提供了一個(gè)很好的途徑关斜,讓我們在僅有很少數(shù)據(jù)的情況下,構(gòu)建高準(zhǔn)確率的預(yù)測模型(分類器)铺浇,如下示意圖:(代碼實(shí)踐中痢畜,圖像識(shí)別的準(zhǔn)確率,由47%提高到78%)

利用「深度特征」(遷移學(xué)習(xí))提高圖像識(shí)別準(zhǔn)確率

看看代碼:

  • 加載圖片數(shù)據(jù),將數(shù)據(jù)隨為訓(xùn)練集和測試集:
image_train = graphlab.SFrame('image_train_data/')
image_test = graphlab.SFrame('image_test_data/')

  • 利用訓(xùn)練集丁稀,用「原始的照片像素」構(gòu)建一個(gè)分類器模型(識(shí)別圖像):

注意:「feature」是「圖片像素」吼拥,并沒有用到「deep feature」

# 在sentiment analysis中有用過「logistic_classifier()」函數(shù)
# create:代表創(chuàng)造模型
# 參數(shù)1:訓(xùn)練集
# 參數(shù)2:目標(biāo)——數(shù)據(jù)集中l(wèi)abel那一列
# 參數(shù)3:會(huì)用到哪些特征(image_array保存的是數(shù)據(jù)的元素像素)
raw_piexl_model = graphlab.logistic_classifier.create(image_train, target = 'label',
                                                    features = ['image_array'])
# 上面的代碼表示:用原始的照片像素建立一個(gè)分類器

  • 應(yīng)用模型識(shí)別圖片:
# 利用原始像素模型預(yù)測前三張圖片(結(jié)果是三張都識(shí)別錯(cuò)了)
raw_piexl_model.predict(image_test[0:3])

  • 評估模型識(shí)別圖片的準(zhǔn)確率:
# 調(diào)用evaluate()函數(shù)評估模型的準(zhǔn)確率
raw_piexl_model.evaluate(image_test)

運(yùn)行后,可以看到'accuracy': 0.47825,线衫,只有48%左右的準(zhǔn)確率凿可,很不理想

  • 提取「深度特征(Deep features)」
# 用graphlab的load_model()函數(shù),載入一個(gè)deep_learning_model授账,這個(gè)是已經(jīng)訓(xùn)練好/pre-trained的了(載入即可)枯跑。
# 「imagenet_model」是模型載入的數(shù)據(jù),有150張照片白热,1000個(gè)標(biāo)簽敛助。
deep_learning_model = graphlab.load_model('imagenet_model')

# 在image_train中添加一列deep_features;
# extract_features()函數(shù)用來提取「深度特征/deep features」屋确,傳入的參數(shù)纳击,就是將提取出來的特征,要用到哪個(gè)數(shù)據(jù)集中攻臀。
image_train['deep_features'] = deep_learning_model.extract_features(image_train)

以上兩行代碼评疗,就是用來做「遷移學(xué)習(xí)/transfer learning」的(用網(wǎng)上訓(xùn)練的特征,應(yīng)用到image_train數(shù)據(jù)集中)

  • 利用訓(xùn)練集茵烈,用「深度特征」構(gòu)建(訓(xùn)練)模型:
# 構(gòu)建另一個(gè)有別于基于像素進(jìn)行預(yù)測的模型deep_features_model
# 也是用logistic_classifier的create()函數(shù)構(gòu)建
# 參數(shù)1:訓(xùn)練集
# 參數(shù)2:會(huì)用到哪些特征(deep_features是剛剛通過「遷移學(xué)習(xí)」得到的)
# 參數(shù)3:目標(biāo)——數(shù)據(jù)集中l(wèi)abel那一列
deep_features_model = graphlab.logistic_classifier.create(image_train,
                                                        features = ['deep_features'],
                                                        target = 'label')

  • 應(yīng)用deep_features_model識(shí)別圖片(3張都識(shí)別正確了):

deep_features_model.predict(image_test[0:3])

并且準(zhǔn)確率提高到'accuracy': 0.7765,,78%左右砌些。

篇幅有限呜投,此案例要解決的問題——「基于展示照片的相似度選購商品」,思路就是利用「最鄰近搜索(Nearest neighbor search)」算法(「聚類」中有涉及)存璃、「深度特征」構(gòu)建模型仑荐,再利用這個(gè)模型輸入圖片,就會(huì)輸出類似的圖片纵东。代碼可參考:tjaskula/Coursera粘招。

學(xué)識(shí)有限,課程中有很多概念偎球、方法也還沒有消化洒扎,謬誤在所難免,也不求你斧正了衰絮。權(quán)當(dāng)科普文一覽袍冷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市猫牡,隨后出現(xiàn)的幾起案子胡诗,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煌恢,死亡現(xiàn)場離奇詭異骇陈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瑰抵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門你雌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谍憔,你說我怎么就攤上這事匪蝙。” “怎么了习贫?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵逛球,是天一觀的道長。 經(jīng)常有香客問我苫昌,道長颤绕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任祟身,我火速辦了婚禮奥务,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袜硫。我一直安慰自己氯葬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布婉陷。 她就那樣靜靜地躺著帚称,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秽澳。 梳的紋絲不亂的頭發(fā)上闯睹,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音担神,去河邊找鬼楼吃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妄讯,可吹牛的內(nèi)容都是我干的孩锡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捞挥,長吁一口氣:“原來是場噩夢啊……” “哼浮创!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起砌函,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斩披,失蹤者是張志新(化名)和其女友劉穎溜族,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垦沉,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡煌抒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厕倍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寡壮。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖讹弯,靈堂內(nèi)的尸體忽然破棺而出况既,到底是詐尸還是另有隱情,我是刑警寧澤组民,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布棒仍,位于F島的核電站,受9級特大地震影響臭胜,放射性物質(zhì)發(fā)生泄漏莫其。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一耸三、第九天 我趴在偏房一處隱蔽的房頂上張望乱陡。 院中可真熱鬧,春花似錦仪壮、人聲如沸憨颠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烙心。三九已至,卻和暖如春乏沸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爪瓜。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工蹬跃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铆铆。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓蝶缀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親薄货。 傳聞我的和親對象是個(gè)殘疾皇子翁都,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容