fbpx
Python初學程式機器學習

Python機器學習EP. 5 訓練跟測試的過程

哈囉,大家好,我是Teresa,上週的筆記提到機器學習似乎不可行,但當統計上的資料還有演算法的選擇是「有限」個時,機器學習還是可行的。 那到底為什麼機器學習可以學到東西?當假說函式集合是無限大的時候,到底會發生什麼事情? 複習機器學習的流程圖,一開始從資料出發,有一個機器學習的演算法,透過資料和它所看到的假說集合,從裡面選擇一個最終的假說函式。 上次加了一個假設是:我們訓練的資料跟最後測試假說的方法都來自同一個分配。 Ein是指在資料上假說的表現;Eout是指未來我們還沒有看過的資料在假說上的表現,我們用同一個分配來描述。 一、假說函數不多的情況 假如假說函式集合不多、資料量又夠多,不管演算法怎麼選擇假說,Ein跟Eout兩者的表現都會長得很像。如果都長得很像,那我們當然要選擇一個Ein最低的,很接近0。因為如果Ein很接近0,那個Eout很大概率機率會很接近0,這樣就達到了學習的效果。 從上述的說明中,機器學習可以分成兩個步驟: 第一個步驟是訓練,訓練是指演算法在跑的時候,我們要確保資料上的表現(Ein)很接近0。 但訓練還不夠,我們要確保這個假說函式在測試未來未知的資料上,Ein跟Eout也很接近。 二、回顧一下,前四集筆記中我們學到的概念: Ep. 1:提到機器學習想做的事情是有個未知的目標函式,希望演算法能找到假說函式,能和目標函式非常接近,錯誤率要越小越好,(也就是Eout要很接近0)。 Ep. 2:希望機器學習在我們已知的資料上做的盡量好就好,(也就是Ein要很接近0)。 Ep. 3:機器學習是在很特定的設定下做,像是批次的資料、監督式學習、二元分類。 Ep. 4:在假說函式有限個的狀況下,Ein跟Eout會很接近。 機器學習實際上拆成兩個問題: 第一個問題是Ein跟Eout會不會很接近? 第二個問題是如果第一個問題成立,怎麼讓Ein越小越好。 三、假說函式集合有限的數量 那在假說函式集合有限的情況下,這個有限的數量(M)是多少,跟這兩個問題有什麼關係? 這個數量M有兩種可能性,一種是相對小的數字,另一種是相對大的數字。…
Teresa
January 13, 2021
Python初學程式機器學習

Python機器學習EP. 4 機器學習是不是可行的呢?

前言 大家好,我是Teresa,這集的學習筆記是要讓大家思考機器學習到底可不可行?那就讓我們開始吧! 先來做個小測驗吧!若給你以下六張圖,它們分別被歸類為-1或+1,若再給你第七張圖,請你觀察前六張圖片來給定一個規則,你會將第七張圖歸類為+1或-1呢? 若你的答案是+1,其實答案是+1,因為前三張圖片的最左上角都是黑色的,後三張圖片的左上角是白色的,因此這題的規則是左上角的格子若是黑色就是-1,若是白色就是+1。回到第七張圖,它左上角是黑色的,因此答案是-1。 若你的答案是 -1,其實答案是+1,因為前三張圖片沒有對稱,後三張圖都是對稱的,因此這題的規則是有對稱的為+1,沒有對稱的為-1。回到第七張圖,它是有對稱的圖形,因此答案是+1。 其實還有更多隱藏的規則。發現了嗎?不同人所看到的規則都不同,因此不管你說的答案是哪個,都可能是錯誤的。這樣看起來機器學習是不是不可行呢? 如果從數學的角度來看另一個例子,若有3個位置而每個位置都只能有0或1,給定五筆資料,那你會怎麼決定這題的函式g呢? 輸入 輸出 0, 0, 0 +1 0, 0, 1 -1 0, 1, 0 -1 0, 1, 1…
Teresa
January 9, 2021
AlgorithmPython初學程式機器學習

Python機器學習EP. 2 感知器perceptron learning algorithm

哈囉,各位好,我是Teresa,本集的重點是二元分類問題,會說明感知器以及PLA演算法。以下先讓我們回顧上集說了什麼吧~ EP.1回顧 在機器學習中,為了找到一個最適合的假說,存在著演算法(Learning Algorithm A)和假說集合(Hypothesis Set H)。演算法A 從大量資料集合D 進行觀察,接著從假說集合H 中挑選一個最符合我們期望的函式g。 上集提到的例子是如果銀行想要做出一個機器學習來判斷:當客戶申請核發信用卡時,銀行應不應該發卡給該客戶。由這個例子我們可以清楚的知道此機器學習需要提供的答案只有兩種:發卡或是不發卡。這類型的問題我們可以稱為二元分類問題。從客戶提交的申請資料x中經過函式g,來得到y(發卡)或是n(不發卡)的結果。 完整筆記可點此連結 感知器假設集(Perceptron Hypothesis Set) 銀行從過往的經驗中掌握了客戶的屬性資料,如:性別、年齡、職業、薪資、信用狀況......。這些資料都可以轉換成以下式子。 銀行也能針對這些屬性資料進行重要性的排序,給予權重,例如:薪資權重給2,信用狀況如是負債權重給-1等等。 銀行會設立一個門檻值T(threshold),當上述條件的總分大於門檻值,才會發卡給客戶,反之,則不發卡。雖然有機率總分會剛好等於門檻值,但機率非常小,可忽略不管。 為了方便識別,我們將輸出的結果y(發卡、不發卡、忽略不計)轉為符號表示,這樣的符號在機器學習裡被稱為label。 從算式中,我們很難直接知道畫面看起來是什麼樣子,如果應用在二維平面上,會如下圖,有一條直線將畫面切割成兩個平面,而資料中的點會落在線的兩側,一側為正;一側為負。而機器學習所期望的目標便是找出一條直線,能將不同的label正確劃分在兩個平面上。這樣的感知器便被稱作二元線性分類器(Linear Binary Classifiers)。 (圖片來源:課程截圖) 感知器學習演算法(PLA) 感知器中的所有集合H,代表了平面上許多不同條的直線。…
Teresa
December 29, 2020
Python初學程式機器學習

Python機器學習EP. 3 機器學習的不同問題

哈囉,大家好,我是Teresa,這集的重點會在機器學習所要解決的問題依照不同的面向分類有哪些種類。如下圖,依照機器學習的不同問題,大致可以區分成四種面向:輸出的空間、資料的標記種類、輸入的資料、給電腦資料的方式,依照四種面向來一一詳述吧! 一、根據輸出的空間不同 二元分類 Binary Classification: 二元分類的問題其實就像是非題,我們餵給機器的資料,經過假說的函式後僅會輸出是或否的兩種結果,以圖來表示的話便是將平面區分為兩個平面以表示是或否。 二元分類在機器學習當中是很基本、很核心的問題。是非題的應用相當廣泛,之後理論推導與實際的演算法都會由二元分類出發。 二元分類的應用如下: 信用卡核發(回顧上集) 垃圾郵件分類->是垃圾郵件或不是垃圾郵件 醫療上的診斷->生病或未生病 預算的投入->獲益或不獲益 答題->正確或不正確 多元分類 Multi-class classification: 輸出從原本二元分類中的是或否兩種結果,變為有多種結果,近似於單選題。多個選項經過假說的函式後會輸出其中的一種結果,常用在視覺或聽覺辨識。 多元分類的應用如下: 銅板分類(1元、5元、10元、50元) 數字辨識->郵遞區號辨識(0-9) 圖片辨識->動物、水果分類 郵件分類->垃圾郵件、促銷活動、重要的郵件等 迴歸分析 Regression: 輸出的標籤不同於其它分類問題為零散的值,迴歸問題的輸出值會是一個連續的範圍。…
Teresa
December 28, 2020
Python初學程式機器學習

Python機器學習EP. 1 初步認識機器學習

前言 大家好,我是Teresa,前陣子因為一場線上小聚,讓我開始正式接觸機器學習,參與前和參與後都順手寫了一篇文章,連結在此附上,在開始閱讀此篇之前,可以先看看你有沒有理解文章中提到的概念。 機器學習從零開始-簡單認識基礎概念 | Teresa初學者筆記 機器學習的介紹與應用-Python主題小聚直播回顧 總之,在這場線上小聚過後,Teresa就決定要更深入的接觸機器學習,於是在Coursera上找了一堂基礎的機器學習線上課程,之後的筆記都會環繞在這堂課上,那就讓我們開始吧! 每一個機器學習的使用者應該要知道什麼? 哲學上機器學習的思想 數學上的工具 演算法的設計 它們的使用:包含什麼時候可以使用、為什麼可以使用、如何使用、如何會變得更好 什麼時候可以使用機器學習? 在了解什麼時候可以使用機器學習之前,不妨先思考看看什麼是「學習」? 以人類的角度,學習會從「觀察」出發(通過我們的五感)進而學習「轉化」成一項技巧 因此機器學習便是用電腦做為「學習主體」來「模擬」人類學習的過程 Note:觀察(資料)->機器學習(演算法)->技巧 技巧指的是「增進」某一方面的表現。 結論:機器學習的過程是從資料出發經過電腦的計算最終得到某種表現的增進。 若你想達成上述的目的,便可以使用機器學習。 為什麼要使用機器學習? 當我們遇到一個問題想要用程式解決的時候,有些問題單靠人力試圖將規則一項一項的條列出來是非常困難的。 舉例來說:如何辨識一棵樹?我們很難用語句完整地把每一項樹的特徵描述出來。 因此,我們讓機器透過「觀察」來分析辨識。 機器學習的應用…
Teresa
December 2, 2020
Python初學程式程式新手

Python初學總整理 第9講:Numpy函式庫

嗨,大家好,我是Teresa,這集想來和大家介紹在資料分析、機器學習領域中很經典、必定會用到的函式庫-Numpy,目的主要是做數據的處理,但內容不會涉及統計的理論和延伸,只會做一些基礎的功能介紹和簡易的實作程式碼提供給大家。 什麼是Numpy? Numpy是一個免費且開源的Python函式庫,專門用來處理陣列,由Travis Oliphant於2005年創建,但Numpy的前身是Numeric,是由Jim Hugunin和其他協作者共同開發,Numpy結合另一個同性質程式庫Numarray的特色,並加入了其他擴充功能。原始碼在這個網站中:https://github.com/numpy/numpy 為什麼使用Numpy? 在Python中,我們也有list來存放清單,但其實處理速度很慢,Numpy處理陣列的速度比list快50倍。原因是Numpy會將資料儲存在記憶體中的一個連續位置,可以高效率的找到他們的位置、並使用資料。 安裝Numpy pip install numpy import numpy #測試程式碼 arr = numpy.array() print(arr) #如果覺得每次都要輸入numpy很麻煩,在匯入的時候可以輸入: import numpy as np arr =…
Teresa
November 11, 2020
Python初學程式程式新手

Python初學總整理 第8講:Matplotlib套件

嗨~各位好,我是Teresa,這集想要和大家介紹Python中實用的套件-Matplotlib,原因是如果心中有個想法想要去實踐,雖然有資料,但需要說服夥伴的話,將你手中擁有的數據轉為圖表是很重要的,這樣一來,你說的話有說服力,觀看者也能簡單易懂。那我們就開始吧! 什麼是Matplotlib? Matplotllib是Python的視覺化套件,可將資料視覺化,也可以稱做繪圖庫,可以和NumPy一起使用。它是由約翰.亨利所創造的,不但開源,且各個平台間也具相容性。Matplotllib的代碼庫在此 github。 如何使用Matplotlib? 要開始使用Matplotlib,就如同其他模組和套件一般,要先安裝並匯入。 pip install matplotlib #安裝 Matplotlib import matplotlib import matplotlib.pyplot as plt #匯入Pyplot 套件並命名為plt 安裝成功後就可以畫圖囉! 繪製 x 和 y點 import…
Teresa
November 11, 2020
直播筆記

Python網頁爬蟲—將資料存到SQLite資料庫

任務:把上週爬取每週文章的標題和發佈日期存到SQLite資料庫 前言 用Python網頁爬蟲取得資料後,最後一個步驟,會想把資料存到資料庫裡,今天以SQLite為例分享實作部分。 為什麼我要用SQLite? SQLite是非常輕量型的關聯式資料庫,所以比較適用於小型應用程式,比如APP,存放資料量沒那麼大的應用程式,也是跨平台資料庫,它和一般企業級資料庫(Mysql......),最不一樣的地方是企業級資料庫都會有server,server也就是資料庫,用戶端這邊通常就要安裝,這個資料庫的客戶端,有點像是小的驅動程式,那我們要存取資料庫的時候,就是要用客戶端去跟資料庫的server進行存取還有資料的操作。那SQLite資料庫非常簡單,就是安裝後,用戶端就可以直接執行,可以直接存取資料庫裡面的資料,簡單來講,一個資料庫就是一個檔案,雖然輕量型,但大部分.sql的語法都有支援,而且也是一個免費的資料庫。 第一步驟:安裝DB Browser for SQLite,用這個工具去建立資料庫 建立一個資料庫,然後在資料庫裡建立一個資料表,命名為post。在資料表裡定義儲存的欄位。先建立一個title的欄位,它的類型是text(字串),再建立一個來存發布日期的欄位publish,一樣定義類型是text(字串) 在爬蟲專案資料夾底下新建資料庫,存檔 第二步驟:使用python串列的資料結構來進行儲存,把資料打包成包裹 定義result串列,每次爬到標題和發佈日期後,就要把它存起來,存到串列裡。👩🏻‍💻results.append((title.getText().strip(),) + (published.getText().strip(),)) 把每一篇文章的標題和發佈日期打包成元組(tuple),如果只有一個值最後要加逗點,這樣python才知道這是一個元組(tuple) 把標題和發佈日期加入串列裡面(results.append),append是加入的意思(有for就會把每次標題和發佈日期全部都加入串列裡) 🔍元組的賦值:a,b = 1, 2 第三步驟:寫入sq資料庫 sq資料庫內建在python裡面,直接👩🏻‍💻import sqlite3這個模組,接下來把網頁爬蟲專案連結到資料庫,用👩🏻‍💻conn =…
amyamy
November 10, 2020
直播筆記

Python網頁爬蟲—開發你的第一個網頁爬蟲

任務:爬取INSIDE硬塞網路趨勢觀察網站的文章標題和發布日期 第一步驟:安裝3個套件 request:發送請求到伺服端 beautifulsoup:解析伺服端回傳的網頁內容,也就是網頁原始碼。裡面內建的html解析套件,所分析出來的網頁原始碼有時候沒那麼準確,所以建議大家用lsml套件 lxml:解析xml、html原始碼的強大套件,解析出來的內容相對準確 第二步驟:網頁內容html原始碼的分析 在要爬取的地方按下滑鼠右鍵>檢查,chrome瀏覽器就會開啟開發人員工具,當你滑鼠停在哪邊它就會變色,這就是你在網頁上的位置 要爬取「INSIDE硬塞網路趨勢觀察網站」文章標題:它的網頁原始碼是h3,它的class是post_title,那等下要爬取時就是用h3這個html的標籤,而且它的class是post_title,這樣就可以定位到這個網頁的所有文章標題 要爬取「INSIDE硬塞網路趨勢觀察網站」發布日期:它的位置是hli的標籤,它的class是post_date的標籤,所以等下定位的時候,就是利用這個方式進行定位 第三步驟:以visual studio code為例開發網頁爬蟲 建立demo的資料夾 在資料夾底下建立scraper.py的檔案(python的檔案) 引入所需要的套件: beautifulsoup request:發送請求到網頁伺服端 get:去查詢網址的網頁內容,括號內寫入要傳的網頁網址,發送請求給伺服端後,它就會把這個網址的網頁內容回傳給我們,所以回傳給我們就要利用一個變數把它接起來(response) 用print的方式來看一下這個網頁的內容➡️回傳html原始碼,上面都帶有資料 第四步驟:把資料丟到beautifulsoup裡面請它幫我們解析 建立一個beautifulsoup套件,把剛剛所得到的網頁原始碼,丟給它來建立一個soup物件,有這個soup物件我們就能利用它來進行元素的定位。beautifulsoup要指定一個解析器來幫助它解析html原始碼,所以後面要加lxml 【爬取文章標題】 首先要取到一整頁文章的標題,所以就可以用find取得文章的標題,丟給它建立一個soup套件。在第二步驟有看到這個網頁上的標題標籤是h3,class是post_title的類別,同樣用個變數接起來(title)。➡️取得一個文章標題。(若不想要這些html的標籤,就可以用beautifulsoup的getText的方法把html的標籤給去掉) 如果想要抓到多篇文章,就要寫find_all,找到所有只要標籤是h3、類別是post_title的標題,這時候print出來的東西➡️是一個串列包含多個文章,所以要用for迴圈的方式來讀取每一個標題的元素,再一一利用getText的方法把html的標籤給去掉(不喜歡空白可以用strip把空白清掉)➡️爬取所有文章標題 【爬取發布日期】…
amyamy
November 3, 2020
直播筆記

網頁爬蟲五個基本觀念

網頁爬蟲是網頁機器人,可以自動化模擬使用者,依照特定的模式與規則,爬取網頁的背後原始碼,就可以解析取得想要的資料,不一定要使用python才能實作,其他像java、C++、javascript,也可以開發,但python的語法比較簡潔,也有比較成熟的框架或套件可以使用,所以大部分通常使用python來開發。 網路的架構主要分用戶端(電腦、手機、平板)和伺服端。比如說,在瀏覽博客來網頁時,通常會點擊網頁來了解書本詳細內容,點擊動作背後會請求網址,這個網址就會回傳博客來伺服器,博客來收到這段網址的時候就會知道這個使用者想要看的書本內容是哪個網頁,它收到後就會開始處理,把網頁的原始碼內容回傳給用戶端,用戶端經過瀏覽器解析來顯示我們看到網頁的樣子。 兩個開發網頁爬蟲重要觀念:請求方法、等待回應 有兩個開發網頁爬蟲需要特別注意的地方,第一是請求方法,第二就是等待回應,用戶端如果要看網頁就是請求一個網址到伺服端,那請求方法分成:get(查詢)、post(新增)、put(修改)、delete(刪除),因為開發網頁爬蟲時是想查詢這個網址的網頁內容是什麼,通常都是使用get(查詢)來跟伺服端溝通。然後就是等待回應,要特別注意的地方是,伺服端不會馬上回應,會等待一些時間,如果等待回應的機制沒有處理好就開始進行爬取,可能在爬取時爬不到任何東西,可能是伺服端還沒處理完,原始碼也還沒到用戶端,所以在爬取時就爬不到任何東西,所以等待回應機制非常重要,通常有三種等待機制:sleep(強制等待)、implicit wait(隱式等待)、explicit wait(顯示等待)。sleep(強制等待)就是強迫網頁爬蟲暫停一定秒數;implicit wait(隱式等待)就是設定最長等待時間,但若伺服端提早處理完成,網頁爬蟲就不會等滿時間,直接往下執行;explicit wait(顯示等待)就是明確指定等待網頁上某個區塊、元件只要網頁原始碼處理完成,就算其他還沒載入完成,但要等的那個區塊已完成就會往下執行。這三個等待機制可以視情況來使用,若三個等待機制能處理適當,會提高爬蟲爬取效率。 三個常見的套件及框架:beautiful soup、selenium、scrapy 伺服端回應給用戶端的網頁原始碼是由許多標籤和標籤所形成的元素構成的,瀏覽器會知道它的擺放位置,是因為網頁是個階層結構。但要爬取的資料不是標籤,這時候就需要套件或框架來協助定位元素和去掉標籤。基本上使用python來開發網頁爬蟲時常見的有三種套件,分別有beautiful soup、selenium、scrapy。 beautiful soup對HTML及、XML的解析非常友善,容易入門,但只適用於靜態類型的網頁。現在有許多社群平台(ex. FB、IG)、電子商務網站,通常會透過滾動捲軸的方式讓網頁載入更多資料,beautiful soup就無法達到。這種情形就需要搭配selenium套件來進行爬取,因為selenium套件被用來設計進行網頁自動化測試,所以可以很實際模擬人類操作瀏覽器的動作,例如:開啟瀏覽器、滾動捲軸、輸入帳密或是點擊查詢按鈕等等,要爬取這樣的網站的話就非常適合搭配selenium套件進行操作,它最大特色是可以搭配javascript,所以才可以自動化滾動捲軸,讓網頁自動化載入更多的網頁內容進行爬取。scrapy框架比較適合大型爬蟲專案,因為他能夠爬取大量資料、具有非同步的功能,速度比較快、有效率,對於初學者來說會需要一段時間來學習。 最常見的網頁爬蟲開發流程 謝謝這週二下班讀書會的講師Mike,以下是他提供的相關學習資源:
amyamy
October 23, 2020