日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【机器学习】机器学习必知概念

發布時間:2025/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】机器学习必知概念 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

本文主要是介紹機器學習的一些基本內容,包含:

  • 除了分類和回歸之外的其他機器學習形式

  • 評估機器學習模型的規范流程

  • 為深度學習準備數據

  • 特征工程

  • 解決過擬合

  • 處理機器學習問題的通用流程

  • 機器學習4個分支

    監督學習supervised learning

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

    監督學習除了回歸和分類,還有其他變體:

  • 序列生成

  • 語法樹預測

  • 目標檢測

  • 圖像分割

  • 無監督學習

    無監督學習是指在沒有目標的情況下尋找輸入數據的有趣變換,目的是在于數據可視化、數據壓縮、數據去噪或者更好地理解數據中的相關性

    主要是降維聚類

    自監督學習

    自監督學習是監督學習的特例。自監督學習可以看做是沒有人工標注的標簽的監督學習。

    標簽是仍然存在的,但是他們是從輸入數據中生成的,通常是使用啟發式算法生成的。

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

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

    強化學習

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

    在強化學習中,智能體agent接收有關其環境的信息,并學會選擇使其某種獎勵最大化的行動。

    分類和回歸術語

    總結一下回歸和分類中常出現的術語:

  • 樣本、輸入:進入模型的數據點

  • 預測、輸出:從模型出來的結果

  • 目標:真實值。對于外部數據源,理想狀態下,模型能夠預測出真實值

  • 預測誤差、損失值:預測值和真實值之間的距離

  • 類別:分類問題中供選擇的一組標簽。比如對貓狗圖像進行分類時,貓和狗就是標簽

  • 標簽:分類問題中類別標注的具體例子。比如1234號圖像被標注為包含類別狗,那么“狗”就是1234號圖像的標簽

  • 真實值和標注:數據集的所有目標。通常是人工收集

  • 二分類:一種分類任務,每個輸入樣本應該被劃分到兩個互斥的類別

  • 多分類:一種分類任務,每個輸入樣本應該被劃分到多個不同的類別中,比如手寫數字分類

  • 多標簽分類:一種分類任務,每個輸入樣本都可以分配多個標簽。比如一幅圖像中既有貓又有狗,那么應該同時標注貓標簽和狗標簽。每幅圖像的標簽個數通常是可變的。

  • 標量回歸:目標是連續標量值的任務。比如預測房價

  • 向量回歸:目標是一組連續值(比如一個連續變量)的任務。如果對多個值進行回歸,就是向量回歸

  • 小批量或批量:模型同時處理的一小部分樣本,通常是8-128.樣本數通常是2的冪,方便CPU上的內存分配。訓練時,小批量用來為模型權重計算一次梯度下降更新。

  • 評估機器學習的模型

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

    3大數據集

    評估模型的重點是將數據劃分為:訓練集、驗證集和測試集

    • 訓練集:訓練模型

    • 驗證集:評估模型

    • 測試集:最后一次的測試

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

  • 簡單的留出驗證

  • K折驗證

  • 帶有打亂數據的重復K折驗證

  • 3大評估方法

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

    留出一定的比例的數據作為測試集,在剩余的數據集上訓練數據,然后在測試集上評估模型。

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

    #?代碼實現num_validation_samples?=?10000#?打亂數據 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)??#?驗證集上評估模型#?調節模型、重新訓練、評估,然后再次調節,最后在測試集上評估 model?=?get_model() #?將訓練集和驗證合并起來進行重新訓練 model.train(np.concatenate([train_data,validation_data])) #?測試集上進行評估 test_score?=?model.evaluate(test_data)

    一個缺點:如果可用的數據很少,可能驗證集和測試集包含的樣本很少,從而無法從統計學上代表數據。

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

    K折驗證

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

    • 將數據劃分為K個分區,通常是4或者5

    • 實例化K個模型,將模型在K-1個分區上訓練,剩下的一個區上進行評估

    • 模型的驗證分數等于K個驗證分數的均值。

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

    img#?代碼實現k?=?4num_validation_samples?=?len(data)?//?k #?隨機打亂數據 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)??#??測試集上進行評估

    帶有打亂數據的K折驗證

    如果數據很少,又想精確地評估模型,可以使用打亂數據的K折交叉驗證:iterated K-fold validation with shuffling。

    具體做法:在每次將數據劃分為k個分區之前,先將數據打亂,最終分數是每個K折驗證分數的均值

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

    評估模型的注意事項

  • 數據代表性:隨機打亂數據

  • 時間箭頭:如果想根據過去預測未來,即針對所謂的時間序列的數據,則不應該隨機打亂數據,這樣會造成時間泄露

  • 數據冗余:確保訓練集和驗證集之間沒有交集

  • 數據預處理、特征工程和特征學習

    預處理

    預處理的主要步驟:

    • 向量化

    • 標準化

    • 處理缺失值

    • 特征提取

    向量化

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

    值標準化

    數據輸入網絡前,對每個特征分別做標準化,使其均值為0,標準差為1。

    輸入神經網絡的數據應該具有以下特征:

    • 取值較小:大部分取值在0-1范圍內

    • 同質性(homogenous):所有特征的取值范圍都在大致相同的范圍內

    Numpy實現的標準化過程:

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

    缺失值處理

    在神經網絡中,一般將缺失值用0填充。

    特征工程

    根據已有的知識對數據進行編碼的轉換,以改善模型的效果。

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

    現在大部分的深度學習是不需要特征工程的,因為神經網絡能夠從原始數據中自動提取有用的特征。


    解決過擬合

    什么是過擬合和欠擬合

    機器學習的根本問題是優化和泛化的對立。

    優化:調節模型以在訓練集上得到最佳性能;泛化:訓練好的模型在未知數據上的性能好壞。

    • 過擬合overfit:模型在訓練集上表現良好,但是在測試集上表現不好。過擬合存在所有的機器學習問題中。

    • 欠擬合underfit:訓練數據上的損失越小,測試數據上的數據損失也越小。

    過擬合和欠擬合的產生

    1、欠擬合問題,根本的原因是特征維度過少,導致擬合的函數無法滿足訓練集,誤差較大。

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

    2、過擬合問題,根本的原因則是特征維度過多,導致擬合的函數完美的經過訓練集,但是對新數據的預測結果則較差。解決過擬合問題,則有2個途徑:

    • 減少特征維度;可以人工選擇保留的特征,或者模型選擇算法

    • 正則化;保留所有的特征,通過降低參數θ的值,來影響模型

    3招解決過擬合

    減小網絡大小

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

    容量:在深度學習中,模型中可學習參數的個數稱之為容量。

    使用的模型必須具有足夠多的參數,以防止過擬合,即模型應該避免記憶資源不足。

    #?電影評論分類的原網絡import?tensorflow?as?tf??#?add import?keras?as?models import?keras?as?layersmodel?=?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"))

    用一個更小的網絡來替代:

    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"))img

    我們發現:更小的網絡開始過擬合的時間要晚于之前的網絡;而且小網絡的性能變差的速度也更慢。

    換成更大的模型:

    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"))img

    網絡的容量越大,擬合訓練數據的速度也越快,更容易過擬合。

    添加權重正則化(最佳)

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

    權重正則化:強制讓模型權重只能取較小的值,從而限制模型的復雜度,使得權重的分布更加規則regular。其實現方法:向網絡損失函數中添加與較大權重值相關的成本。

    具體兩種方式:

    • L1正則化:權重系數的絕對值;L1范數

    • L2正則化:權重系數的平方;L2范數

    神經網絡中的L2正則化也叫做權重衰減weight decay。

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

    from?keras?import?regularizersmodel?=?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)的意思是該層權重矩陣的每個系數都會使網絡總損失增加0.001*weight_coeffient_value

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

    添加L2正則項前后對比:

    img

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

    from?keras?import?regularizersregularizers.l1(0.001)??#?l1正則化 regularizers.l1_l2(l1=0.001,?l2=0.001)??#?同時添加

    添加dropout正則化

    dropout是神經網絡中最有效也是最常用的正則化方式之一,做法:在訓練過程中隨機將該層的一些輸入特征舍棄(設置為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"))

    總結

    防止神經網絡過擬合的方法:

  • 獲取更多的訓練數據

  • 減小網絡容量

  • 添加權重正則化

  • 添加dropout

  • 機器學習的通用工作流程

  • 問題定義、收集數據

  • 選擇衡量成功的標準

    • 平衡分類問題:精度和接受者操作特征曲線下面積-ROC/AUC

    • 分類不平衡問題:準確率和召回率

    確定評估方法

    • 留出驗證集

    • K折交叉驗證

    • 重復的K折交叉驗證

    準備數據

    • 數據轉成張量

    • 取值縮放到0-1之間

    • 數據標準化

    • 特征工程

    開發比基準更好的模型

    img
  • 擴發模型規模:開發過擬合的模型

  • 機器學習中無處不在的對立是優化和泛化的對立,理想的模型是剛好在欠擬合和過擬合的邊界上,在容量不足和容量過大的邊界上。

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

    • 添加更多的層

    • 讓每一層變的更大

    • 訓練更多的輪次

    在訓練的過程中始終監控訓練損失和驗證損失,以及我們關心的指標。

  • 模型正則化和調節參數

    • 添加dropout

    • 嘗試增加或者減少層數

    • 添加L1或者L2正則化項

    • 嘗試不同的超參數

    • 反復做特征工程

    往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:

    總結

    以上是生活随笔為你收集整理的【机器学习】机器学习必知概念的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。