機器學習之機器學習代碼編寫流程

本文是機器學習入門的第四節,前三節分別是:

zhuanlan.zhihu.com/p/58

zhuanlan.zhihu.com/p/58

zhuanlan.zhihu.com/p/58

本次學習,我們首先編碼一個代碼,進行監督學習,大家要接觸到更多的分類器,如何解決同一個問題。然後,我們要講講關於一個演算法從數據中學習的真正意義,儘管聽起來這麼魔幻,實際上一點也不。

為了掃除障礙,我們來看一個常見的你可能要進行的實驗,想想你要建立一個垃圾郵件分類器,這僅僅是一個功能,把剛收到的郵件標記為垃圾郵件或者正常郵件,現在你已經收集了一些數據,並且為這一模型做好了準備。

但是在使用它之前,要回答一個問題,這個模型究竟可以做到多準確,如果用它來分類你的數據中沒有的郵件,我們希望儘可能地確認模型正常工作,在使用它之前,我們可以通過一個實驗來幫助檢驗這一點。

一個辦法是吧已有的數據分成兩部分,我們稱之為訓練數據和測試數據,用訓練數據來訓練我們的模型,使用測試數據來測試模型在新數據上運行的準確度,這是一個常見的模式,讓我們來看看如何用代碼實現。

首先導入scikit庫中的數據集,我們再次用到鶯尾花數據集,我們聲明兩個變數,x保存特徵,y保存標籤.

from sklearn import datasets

iris = datasets.load_iris()

x = iris.data

y = iris.target

我們來看看原因何在,本質上分類器就是是一種函數,x作為輸入,y作為輸出

x是特徵,y是標籤。

下面我們把數據集分解成訓練數據和測試數據,用到train_test_split

from sklearn.model_selection import train_test_split

x_train,y_train,x_test,y_test = train_test_split(x,y,test_size=.5)

x_train,y_train分別保存訓練集的特徵和標籤,x_test,y_test分別保存測試集中的特徵和標籤,test_size=.5是分割數據集,訓練集和測試集分別佔50%,iris中有150個數據,75個用作訓練,75個用作測試,

現在我用這兩種類型,來想大家展示如何實現同一任務,我們用前面學過的決策樹,用訓練集訓練分類器,

from sklearn import tree

my_classifier = tree.DecisionTreeClassifier()

my_classifier.fit(x_train,y_train)

用測試集的數據評估模型

predictions = my_classifier.predict(x_test)

我們可以將預測的標籤與真實的標籤比較,計算出得分。

from sklearn.metrics import accuracy_score
print(accuracy_score(y_test,predictions))

結果顯示準確性超過了90%,每個人運行的結果可能不同,是因為測試集和訓練集的數據是隨機分配的。我們來修改代碼,用另一種分類器,但是不用決策樹來完成相同的任務,修改

from sklearn import tree
my_classifier = tree.DecisionTreeClassifier()

為:

from sklearn.neighbors import KNeighborsClassifier

my_classifier = KNeighborsClassifier()

我們不用決策樹,而是用KNeighborsClassifier的類,我們發現運行程序後結果幾乎一致。你自己運行結果可能不同,因為這個分類器工作方式略有不同,還有劃分訓練/測試數據隨機性影響。類似,如果我們要用一種更加複雜的分類器,我們只需要導入它,然後修改上面兩行代碼,與此同時,其他部分保持不變,另外要注意,儘管有各種類型的分類器,他們的介面基本相似。

現在我們深入講述,從數據學習中意味這什麼,之前我們說過特徵x於標籤y,他們是一個函數的輸入和輸出,他們是一個函數,當然,函數是一種我們在編程中已經知道的知識,

def classify(features):

# do some logic

return label

classify就是函數,正如我們在監督學習中了解的,我們並不想親自去寫這樣的代碼,

我們想要一個演算法來從訓練數據中學習,所以學習一個函數是什麼意思呢,函數僅僅是一個映射,從輸入到輸出值。

這就是一個函數:y=mx+b,,這是一個直線的方程,有兩個參數:m代表斜率,b代表y軸截距,給定這些參數,

我們就可以畫出不同x值的函數值,現在,在監督學習下,我們的分類函數也可能有一些參數,但輸入x是一個要分類樣本的特徵,輸出y是一個標籤,像垃圾郵件和正常郵件,或者是花的種類,那麼函數的主體是什麼樣的呢?這部分就是我們要寫的演算法,或者說是學習演算法。

這裡我要強調,即使我們並非從頭開始,從無到有得到函數的主題,相反,我們從模型開始,你可以把模型當成一個原型,用作定義我們函數主題的規則,一般,一個模型具有參數,參數根據訓練數據做調整,關於這部分如何運行,來看這個高級的例子。

我們來看一個玩具的數據集,想像下什麼樣的模型可以用作分類器,假設我們要區分紅點和綠點,有些我已經畫出來了。

為此,我們需要兩種特徵,每個點的x,y坐標,現在如何區分這兩種點呢,現在我們需要一個函數,一個新的沒有見過的點到來可以區分他是紅的還是綠的,事實上我們可能又很多數據想要分類,這裡我畫了一些測試樣本,用淺紅色和淺綠色。

這些點不存在訓練數據中,分類器也從來沒有見過他們,那他怎麼預測出正確的標籤呢,想像一下我們可以以一種方式畫一條線,

像上面一樣穿過數據,然後我們可以說線左側的是綠的,右側是紅的,這條線可以看作是一個分類器,所以我們怎麼學習這條線呢,一個辦法就是利用訓練數據來調整模型的參數,而且我們認為使用的模型是一條簡單的直線,如之前所示,也就是說我們有兩個參數要調整,:m和b,通過改變他們,我們可以改變直線所在的位置。

那麼我們如何學習得到正確的參數呢?一個想法就是通過迭代,利用訓練數據來調整得到,比如,初始時我么用的一條隨機的直線,然後用它來分類訓練數據,如果是正確的,就不用改變直線,接著分類下一個訓練數據,而相反,如果出錯,我們可以輕微改變模型的參數,使之更準確,需要格外注意,看待學習的一種方式,就是訓練數據調整模型參數。

Playground.Tensorflow.org是被稱之為tensorflow遊戲場,這是神經網路的一個優美範例,你可以直接在瀏覽器上運行和實驗,上面帶了很多不同的數據集,你可以嘗試,


推薦閱讀:

TAG:機器學習 | 數據挖掘 | sklearn |