編寫你人生中第一個機器學習程式碼吧!

WeaponZhi發表於2018-01-15

小之的公眾號 : WeaponZhi。關注公眾號並回復AI獲取AI+Python資料和機器學習入門視訊教程

我們先要學習的機器學習演算法是監督學習,那麼,何為監督學習呢?要了解監督學習,我們得先回顧下我們平時的編碼方式。我們平時的編碼方式是一種硬編碼,簡而言之就是面對問題的時候,我們通過正向暴力編碼,將問題的各個方面和邏輯通過編碼來處理,從而使得程式碼按照我們的思路一步步執行下去,最終解決我們的既定問題。

打個比方,假設我們要寫一個程式碼來區分一個人的性別,我們可能首先會提取出男人和女人的特點,比如男人可能有鬍子,有喉結,身高普遍在一個 xx 範圍這樣,那麼我們就可以根據這些屬性來編寫一些判斷條件,最終實現一個演算法,然後把某個人具備的屬性輸入到演算法,演算法輸出一個結果,告訴你這個人可能是啥性別。

這樣可能能實現一個演算法,但會有兩個問題。首先就是這些屬性的確定,決定一個人是什麼性別的屬性可能有很多,如果屬性太多,靠人工來編寫演算法就會顯得非常不實際。其次,這些屬性對於最終輸出結果的影響是有限的,總會存在特例,有的男人就是不長鬍子,或者有的女人身高很高,面對這種比較特殊的個例的時候,演算法就非常有可能出錯,顯然,單純的依靠硬編碼,是不可能做到盡善盡美的。

而監督學習演算法的做法就是,把一些既定的樣本輸入給演算法,這些樣本包括具體的特徵屬性和具體的輸出,比如「一個人身高一米八,有鬍子,有喉結」,這是它的樣本輸入,「這個人是個男人」是它的輸出,這些具有明確輸入和結果的樣本輸入到監督學習演算法後,它會自己進行學習和總結,隨著樣本數量的增多,監督學習的判斷規則將會被訓練的 越來越準確和成熟。隨後,面對它從未見過的樣本,比如「一米六,沒鬍子,有喉結」,演算法就會根據之前的規則給出一個它的判斷,告訴你這個人可能是個啥性別。

我們把鬍子、喉結這些屬性成為特徵-Features,男人還是女人這樣的輸出結果稱為標籤-Label。為了實現這樣的一個功能,我們需要一個分類器,那麼,我們整個監督學習的過程大概是這樣的。

編寫你人生中第一個機器學習程式碼吧!

scikit-learn 可以幫我們輕易的實現上面的需求,如果你安裝過 Anaconda,scikit-learn 就已經包含其中了,其他下載方式這裡不再贅述。

如果你是使用 Python 來學習機器學習,scikit-learn 肯定是你必須要使用的機器學習庫,scikit-learn 是非常保守的庫,它專業性極強,只做機器學習領域,從來不會作任何機器學習領域之外的擴充套件。不僅如此,scikit-learn 使用的機器學習演算法都是經過廣泛驗證過的演算法,這些演算法往往也是效率最高,實現最簡單有效的。所以,閱讀 scikit-learn 的原始碼實現也是一個非常好的學習方式。

scikit-learn 官網

下面我們用具體的程式碼來演示上面說過的三個過程。

收集真實訓練資料

在現實的應用環境中,我們獲取資料的方式是多種多樣的,比如,你可以通過讀取已有檔案來獲取資料,或者是動態的監聽資料,每獲取一條資料就輸入一條資料。我們就不這麼複雜了,用上面判斷性別的例子,簡單的模擬幾個資料:

>> features = [[160,30,2.1],[170,15,2.3],[178,8,2.5],[188,10,2.8],[167,22,2.2]]
>> labels = [0,0,1,1,0]
複製程式碼

features 是我們的特徵,拿第一個資料 [160,30,2.1] 舉例子,160 代表的是身高,30 代表的是頭髮長度,2.1 代表的是腰圍,單位為尺。好吧,原諒我想象力有點渣渣,可能例子不好,總之目前我們使用身高、頭髮長度以及腰圍來作為我們判斷性別的特徵,當然,你還可以提取出更多的特徵,這裡只是為了我們測試方便。labels 就是我們的標籤了,0 代表這個人性別為女,1 代表性別為男

這樣, 我們就算完成了第一步,收集好了真實資料

訓練分類器

拿到了資料來源,我們需要挑選一種分類器來訓練這組資料,這裡我們選擇決策樹,可以先暫時不要管決策樹是什麼,你可以把它當做實現分類器的一種形式罷了

>> from sklearn import tree
>> clf = tree.DecisionTreeClassifier()
>> clf.fit(features,labels)
複製程式碼

sklearn即是 scikit-learn 庫,我們引入庫中的決策樹類,並使用fit()函式來匹配特徵和標籤,這樣,我們的分類器就算實現好了,clf完成了它的訓練。

對資料作出預測

實際上你可以把分類器想像成一個黑盒子,通過一些資料的訓練,這個盒子就具備了一定的判斷能力,當你再次輸入進資料的時候,它能夠得到相應的預測,至於這個盒子裡面到底使用了什麼方法根據資料的訓練來指定規則,就是你選取的演算法所做的事了,比如在這裡,我們選擇了決策樹來作為分類器制定規則的演算法,當然你還有很多演算法可以選擇,也可以自己實現演算法,這不在我們這篇文章的講述範圍內。下面,我們使用實現好的分類器,對一個未知資料進行預測

>> print(clf.predict([[180, 15, 2.3]]))
[0]
複製程式碼

我們使用predict()函式來對一組分類器從未見過的資料來進行預測。分類器認為一個 1 米 8 大個,長著 15 釐米長秀髮,腰圍 2.3 尺 的高大個是個女孩。好吧,這是它的想法。

那麼,這就是你的第一個機器學習程式碼了,是不是簡單有趣無敵呢?


參考資料:Machine Learning Recipes with Josh Gordon

歡迎關注我的公眾號

編寫你人生中第一個機器學習程式碼吧!

相關文章