機器學習基礎概念

公眾號:尤而小屋
作者:Peter
編輯:Peter

大家好逸绎,我是Peter~

本文主要機器學習的一些基本內容币他,包含:

  1. 除了分類和回歸之外的其他機器學習形式
  2. 評估機器學習模型的規(guī)范流程
  3. 為深度學習準備數(shù)據(jù)
  4. 特征工程
  5. 解決過擬合
  6. 處理機器學習問題的通用流程

[圖片上傳失敗...(image-e54094-1648963990881)]

機器學習4個分支

監(jiān)督學習supervised learning

最常見的機器學習類型匀伏。給定一組樣本(通常是人工標準),它可以學會將數(shù)據(jù)映射到已知目標(也叫標注)。監(jiān)督學習廣泛應用到光學字符識別、語音識別连霉、圖像分類和語言翻譯。

監(jiān)督學習除了回歸和分類嗡靡,還有其他變體:

  1. 序列生成
  2. 語法樹預測
  3. 目標檢測
  4. 圖像分割

無監(jiān)督學習

無監(jiān)督學習是指在沒有目標的情況下尋找輸入數(shù)據(jù)的有趣變換跺撼,目的是在于數(shù)據(jù)可視化、數(shù)據(jù)壓縮讨彼、數(shù)據(jù)去噪或者更好地理解數(shù)據(jù)中的相關性歉井。

主要是降維聚類

自監(jiān)督學習

自監(jiān)督學習是監(jiān)督學習的特例。自監(jiān)督學習可以看做是沒有人工標注的標簽的監(jiān)督學習哈误。

標簽是仍然存在的哩至,但是他們是從輸入數(shù)據(jù)中生成的,通常是使用啟發(fā)式算法生成的蜜自。

一個常見的例子就是:自編碼器autoencoder憨募,其目標就是未經修改的輸入。

給定視頻中過去的幀來預測下一幀袁辈,或者給定文本中前面的詞語來預測下一個次菜谣,都是屬于自監(jiān)督學習的例子(這兩個例子是時序監(jiān)督學習的例子)

強化學習

強化學習是因為谷歌的DeepMind公司將其成功應用于學習完Atari游戲(還有圍棋阿爾法狗)中,才開始被廣泛關注晚缩。

在強化學習中尾膊,智能體agent接收有關其環(huán)境的信息,并學會選擇使其某種獎勵最大化的行動荞彼。

分類和回歸術語

總結一下回歸和分類中常出現(xiàn)的術語:

  1. 樣本冈敛、輸入:進入模型的數(shù)據(jù)點
  2. 預測、輸出:從模型出來的結果
  3. 目標:真實值鸣皂。對于外部數(shù)據(jù)源抓谴,理想狀態(tài)下,模型能夠預測出真實值
  4. 預測誤差寞缝、損失值:預測值和真實值之間的距離
  5. 類別:分類問題中供選擇的一組標簽癌压。比如對貓狗圖像進行分類時,貓和狗就是標簽
  6. 標簽:分類問題中類別標注的具體例子荆陆。比如1234號圖像被標注為包含類別狗滩届,那么“狗”就是1234號圖像的標簽
  7. 真實值和標注:數(shù)據(jù)集的所有目標。通常是人工收集
  8. 二分類:一種分類任務被啼,每個輸入樣本應該被劃分到兩個互斥的類別
  9. 多分類:一種分類任務帜消,每個輸入樣本應該被劃分到多個不同的類別中棠枉,比如手寫數(shù)字分類
  10. 多標簽分類:一種分類任務,每個輸入樣本都可以分配多個標簽泡挺。比如一幅圖像中既有貓又有狗辈讶,那么應該同時標注貓標簽和狗標簽。每幅圖像的標簽個數(shù)通常是可變的娄猫。
  11. 標量回歸:目標是連續(xù)標量值的任務贱除。比如預測房價
  12. 向量回歸:目標是一組連續(xù)值(比如一個連續(xù)變量)的任務。如果對多個值進行回歸稚新,就是向量回歸
  13. 小批量或批量:模型同時處理的一小部分樣本,通常是8-128.樣本數(shù)通常是2的冪跪腹,方便CPU上的內存分配褂删。訓練時,小批量用來為模型權重計算一次梯度下降更新冲茸。

評估機器學習的模型

機器學習的目的是得到可以泛化的模型:在前所未見的數(shù)據(jù)集上也能夠表現(xiàn)的很好屯阀,而過擬合則是核心難點。

3大數(shù)據(jù)集

評估模型的重點是將數(shù)據(jù)劃分為:訓練集轴术、驗證集和測試集

  • 訓練集:訓練模型
  • 驗證集:評估模型
  • 測試集:最后一次的測試

模型一定不能讀取與測試集任何相關的信息难衰,即使是間接讀取也不行。3大經典評估方法:

  1. 簡單的留出驗證
  2. K折驗證
  3. 帶有打亂數(shù)據(jù)的重復K折驗證

3大評估方法

簡單的留出驗證(hold-out validation)

留出一定的比例的數(shù)據(jù)作為測試集逗栽,在剩余的數(shù)據(jù)集上訓練數(shù)據(jù)盖袭,然后在測試集上評估模型。

為了防止信息泄露彼宠,我們不能基于測試集來調節(jié)模型鳄虱,必須保留一個驗證集。

[圖片上傳失敗...(image-d1ab26-1648963990881)]

# 代碼實現(xiàn)

num_validation_samples = 10000

# 打亂數(shù)據(jù)
np.random.shuffle(data)

validation_data = data[:num_validation_samples]  # 驗證集

data = data[num_validation_samples:]  
train_data = data   # 訓練集

model = get_model()
model.train(train_data)  # 訓練集訓練模型

validation_score = model.evaluate(validation_data)  # 驗證集上評估模型

# 調節(jié)模型凭峡、重新訓練拙已、評估,然后再次調節(jié)摧冀,最后在測試集上評估
model = get_model()
# 將訓練集和驗證合并起來進行重新訓練
model.train(np.concatenate([train_data,validation_data]))
# 測試集上進行評估
test_score = model.evaluate(test_data)

一個缺點:如果可用的數(shù)據(jù)很少倍踪,可能驗證集和測試集包含的樣本很少,從而無法從統(tǒng)計學上代表數(shù)據(jù)索昂。

因此就有了K折驗證和重復的K折驗證來解決這個問題建车。

K折驗證

使用K折交叉驗證的基本原來:

  • 將數(shù)據(jù)劃分為K個分區(qū),通常是4或者5
  • 實例化K個模型椒惨,將模型在K-1個分區(qū)上訓練癞志,剩下的一個區(qū)上進行評估
  • 模型的驗證分數(shù)等于K個驗證分數(shù)的均值。

如何K折交叉驗證:以3折交叉驗證為例

[圖片上傳失敗...(image-af9285-1648963990881)]

# 代碼實現(xiàn)

k = 4

num_validation_samples = len(data) // k
# 隨機打亂數(shù)據(jù)
np.random.shuffle(data)

validation_scores = []

for fold in range(k):
    # 驗證集
    validation_data = data[fold * num_validation_samples: (fold + 1) * num_validation_samples]
    # 訓練集
    train_data = data[: fold * num_validation_samples] + data[(fold + 1) * num_validation_samples:]

    model = get_model()
    model.train(train_data)

    validation_score = model.evaluate(validation_data)  # 每個驗證集上的得分
    validation_scores.append(validation_score)  # 放到列表中

validation_score = np.average(validation_scores)  # K折驗證的均值

model = get_model()
model.train(data)  # data = train_data + validation_data  所有非測試集上進行訓練
test_score = model.evaluate(test_data)  #  測試集上進行評估

帶有打亂數(shù)據(jù)的K折驗證

如果數(shù)據(jù)很少框产,又想精確地評估模型凄杯,可以使用打亂數(shù)據(jù)的K折交叉驗證:iterated K-fold validation with shuffling错洁。

具體做法:在每次將數(shù)據(jù)劃分為k個分區(qū)之前,先將數(shù)據(jù)打亂戒突,最終分數(shù)是每個K折驗證分數(shù)的均值

注意:這個做法一共要訓練和評估P*K個模型屯碴,P是重復次數(shù),計算代價很大膊存。

評估模型的注意事項

  1. 數(shù)據(jù)代表性:隨機打亂數(shù)據(jù)
  2. 時間箭頭:如果想根據(jù)過去預測未來导而,即針對所謂的時間序列的數(shù)據(jù),則不應該隨機打亂數(shù)據(jù)隔崎,這樣會造成時間泄露
  3. 數(shù)據(jù)冗余:確保訓練集和驗證集之間沒有交集

數(shù)據(jù)預處理今艺、特征工程和特征學習

預處理

預處理的主要步驟:

  • 向量化
  • 標準化
  • 處理缺失值
  • 特征提取

向量化

神經網(wǎng)絡的所有輸入和輸出都必須是浮點張量。都必須轉成張量爵卒,這一步叫做向量化data vectorization

值標準化

數(shù)據(jù)輸入網(wǎng)絡前虚缎,對每個特征分別做標準化,使其均值為0钓株,標準差為1实牡。

輸入神經網(wǎng)絡的數(shù)據(jù)應該具有以下特征:

  • 取值較小:大部分取值在0-1范圍內
  • 同質性(homogenous):所有特征的取值范圍都在大致相同的范圍內

Numpy實現(xiàn)的標準化過程:

X -= X.mean(axis=0)  # 假定X是個二維矩陣
X -= X.std(axis=0)

缺失值處理

在神經網(wǎng)絡中轴合,一般將缺失值用0填充创坞。

特征工程

根據(jù)已有的知識對數(shù)據(jù)進行編碼的轉換,以改善模型的效果受葛。

特征工程的本質:用更簡單的方式表述問題题涨,從而使得問題變得更容易。

現(xiàn)在大部分的深度學習是不需要特征工程的总滩,因為神經網(wǎng)絡能夠從原始數(shù)據(jù)中自動提取有用的特征携栋。

[圖片上傳失敗...(image-31af58-1648963990881)]

解決過擬合

什么是過擬合和欠擬合

機器學習的根本問題是優(yōu)化和泛化的對立。

優(yōu)化:調節(jié)模型以在訓練集上得到最佳性能咳秉;泛化:訓練好的模型在未知數(shù)據(jù)上的性能好壞婉支。

  • 過擬合overfit:模型在訓練集上表現(xiàn)良好,但是在測試集上表現(xiàn)不好澜建。過擬合存在所有的機器學習問題中向挖。
  • 欠擬合underfit:訓練數(shù)據(jù)上的損失越小,測試數(shù)據(jù)上的數(shù)據(jù)損失也越小炕舵。

過擬合和欠擬合的產生

1何之、欠擬合問題,根本的原因是特征維度過少咽筋,導致擬合的函數(shù)無法滿足訓練集溶推,誤差較大。

解決方法:欠擬合問題可以通過增加特征維度來解決。

2蒜危、過擬合問題虱痕,根本的原因則是特征維度過多,導致擬合的函數(shù)完美的經過訓練集辐赞,但是對新數(shù)據(jù)的預測結果則較差部翘。解決過擬合問題,則有2個途徑:

  • 減少特征維度响委;可以人工選擇保留的特征新思,或者模型選擇算法
  • 正則化;保留所有的特征赘风,通過降低參數(shù)θ的值夹囚,來影響模型

3招解決過擬合

減小網(wǎng)絡大小

防止過擬合最簡單的方案:減小模型大小,即減少模型中學習參數(shù)的個數(shù)(層數(shù)和每層的單元個數(shù)決定)邀窃。

容量:在深度學習中荸哟,模型中可學習參數(shù)的個數(shù)稱之為容量。

使用的模型必須具有足夠多的參數(shù)蛔翅,以防止過擬合敲茄,即模型應該避免記憶資源不足位谋。

# 電影評論分類的原網(wǎng)絡

import tensorflow as tf  # add
import keras as models
import keras as layers

model = models.Sequential()
model.add(tf.keras.Dense(16, activation="relu",input_shape=(10000, )))
model.add(tf.keras.Dense(16, activation="relu"))
model.add(tf.keras.Dense(1, activation="sigmoid"))

用一個更小的網(wǎng)絡來替代:

model = models.Sequential()
model.add(tf.keras.Dense(4, activation="relu",input_shape=(10000, )))
model.add(tf.keras.Dense(4, activation="relu"))
model.add(tf.keras.Dense(1, activation="sigmoid"))

[圖片上傳失敗...(image-f9533e-1648963990881)]

我們發(fā)現(xiàn):更小的網(wǎng)絡開始過擬合的時間要晚于之前的網(wǎng)絡山析;而且小網(wǎng)絡的性能變差的速度也更慢。

換成更大的模型:

model = models.Sequential()
model.add(tf.keras.Dense(512, activation="relu",input_shape=(10000, )))
model.add(tf.keras.Dense(512, activation="relu"))
model.add(tf.keras.Dense(1, activation="sigmoid"))

[圖片上傳失敗...(image-61c09-1648963990881)]

網(wǎng)絡的容量越大掏父,擬合訓練數(shù)據(jù)的速度也越快笋轨,更容易過擬合。

添加權重正則化(最佳)

奧卡姆剃刀(Occams razor) 原理:如果一件事有兩種解釋赊淑,那么最可能正確的就是最簡單的那個爵政,即假設更少的那個。

權重正則化:強制讓模型權重只能取較小的值陶缺,從而限制模型的復雜度钾挟,使得權重的分布更加規(guī)則regular。其實現(xiàn)方法:向網(wǎng)絡損失函數(shù)中添加與較大權重值相關的成本饱岸。

具體兩種方式:

  • L1正則化:權重系數(shù)的絕對值掺出;L1范數(shù)
  • L2正則化:權重系數(shù)的平方;L2范數(shù)

神經網(wǎng)絡中的L2正則化也叫做權重衰減weight decay苫费。

Keras中添加權重正則化的方法是向層傳遞:權重正則化實例 作為關鍵字參數(shù)汤锨,以添加L2權重正則化為例:

from keras import regularizers

model = models.Sequential()
model.add(tf.keras.layers.Dense(16,kernel_regularizer=regularizers.l2(0.001),
                               activation="relu",
                               input_shape=(10000,)))
model.add(tf.keras.layers.Dense(16,kernel_regularizer=regularizers.l2(0.001),
                               activation="relu"))
model.add(tf.keras.layers.Dense(1,activation="sigmoid"))

l2(0.001)的意思是該層權重矩陣的每個系數(shù)都會使網(wǎng)絡總損失增加0.001*weight_coeffient_value

由于這個懲罰項只在訓練時添加,所以網(wǎng)絡的訓練損失會比測試損失大的多

添加L2正則項前后對比:

[圖片上傳失敗...(image-472813-1648963990881)]

其他權重正則化的添加方式:

from keras import regularizers

regularizers.l1(0.001)  # l1正則化
regularizers.l1_l2(l1=0.001, l2=0.001)  # 同時添加

添加dropout正則化

dropout是神經網(wǎng)絡中最有效也是最常用的正則化方式之一百框,做法:在訓練過程中隨機將該層的一些輸入特征舍棄(設置為0)

dropout的比例就是被設置為0的特征所占的比例闲礼,通常在0.2-0.5之間。添加dropout的具體過程:

model.add(tf.keras.layers.Dropout(0.5))

要應用在前面一層的輸出

model = models.Sequential()
model.add(tf.keras.layers.Dense(16,activation="relu",input_shape=(10000,)))
model.add(tf.keras.layers.Dropout(0.5))  # 添加
model.add(tf.keras.layers.Dense(16,activation="relu"))
model.add(tf.keras.layers.Dropout(0.5))  # 添加
model.add(tf.keras.layers.Dense(1,activation="sigmoid"))

總結

防止神經網(wǎng)絡過擬合的方法:

  1. 獲取更多的訓練數(shù)據(jù)
  2. 減小網(wǎng)絡容量
  3. 添加權重正則化
  4. 添加dropout

機器學習的通用工作流程

  1. 問題定義、收集數(shù)據(jù)
  2. 選擇衡量成功的標準
    • 平衡分類問題:精度和接受者操作特征曲線下面積-ROC/AUC
    • 分類不平衡問題:準確率和召回率
  3. 確定評估方法
    • 留出驗證集
    • K折交叉驗證
    • 重復的K折交叉驗證
  4. 準備數(shù)據(jù)
    • 數(shù)據(jù)轉成張量
    • 取值縮放到0-1之間
    • 數(shù)據(jù)標準化
    • 特征工程
  5. 開發(fā)比基準更好的模型

[圖片上傳失敗...(image-9aac31-1648963990881)]

  1. 擴發(fā)模型規(guī)模:開發(fā)過擬合的模型

機器學習中無處不在的對立是優(yōu)化和泛化的對立柬泽,理想的模型是剛好在欠擬合和過擬合的邊界上慎菲,在容量不足和容量過大的邊界上。

為了弄清楚我們需要多大的模型聂抢,就必須開發(fā)一個過擬合的模型:

  • 添加更多的層
  • 讓每一層變的更大
  • 訓練更多的輪次

在訓練的過程中始終監(jiān)控訓練損失和驗證損失钧嘶,以及我們關心的指標。

  1. 模型正則化和調節(jié)參數(shù)
  • 添加dropout
  • 嘗試增加或者減少層數(shù)
  • 添加L1或者L2正則化項
  • 嘗試不同的超參數(shù)
  • 反復做特征工程
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末琳疏,一起剝皮案震驚了整個濱河市有决,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌空盼,老刑警劉巖书幕,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揽趾,居然都是意外死亡台汇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門篱瞎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苟呐,“玉大人,你說我怎么就攤上這事俐筋∏K兀” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵澄者,是天一觀的道長笆呆。 經常有香客問我,道長粱挡,這世上最難降的妖魔是什么赠幕? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮询筏,結果婚禮上榕堰,老公的妹妹穿的比我還像新娘。我一直安慰自己嫌套,他們只是感情好逆屡,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灌危,像睡著了一般康二。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勇蝙,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天沫勿,我揣著相機與錄音挨约,去河邊找鬼。 笑死产雹,一個胖子當著我的面吹牛诫惭,可吹牛的內容都是我干的。 我是一名探鬼主播蔓挖,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼夕土,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘟判?” 一聲冷哼從身側響起怨绣,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拷获,沒想到半個月后篮撑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡匆瓜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年赢笨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驮吱。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡茧妒,死狀恐怖,靈堂內的尸體忽然破棺而出左冬,到底是詐尸還是另有隱情桐筏,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布又碌,位于F島的核電站九昧,受9級特大地震影響绊袋,放射性物質發(fā)生泄漏毕匀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一癌别、第九天 我趴在偏房一處隱蔽的房頂上張望皂岔。 院中可真熱鬧,春花似錦展姐、人聲如沸躁垛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽教馆。三九已至,卻和暖如春擂达,著一層夾襖步出監(jiān)牢的瞬間土铺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悲敷,地道東北人究恤。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像后德,于是被迫代替她去往敵國和親部宿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容