機器學習入門——實戰(zhàn)篇之監(jiān)督學習

這是本篇文章是《機器學習入門》系列文章的第二篇曼追,該系列有如下文章:
《機器學習入門——基礎篇》
《機器學習入門——實戰(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)境,一邊探討一邊做實驗反浓。

一萌丈、線性回歸

前文我提到過這么一幅圖:

1-線性回歸-股市大盤.jpg

對了,就是預測股市大盤的這個曲線雷则,我們通過年初和年中兩個點辆雾,預測出了年末大盤走勢。當然了月劈,這只是一個理想形態(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)用試一試蟹略。

二登失、感知器

這個東西比線性回歸稍微復雜一些,我們還是先回顧一下基礎篇提到的圖:

2-感知器.jpg

就是這個圖了挖炬,一條紅線揽浙,分開了正常人和瘋子。我們來看看類似的問題怎么用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ī)矩,從復習決策樹的圖形開始:

3-垃圾分類.jpg

對您市,就是這個圖觉痛,我們舉例用了決策樹做垃圾分類,實際上茵休,決策樹可以干的事情可多了薪棒,例如手蝎,它居然可以被用來預測一次災難的生還率。下面俐芯,我們就用決策樹來預測“泰坦尼克號”乘客的生還率棵介!

# 先是引入兩個我們已經(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)篇之強化學習》

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坐昙,一起剝皮案震驚了整個濱河市绳匀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炸客,老刑警劉巖疾棵,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痹仙,居然都是意外死亡是尔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門开仰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拟枚,“玉大人,你說我怎么就攤上這事众弓《鹘Γ” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵谓娃,是天一觀的道長脚乡。 經(jīng)常有香客問我,道長滨达,這世上最難降的妖魔是什么奶稠? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任俯艰,我火速辦了婚禮,結果婚禮上窒典,老公的妹妹穿的比我還像新娘蟆炊。我一直安慰自己,他們只是感情好瀑志,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布涩搓。 她就那樣靜靜地躺著,像睡著了一般劈猪。 火紅的嫁衣襯著肌膚如雪昧甘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天战得,我揣著相機與錄音充边,去河邊找鬼。 笑死常侦,一個胖子當著我的面吹牛浇冰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播聋亡,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼肘习,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坡倔?” 一聲冷哼從身側響起漂佩,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎罪塔,沒想到半個月后投蝉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡征堪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年瘩缆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佃蚜。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡庸娱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爽锥,到底是詐尸還是另有隱情,我是刑警寧澤畔柔,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布氯夷,位于F島的核電站,受9級特大地震影響靶擦,放射性物質(zhì)發(fā)生泄漏腮考。R本人自食惡果不足惜雇毫,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踩蔚。 院中可真熱鬧棚放,春花似錦、人聲如沸馅闽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽福也。三九已至局骤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暴凑,已是汗流浹背峦甩。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留现喳,地道東北人凯傲。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像嗦篱,于是被迫代替她去往敵國和親冰单。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容