這是本篇文章是《機器學習入門》系列文章的第二篇曼追,該系列有如下文章:
《機器學習入門——基礎篇》
《機器學習入門——實戰(zhàn)篇之監(jiān)督學習》
《機器學習入門——實戰(zhàn)篇之非監(jiān)督學習》
《機器學習入門——實戰(zhàn)篇之深度學習》
《機器學習入門——實戰(zhàn)篇之強化學習》
閑話少說呐矾,言歸正傳。
大家還記得我們提到過監(jiān)督學習里面的幾個名詞烈炭,線性回歸缴罗,感知器,決策樹烙丛,樸素貝葉斯舅巷,支持向量機。下文中我們就一一來看看在Python中怎么使用這些工具河咽。
說到Python钠右,相信在攻城獅領域已經(jīng)不用過多介紹,它可謂是當紅炸子雞忘蟹,忽如一夜春風來飒房,千人萬人學Python。為什么能夠這么熱媚值,跟這門語言的平易近人有很大關系狠毯,乍一看,語法簡單褥芒,調(diào)用簡單嚼松,沒有C++那么多恐怖的特性,也不強調(diào)什么對象不對象的,但好像也啥都能干惜颇。這就是許多服務器端腳本語言的特點皆刺,并且也是動態(tài)語言的特點,靈活方便凌摄,尤其是網(wǎng)絡協(xié)議和工具封裝的好羡蛾。并且,它還趕上了機器學習的又一次大潮(我為什么用了又字……好吧锨亏,歷史上確實有好幾次大潮痴怨,周期性呈現(xiàn)……),很好的實現(xiàn)了TensorFlow的API器予,可謂一路高歌猛進浪藻。好了,還不懂Python的同學可以簡單學習一下乾翔,本文要求有一定的Python基礎爱葵,并且最好安裝一個Python環(huán)境,一邊探討一邊做實驗反浓。
一萌丈、線性回歸
前文我提到過這么一幅圖:
對了,就是預測股市大盤的這個曲線雷则,我們通過年初和年中兩個點辆雾,預測出了年末大盤走勢。當然了月劈,這只是一個理想形態(tài)度迂。不管怎么說,還是表現(xiàn)出了線性回歸的特性猜揪。我們看看Python里面怎么實現(xiàn)這種預測惭墓。
# 引入一個計算向量數(shù)據(jù)很方便的工具pandas
import pandas as pd
# 再引入一個我們要的線性回歸庫 LinearRegression
from sklearn.linear_model import LinearRegression
# 用剛才的pandas讀取一個文件,這個文件可以理解成有許多的散列點(x, y)
# CSV文件就是用逗號分開的一些值湿右,按行排好
data = pd.read_csv("file.csv")
# 實例化一個線性回歸模型
model = LinearRegression()
# 把數(shù)據(jù)導入這個模型诅妹,讓模型適應,也就是訓練啦毅人,一個fit搞定
# 其中這個X和Y可以理解為兩個向量吭狡,就是兩列數(shù),一一對應起來
model.fit(data[['X']], data[['Y']])
# 然后我們給出一個值丈莺,并用print看看預測數(shù)來的值划煮,一切搞定!
laos_life_exp = bmi_life_model.predict(21.07931)
print(laos_life_exp)
是不是簡單清晰缔俄,不過想要實驗的同學弛秋,需要自己準備一份數(shù)據(jù)文件器躏,把數(shù)據(jù)讀進去,然后自己調(diào)用試一試蟹略。
二登失、感知器
這個東西比線性回歸稍微復雜一些,我們還是先回顧一下基礎篇提到的圖:
就是這個圖了挖炬,一條紅線揽浙,分開了正常人和瘋子。我們來看看類似的問題怎么用Python來實現(xiàn)意敛。
# 這次我們又換了一種工具馅巷,叫numpy,也是一個數(shù)據(jù)處理庫草姻,比pandas更加底層一些
import numpy as np
# 設置一個隨機數(shù)的種子钓猬,用來生成隨機數(shù),為什么是42呢撩独,因為這是宇宙最終極的答案
# 參考電影《銀河系漫游指南》
np.random.seed(42)
# 定義一個函數(shù)敞曹,很簡單,正數(shù)返回1综膀,負數(shù)返回0
def oneStep(t):
if t >= 0:
return 1
return 0
# 定義一個預測函數(shù)
def prediction(X, W, b):
# 這是一個矩陣相乘函數(shù)np.matmul
return oneStep((np.matmul(X,W)+b)[0])
# 這里就是我們的真實大Boss所在了异雁,感知函數(shù)
# 感知器的核心思想就是把一條線擺在兩堆不同種類的樣本中間
# 從而實現(xiàn)讓兩堆樣本分開的結果
# X是一大堆數(shù)值,對應一大堆表示y僧须,W就是權重
# 每次取出一個X的值,乘以權重项炼,加上一個b值担平,不就是一條一元一次的直線嘛
# 看看這條線是不是擺對了位置,如果不對锭部,就調(diào)整一下
# 重復以上的步驟直到滿意
def perceptronStep(X, y, W, b, learn_rate = 0.01):
# Fill in code
for item_x, item_y in zip(X, y):
y_p = prediction(item_x, W, b)
if item_y - y_p == 1:
W[0] += item_x[0]*learn_rate
W[1] += item_x[1]*learn_rate
b += learn_rate
elif item_y - y_p == -1:
W[0] -= item_x[0]*learn_rate
W[1] -= item_x[1]*learn_rate
b -= learn_rate
return W, b
# 下面就開始尋找我們想要的那個線
# 這里有個學習速率0.01暂论,就是決定每次移動的幅度的
def trainPerceptron (X, y, learn_rate = 0.01, num_epochs = 25):
x_min, x_max = min(X.T[0]), max(X.T[0])
y_min, y_max = min(X.T[1]), max(X.T[1])
W = np.array(np.random.rand(2,1))
b = np.random.rand(1)[0] + x_max
# 下面就要調(diào)用我們準備好的函數(shù)
boundary_lines = []
# 一遍一遍的迭代,25次
for i in range(num_epochs):
W, b = perceptronStep(X, y, W, b, learn_rate)
boundary_lines.append((-W[0]/W[1], -b/W[1]))
return boundary_lines
不管你看懂了沒有拌禾,秘訣就在于取胎,反復的實驗,并且把里面的數(shù)據(jù)結構打印出來對比學習湃窍。
三闻蛀、決策樹
老規(guī)矩,從復習決策樹的圖形開始:
對您市,就是這個圖觉痛,我們舉例用了決策樹做垃圾分類,實際上茵休,決策樹可以干的事情可多了薪棒,例如手蝎,它居然可以被用來預測一次災難的生還率。下面俐芯,我們就用決策樹來預測“泰坦尼克號”乘客的生還率棵介!
# 先是引入兩個我們已經(jīng)熟悉的庫
import numpy as np
import pandas as pd
# 再引入一個用于顯示數(shù)據(jù)的庫
from IPython.display import display # Allows the use of display() for DataFrames
# 仍然是隨機數(shù)
import random
random.seed(42)
# 讀入數(shù)據(jù)文件
in_file = 'data.csv'
full_data = pd.read_csv(in_file)
# 這里我們可以簡單看一看數(shù)據(jù)長什么樣子
display(full_data.head())
數(shù)據(jù)項目如下:
乘客ID
是否生還
客艙級別
名字
性別
年紀
同行兄弟姐妹人數(shù)
同行父母子女人數(shù)
票號
票價
倉號
登陸港口
# 因為是否生還屬于一個結果屬性,我們把它單拎出來吧史,然后把結果去掉
outcomes = full_data['Survived']
features_raw = full_data.drop('Survived', axis = 1)
# 先對數(shù)據(jù)進行one-hot編碼邮辽,也有人翻譯成獨熱編碼,好吧
# 不管什么名字就是類似于這樣扣蜻,001表示男逆巍,010表示女,100表示不知道
# 也就是用三個bit表示了三種情況莽使,每個情況下只有一個bit被置位了
features = pd.get_dummies(features_raw)
# 這一步是把空的地方加上0
features = features.fillna(0.0)
# 下面動真格的了锐极,引入了一個至關重要的庫,能把訓練集和測試集分開芳肌,就像圖里這樣
# 等等灵再,啥是訓練集,啥是測試集亿笤?訓練集合就是用來訓練模型的數(shù)據(jù)
# 但是訓練好以后翎迁,模型到底能得多少分啊,那就測試一下净薛,于是還需要測試集
# 之所以把兩部分數(shù)據(jù)分開汪榔,就是為了防止過擬合……好吧,啥是過擬合
# 就好比考試先看了答案再考肃拜,能考不好么……痴腌,為了防止看答案,就把測試集先藏起來
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(features, outcomes, test_size=0.2, random_state=42)
# 引入主角決策樹類庫
from sklearn.tree import DecisionTreeClassifier
# 真正的訓練就這么一下子燃领!搞定
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
# 模型訓練完了士聪,分別在訓練集和測試集上預測一下嘛
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
# 看看準確率,你會發(fā)現(xiàn)訓練的準確率奇高猛蔽,基本全對
# 但是拿出來測試集一試剥悟,就露餡了,只有0.8左右曼库,但是也算足夠好了
from sklearn.metrics import accuracy_score
train_accuracy = accuracy_score(y_train, y_train_pred)
test_accuracy = accuracy_score(y_test, y_test_pred)
到這里区岗,大家是不是對一個訓練加模型評分的過程有了全局性的認識呢?就是這么簡單毁枯!
四躏尉、樸素貝葉斯
挑戰(zhàn)越來越難啦,復習公式:
P(A|B) = P(B|A)P(A)/P(B)
這就是貝葉斯大魔王的定理后众,含義不再復述胀糜,可以查看我的前一篇文章颅拦,機器學習入門——基礎篇。
這一次教藻,我們要用貝葉斯大定理生成的模型來做垃圾郵件分類距帅。垃圾郵件分類是一個二分問題,通常垃圾郵件的用詞有其特殊性括堤,我們就用模型來找到這種特殊性碌秸,從而以后再碰到類似郵件就可以分辨出來。
數(shù)據(jù)預處理的部分不再贅述悄窃,和前面的部分相去不大讥电。關鍵是,為了引用貝葉斯模型轧抗,我們要用到另一個東西恩敌,“詞袋”模型。簡單說横媚,就是許多的數(shù)學模型都要求輸入數(shù)字纠炮,但是我們面對的是文本啊,像什么郵件啊灯蝴,文章啊恢口,都是文本,那么我們就簡單的把這些文本里面的詞做一個詞頻計數(shù)穷躁,不就變成了數(shù)字嘛耕肩!這就是詞袋模型,像是把詞放進袋子里问潭,再數(shù)一數(shù)的意思看疗。
# 引進相應的庫
from sklearn.feature_extraction.text import CountVectorizer
# 然后用專門的方法就能得到最后的結果,這里我們引入了參數(shù)
# 分別是說處理英語睦授,并且告知了英語單詞的分隔方式
count_vector = CountVectorizer(documents, lowercase=True, token_pattern='(?u)\\b\\w\\w+\\b', stop_words='english')
# 然后我們就用這個“計數(shù)向量”這么fit一下
count_vector.fit(documents)
# 中間一大堆數(shù)據(jù)維度處理的過程我們省去,進入關鍵的代碼
# 下面開始分割訓練集和測試集
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df['sms_message'], df['label'], random_state=1)
# 來到關鍵的貝葉斯部分摔寨,動用了sklearn的貝葉斯模型
from sklearn.naive_bayes import MultinomialNB
naive_bayes = MultinomialNB()
# 簡單的一個fit去枷,又搞定了
naive_bayes.fit(training_data, y_train)
最后的評估部分我們省略了,可以自行去查看是复,提示删顶,可以調(diào)用sklearn庫的accuracy_score, precision_score, recall_score, f1_score這些東西看看。
貝葉斯大魔王也不過如此淑廊,我們繼續(xù)逗余,監(jiān)督學習的最后一部分,支持向量機的實現(xiàn)季惩。
五录粱、支持向量機
閑言碎語不多講腻格,直接來到sklearn
# 引入支持向量機庫
from sklearn.svm import SVC
# 實例化一個模型
model = SVC()
# 訓練!
model.fit(x_values, y_values)
# 然后我們假設有一組數(shù)啥繁,那就可以預測啦
model.predict([ [0.2, 0.8], [0.5, 0.4] ])
上面這個過程如果太簡單了菜职,那我們就來一個有參數(shù)的
# kernel表示用什么計算核心,我們用多項式
# 如果內(nèi)核是多項式旗闽,則此degree參數(shù)為內(nèi)核中的最大單項式次數(shù)酬核。
# C參數(shù)是懲罰參數(shù),大了那么對于數(shù)據(jù)的擬合就會精準一點适室,但是嫡意,也可能過擬合,反之可推
model = SVC(kernel='poly', degree=4, C=0.1)
當然了捣辆,除了這樣的一組參數(shù)蔬螟,還可以選別的核,比如rbf核罪帖,對應gamma參數(shù)促煮,可以自行去學習含義。
同樣整袁,最后可以用accuracy_score來評價模型訓練的好壞菠齿。
這是本篇文章是《機器學習入門》系列文章的第二篇,該系列有如下文章:
《機器學習入門——基礎篇》
《機器學習入門——實戰(zhàn)篇之監(jiān)督學習》
《機器學習入門——實戰(zhàn)篇之非監(jiān)督學習》
《機器學習入門——實戰(zhàn)篇之深度學習》
《機器學習入門——實戰(zhàn)篇之強化學習》