跳到主要內容

初學 Python 與 Machine Learning 心得


by Vanessa Wang   歡迎支持我的臉書專頁:【工程師作家的轉職人生



   就算完全沒有寫過 code 的人,一定也聽過 AI(人工智能)、Machine Learning(機器學習)、Python 等這些這幾年很夯的字眼。但你知道這些名詞是什麼意思嗎?

   因為我也很好奇,於是我最近上了 Udemy 這門 Complete Python Developer in 2024: Zero to Mastery。平時我工作用的語言是 JavaScript,但 Python 已被許多人列為當今最受歡迎的程式語言,因此我一直很有興趣知道,究竟為何愈來愈多人要學 Python?今天就是要分享我的初學心得。

   我是 Complete Python Developer in 2024: Zero to Mastery 這門課的老師的常客,上過許多門他不同的課程。他的課的特色是便宜、內容豐富完整(30+ 小時的紮實課程)、用淺顯易懂的語言讓門外漢理解程式背後的邏輯理論,最重要的是非常著重實作的手把手教學。這個教學風格非常合我胃口,因為我就是一個喜歡實作的人:與其跟我說一大堆烹飪博大精深的理論,不如先教我怎麼把水煮開、煮出一顆水煮蛋吧!這篇將分享我照著課程影片用 machine learning 做出一個簡單的模型、能夠分辨三種不同的鳶尾花。這大概相當於機器學習世界的一顆水煮蛋吧!

   先來說說 Machine Learning 到底是什麼。這幾天我很有興致地趕課程進度、看了許多課程影片,終於了解 Machine Learning 是什麼了:簡單地說,我從我即將兩歲的女兒學習到,嬰兒就是最好的 Machine Learning 例子。

   我女兒現在很會認人:給她看我十幾年前的照片她也會叫媽媽,非常給面子。給她看她自己的照片,就算是一年前嫩嬰的樣子,她也知道是她自己。因為人人都說女兒長得像我,我就找出一些我小時候的照片給她看。我自己是覺得我小時候的模樣跟女兒真的像極了,想說魚目混珠放在她的照片裡她應該也覺得是她自己吧!但女兒很聰明,指著我的照片說「不是!」不管我們多相似,她很清楚那不是她自己。

   我們從來沒有教過女兒怎麼分辨自己的臉;我們從來不跟她說「臉頰胖胖的就是妳」或者「有個小酒窩的就是妳」。我們只是一直給女兒看不同人的臉、讓她照鏡子,教她「這是妳!」、「這不是妳!」,經過日積月累她 24 個月的人生,她自己不知如何地就學會了怎麼分辨誰是自己、誰是別人。這,就是 Machine Learning。

    Machine Learning 的精髓就在於,科學家發現即使你費盡千辛萬苦教電腦辨認某人的臉,跟電腦說「你要找一個臉頰胖胖、有酒窩、頭髮微捲的人」,就算你把所有想得到的條件都附上(鼻子 4公分、睫毛 3 公分、鼻梁右側有一顆痣....)電腦還是學不好,因為它可能找出一個「臉頰胖胖、有酒窩、頭髮微捲」的小男孩、可能找出一隻「鼻子 4公分、睫毛 3 公分、鼻梁右側有一顆痣」的猩猩...這些都是可能的。因此不如給電腦大量大量的資料(例如很多很多我女兒的照片),然後跟電腦說「這是她」、「這不是她」、「這不是她」、「這是她」,讓電腦自己去找出規則、自己歸納、辨識。

   而 Python 之所以夯,很大的原因在於它是當今最方便於做數據分析、機器學習的程式語言(原因可參考這篇 Why is Python the Best-Suited Programming Language for Machine Learning?
)。我今天便跟著Udemy 課程淺嚐以 Python 做很初淺的機器學習:我做出一個能辨別三種不同的鳶尾花的模型。


   讓我解釋一下這個模型在幹嘛:如上圖,這世界上存在著三種不同的鳶尾花,一個叫 iris virginica、一個叫 iris versicolor、一個叫 iris setosa。我們用肉眼看圖看得出來這三種花長得不一樣;今天若摘一朵鳶尾花給我,我可以立刻分辨、歸類它是 virginica、versicolor 或 setosa,但電腦怎麼知道哪個是哪個呢?

   運用機器學習,我們訓練電腦分辨這三種花的方法,就跟我們訓練女兒認人臉的方法是一樣的:餵給電腦一大堆不同鳶尾花的資料(例如花瓣長度、色澤等等),然後跟電腦說「這朵花是 virginica」、「這朵花是 versicolor」、「這朵是 setosa」,讓電腦透過大量數據自己去寫出能準確辨別這三種花的模型。

   你問做這個幹嘛呢?分辨三種不同的花有什麼重要性?機器學習可以應用的範圍無遠弗屆,例如你可以把看電視的群眾大量的資料餵給電腦,經由 machine learning 久了Netflix 就知道「原來只要住在這區、這年齡的人就喜歡看這樣的電影」然後 Netflix 就能準確地推薦影集給用戶看。同理 Facebook 透過蒐集大量用戶個資就會知道要給妳看什麼樣的廣告...因此 machine learning 商機無窮。

   你看到我做出這個模型寫了一些 code,看起來好像有點厲害,是不是覺得這很難做?其實不然,因為 Python 已開發出很多 libraries 讓我們可以使用,因此很多時候我們只要按照說明書使用這些別人已經辛苦開發出來的工具就可以了。這就像是我們若要煮一頓晚餐,並不需要重頭研發新菜色,看看食譜按照別人已經成功過的方法依樣畫葫蘆就好了。而這門課的手把手教學,確實讓我很簡單地跟著步驟做出這個看似蠻厲害的模型。

   事實上工程界很多時候都是這樣,像以前我讀土木工程,很多時候都是要運用所謂的「經驗公式」,運用前人研發出來的結果就好,不用自己從零開始(因為人的壽命有限,若不站在巨人的肩膀上文明是無法前進的)。


若想要上稍微進階一點的機器學習、資料科學課程,可以上同樣這個老師另一門課:

  

延伸閱讀:

女生當工程師比較難嘛?
想學寫程式的我,是否太笨了?(探討先天條件 v.s. 後天努力)
自學轉行軟體工程師到底有多難?
如何選擇職業
      

by Vanessa Wang   歡迎支持我的臉書專頁:【工程師作家的轉職人生


留言

  1. 真的謝謝作者推薦這門課,受用無窮,沒想過從一個門外漢沒有任何基礎也能學會XD
    希望能多多寫一些這類的文章
    p.s.我是希望自學轉行軟體工程師的企管系學生

    回覆刪除
    回覆
    1. 想知道作者學machine learning 的原因是什麼?
      是因為對職場上有幫助嗎?

      刪除
    2. 好玩而已;這是很基礎很基礎的課程

      刪除

張貼留言

這個網誌中的熱門文章

什麼是 Assertiveness? 你容易被情感勒索嗎?

來到美國後我才第一次聽到 assertive 這個單字。美國人將 assertiveness 視為很高的美德,因為那代表一個人具備足夠的自信、溝通技巧、人際成熟度,以至於能夠堅定、清楚地表達自己想要的與不想要的,卻不會因此傷害他人或顯得傲慢、無禮或威脅他人。 Psychology Today  是這樣定義 assertiveness 的: “Assertiveness is a social skill that relies heavily on effective communication while simultaneously respecting the thoughts and wishes of others. People who are assertive clearly and respectfully communicate their wants, needs, positions, and boundaries to others.  Individuals who are high in assertiveness don't shy away from defending their points of view or goals, or from trying to influence others to see their side. They are open to both compliments and constructive criticism. ” (「Assertiveness 是一種社交技能,依靠的是在有效溝通的同時尊重他人的想法及需求。Assertive 的人能清楚且尊重他人地說明自己的需求、渴望、處境以及社交界線。擁有 assertive 特質的人會積極地說服他人了解自己的觀點,也積極地爭取、辯護自己的想法。他們對於讚美及有建設性地批評同樣地歡迎。」) 美國人如此看重、欣賞的 assertiveness 這個單字在中文卻似乎沒有相對應的翻譯。Google translate 將 assertive 翻成「斷言的、斷定的、過分自信的」;我覺得這些翻譯充滿負面含義且非常不正確。 生長在台灣的我,認為台灣確實沒有 assertiveness 的文化。我觀察到的台灣人,普遍很少直接說出自己想要什麼;如果說出來,

花九個月,靠自學轉行軟體工程師 -- 我所用的網路資源

by Vanessa Wang       歡迎支持我的臉書專頁:【 工程師作家的轉行人生 】 因為身邊有許多半路出家的軟體工程師,包含我老公,我一直抱持著或許某天我也要轉行當軟體工程師的想法。但我到了成為媽媽、小孩快一歲的時候,我才開始自學寫程式。 從 2018年底開始,我花了九個月的時間自學寫程式,並於 2019年七月成功轉行、找到了在加州矽谷全職軟體工程師(front-end web development)的工作。我沒有參加 bootcamp,就是在網路上找資源、自修。我是台大土木工程碩士畢業,後來到美國讀創意寫作碩士。成為軟體工程師之前,我沒有在職場上當過工程師,以前主要的工作以當 technical writer 寫技術文件為主。( 更多關於我轉職的動機、轉職前的履歷 ) 這篇想整理一下我自學期間用過的教材、工具,但這些都僅供參考,畢竟每個人的狀況、目標都不一樣。我始終相信「盡信書不如無書」。我這九個月中學到最重要的一件事就是凡事要有自己的想法、相信自己。像我這樣的文章網路上有很多,每個人用的方法都不太一樣。參考別人走過的道路很好,但更重要的是規劃最適合自己的一條路,然後自信地走下去。 以下就是轉行的路上,對我最有用的網路資源、工具: 一篇 Medium 上的文章 by Andrei Neagoie  這篇文章叫做  Learn to code in less than 5 months, get hired, and have fun along the way 這是我還在當 technical writer 時,某天上班無聊隨便 google 找到的。那時候還不太確定自己要不要轉行軟體工程,所以常常在網路上參考他人的經驗。我不時地都會回來看這篇文章,這篇文章可以說是貫徹我自學期間的一個中心思想。我很欣賞他的理念,尤其是以下這段話: “I spent the first month avoiding any tutorials or books. Instead, I spent this month looking at the best way for me to learn and get hired. I studied other people’s experiences, looke

是不是要「很聰明」、「數學很好」才能寫 code?

在我去年開始自學寫程式之前,我常常問是軟體工程師的朋友:「寫 code 很難吧?感覺超難懂。」在我心目中,寫 code 跟「數學能力」最有關係。 有趣的是,凡軟體工程師給我的回答,幾乎都一樣:「不會呀。學寫 code 就像學英文、日文那樣,就是一個語言。」 但我不是很能夠被這個答案說服,因為我以往跟程式語言的歷史告訴我,寫 code 是很困難的。我從高一第一次接觸 C++,到後來大一上土木工程系的必修課也是修 C++,經驗都蠻慘的,因此我就宣判自己沒有寫程式語言的天份。直到去年我從零開始再次透過線上課程自學寫 code,我才終於體會朋友們說的「學 code 就像學任何一個異國語言一樣」這句話的意思。 就從我高一的時候,第一次接觸程式語言的故事說起吧!那時是我學校的物理老師鼓勵我學程式語言的。他以完全免費的方式輔導我在假日期間學 C++,大概也是看到我對理工科有興趣,想說我可以自學寫一些小程式、搞不好還能參加什麼比賽之類的。於是他給我開了書單,讓我買了兩大本比字典還厚的 C、C++ 教學工具書(這種書現在還存在嗎?)來看,並且給我出功課,要我自己研究怎麼做出一些程式。 但朽木如我,一直碰壁,步步都感到挫折。那時的我,還不知道怎麼「自己找答案」,因此我心中一直期待老師可以好好示範他到底要我做什麼,因為我連他出的功課的題目、他到底想要我做些什麼我都不了解,也不知道從何問起。現在回想起來,老師心中一定是想:「這有什麼難的?自己看書,看不懂去找答案,不就這樣嗎?實際做做看、做不出來用力想直到做出來為止,難道還要手把手教學嗎?」但要知道那時候的我,雖然很喜歡數學、物理,理工能力不差,但「電腦」對我而言,就是一個玩接龍和踩地雷的工具,因此我連怎麼按照書上的說明去設定寫程式的環境都搞不清楚。 總之,第一次學寫程式的經驗,就在我心中無限多個黑人問號中無疾而終。直到上了大一又再次遇到 C++。 這次我以為我可以學得比較好,畢竟這是我第二次跟 C++ 碰面了。我們用的課本,再次是那種厚得令我第一天就把它切割成三分的工具書。但豈知第一堂課老師也就講完差不多三分之一本課本,一下就上完一、兩百頁的進度。 「等等啊!」我心中吶喊。第一堂課我們就從 Hello World 上到 for loop,而且是雙層的 for loop, 因為要用程式語言畫出這個形狀: