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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hands-on Machine Learning with sklearn

發(fā)布時間:2023/12/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hands-on Machine Learning with sklearn 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

      • 一、機器學習概覽
      • 三、分類
        • 1、二分類器
        • 2、多分類器
        • 3、誤差分析
      • 四、訓(xùn)練模型
        • 1、線性回歸和邏輯回歸
        • 2、邏輯回歸
        • 3、softmax回歸
          • 練習題4
      • 五、SVM
          • 練習題5
      • 六、決策樹
          • 練習題6
      • 七、集成學習
          • 練習題7
      • 八、降維
          • 練習題8

一、機器學習概覽

  • 如何定義機器學習?

    機器學習是通過一定的樣本來學習一個模型,來對未知數(shù)據(jù)的輸出做預(yù)測。

  • 機器學習可以解決的四類問題?

    沒有邏輯解、手工調(diào)整規(guī)則、構(gòu)建適應(yīng)環(huán)境波動的系統(tǒng)、幫助人類學習

  • 什么是帶標簽的訓(xùn)練集?

    帶標簽的訓(xùn)練集表示在有樣本的同時,還已知該樣本的類別

  • 最常見的兩個監(jiān)督任務(wù)是什么?

    分類和回歸

  • 指出四個常見的非監(jiān)督任務(wù)?

    聚類、可視化、降維和關(guān)聯(lián)規(guī)則學習

  • 要讓一個機器人能在各種未知地形行走, 你會采用什么機器學習算法?

    如果我們想讓機器人學會各種各樣的走路方式,強化學習很可能表現(xiàn)得最好未知地形,因為這是強化學習處理的典型問題。可以將這個問題表述為一個有監(jiān)督或半監(jiān)督的學習問題,但這就不那么自然了。

  • 要對你的顧客進行分組, 你會采用哪類算法?

    如果不知道如何定義組,那么可以使用聚類算法(無監(jiān)督學習)將你的客戶劃分成類似客戶的集群。然而,如果您知道您想擁有哪些組,那么您可以提供每個組的許多示例一個分類算法(監(jiān)督學習),它將把你的所有客戶分類這些團體。

  • 垃圾郵件檢測是監(jiān)督學習問題, 還是非監(jiān)督學習問題?

    垃圾郵件檢測是一種典型的有監(jiān)督學習問題:該算法向大量電子郵件發(fā)送與他們的標簽(垃圾郵件或非垃圾郵件)。

  • 什么是在線學習系統(tǒng)?

    在線學習系統(tǒng)可以增量學習,而不是批量學習系統(tǒng)。這使其能夠快速適應(yīng)不斷變化的數(shù)據(jù)和自治系統(tǒng),以及對大量數(shù)據(jù)進行培訓(xùn)。

  • 什么是核外學習?

    核外學習算法可以處理大量無法裝入計算機主程序的數(shù)據(jù)內(nèi)存。一種非核心的學習算法將數(shù)據(jù)分解成小批量并在線使用學習從這些小批量中學習的技巧。

  • 什么學習算法是用相似度做預(yù)測?

    基于實例的學習系統(tǒng)能夠?qū)τ?xùn)練數(shù)據(jù)進行記憶;然后,當給了一個新的實例,它使用相似度度量來查找最相似的已學習實例并使用它們作出預(yù)測。

  • 模型參數(shù)和學習算法的超參數(shù)的區(qū)別是什么?

    一個模型有一個或多個模型參數(shù),這些參數(shù)決定了在給定一個新實例(例如,線性模型的斜率)時它將預(yù)測什么。一個學習算法試圖找到最優(yōu)值這些參數(shù)使模型能夠很好地推廣到新的實例。超參數(shù)是A學習算法本身的參數(shù),而不是模型的參數(shù)(例如,要應(yīng)用的正則化量)

  • 基于模型學習的算法搜尋的是什么? 最成功的策略是什么? 基于模型學習如何做預(yù)測?

    基于模型的學習算法搜索模型參數(shù)的最優(yōu)值該模型將很好地推廣到新的實例。

    我們通常通過最小化a來訓(xùn)練這樣的系統(tǒng)衡量系統(tǒng)在預(yù)測訓(xùn)練數(shù)據(jù)方面有多差的成本函數(shù),如果模型是正則化的,則會對模型復(fù)雜度造成懲罰。

    為了做出預(yù)測,我們將新實例的特征喂給模型的預(yù)測函數(shù),使用學習到的參數(shù)。

  • 機器學習的四個主要挑戰(zhàn)是什么?

    數(shù)據(jù)不足、數(shù)據(jù)噪聲太多或表現(xiàn)力不足、模型的過擬合和欠擬合

  • 如果模型在訓(xùn)練集上表現(xiàn)好, 但推廣到新實例表現(xiàn)差, 問題是什么? 給出三個可能的解決方案。

    出現(xiàn)了過擬合問題,可以增加更多的樣本、簡化模型、或清洗數(shù)據(jù)

  • 什么是測試集, 為什么要使用它?

    測試集時為了在上線運行之前,估計模型在未知數(shù)據(jù)上的表現(xiàn)

  • 驗證集的目的是什么?

    驗證集可以選擇模型、選擇最優(yōu)超參數(shù)

  • 如果用測試集調(diào)節(jié)超參數(shù), 會發(fā)生什么?

    如果利用測試集條件超參數(shù),則會讓模型過度擬合測試集的分布,對未知數(shù)據(jù)有較差的泛化能力。

  • 什么是交叉驗證, 為什么它比驗證集好?

    交叉驗證是可以選擇最優(yōu)模型和超參數(shù),交叉驗證是循環(huán)使用k折中的一折來作為驗證集,比單一的驗證集有更好的泛化性能。

  • 三、分類

    1、二分類器

    準確率P:預(yù)測為正例的樣本中,有哪些是真正的正例

    召回率R:預(yù)測為正例的樣本中,占真正的正例的多少

    F1_score:F1=2PR / P+R

    from sklearn.metrics import precision_score,recall_scoreprecision_score(y_train,y_pred) recall_score(y_train,y_pred)

    準確率和召回率的平衡很重要,要根據(jù)不同場景來選擇高召回率還是高準確率:

    • 高準確率:如果你訓(xùn)練一個分類器去檢測視頻是否適合兒童觀看, 你會傾向選擇那種即便拒絕了很多好視頻、 但保證所保留的視頻都是好( 高準確率) 的分類器, 而不是那種高召回率、 但讓壞視頻混入的分類器

    • 高召回率:加入你訓(xùn)練一個分類器去檢測監(jiān)控圖像當中的竊賊, 有著 30% 準確率、 99% 召回率的分類器或許是合適的( 當然, 警衛(wèi)會得到一些錯誤的報警, 但是幾乎所有的竊賊都會被抓到) 。

    • 折中:分類的時候,會有一個閾值,如果分數(shù)大于閾值,則被分類為正例,否則分類為負例,提高閾值,分類為正例的概率會變小,準確率提高,但是召回率會降低;降低閾值,召回率會提高,準確率會降低。

    可以將準確率和召回率當做閾值的一個函數(shù),繪制出其曲線,可以選擇適合任務(wù)的最佳閾值:

    另一個選出其折衷的方法是直接繪制召回率-準確率曲線:

    可以看到, 在召回率在 80% 左右的時候, 準確率急劇下降。 你可能會想選擇在急劇下降之前
    選擇出一個準確率/召回率折衷點。 比如說, 在召回率 60% 左右的點。 當然, 這取決于你的項
    目需求。

    ROC曲線:

    ROC 曲線是真正例率( true positive rate, 另一個名字叫做召回率) 對假正例率( false positive rate, FPR) 的曲線。

    為了繪制ROC曲線,首先要計算各種不同閾值下的TPR和FPR,使用roc_curve()函數(shù):

    from sklearn.metrics import roc_curve fpr,tpr,thresholds=roc_curve(y_train,y_scores)

    使用matplotlib繪制FPR對TPR的曲線:

    def plot_roc_curve(fpr, tpr, label=None):plt.plot(fpr, tpr, linewidth=2, label=label)plt.plot([0, 1], [0, 1], 'k--')plt.axis([0, 1, 0, 1])plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate') plot_roc_curve(fpr, tpr) plt.show()

    這里同樣存在折衷的問題: 召回率( TPR) 越高, 分類器就會產(chǎn)生越多的假正例( FPR) 。
    圖中的點線是一個完全隨機的分類器生成的 ROC 曲線; 一個好的分類器的 ROC 曲線應(yīng)該盡
    可能遠離這條線( 即向左上角方向靠攏) 。

    一個比較分類器之間優(yōu)劣的方法是: 測量ROC曲線下的面積( AUC) 。 一個完美的分類器的
    ROC AUC 等于 1, 而一個純隨機分類器的 ROC AUC 等于 0.5。 Scikit-Learn 提供了一個函
    數(shù)來計算 ROC AUC:

    from sklearn.metrics import roc_auc_score roc_auc_score(y_train,y_scores)

    現(xiàn)在你知道如何訓(xùn)練一個二分類器, 選擇合適的標準, 使用交叉驗證去評估你的分類器, 選
    擇滿足你需要的準確率/召回率折衷方案, 和比較不同模型的 ROC 曲線和 ROC AUC 數(shù)值。
    現(xiàn)在讓我們檢測更多的數(shù)字, 而不僅僅是一個數(shù)字 5。

    2、多分類器

    一些算法( 比如隨機森林分類器或者樸素貝葉斯分類器) 可以直接處理多類分類問題。 其他
    一些算法( 比如 SVM 分類器或者線性分類器) 則是嚴格的二分類器。 然后, 有許多策略可以
    讓你用二分類器去執(zhí)行多類分類。

    例如要進行10類的分類:

    • 訓(xùn)練10個二分類器,每個對應(yīng)于一個數(shù)字,當想對某張圖像進行分類的時候,讓每個分類器對該圖像進行分類,選出決策分數(shù)最高的類別

    • 訓(xùn)練45個分類器,每個對應(yīng)兩類的區(qū)分,當想對一張圖像進行分類的時候,必須將全部的45個二分類器全部跑完,看哪個類別的得分最多。

    sklearn自動的執(zhí)行的是一對多的分類器,

    3、誤差分析

    檢查混淆矩陣,需要使用cross_val_predict()做出預(yù)測,然后調(diào)用confusion_matrix()函數(shù)。

    y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3) conf_mx = confusion_matrix(y_train, y_train_pred) conf_mx

    輸出:

    array([[5725, 3, 24, 9, 10, 49, 50, 10, 39, 4], [ 2, 6493, 43, 25, 7, 40, 5, 10, 109, 8], [ 51, 41, 5321, 104, 89, 26, 87, 60, 166, 13], [ 47, 46, 141, 5342, 1, 231, 40, 50, 141, 92], [ 19, 29, 41, 10, 5366, 9, 56, 37, 86, 189], [ 73, 45, 36, 193, 64, 4582, 111, 30, 193, 94], [ 29, 34, 44, 2, 42, 85, 5627, 10, 45, 0], [ 25, 24, 74, 32, 54, 12, 6, 5787, 15, 236], [ 52, 161, 73, 156, 10, 163, 61, 25, 5027, 123], [ 43, 35, 26, 92, 178, 28, 2, 223, 82, 5240]])

    使用matplotlib的matshow()函數(shù),將混淆矩陣以圖像的方式呈現(xiàn),將會更加方便。

    plt.matshow(conf_mx,cmap=plt.cm.gray) plt.show()

    這個混淆矩陣看起來相當好, 因為大多數(shù)的圖片在主對角線上。 在主對角線上意味著被分類
    正確。 數(shù)字 5 對應(yīng)的格子看起來比其他數(shù)字要暗淡許多。 這可能是數(shù)據(jù)集當中數(shù)字 5 的圖片
    比較少, 又或者是分類器對于數(shù)字 5 的表現(xiàn)不如其他數(shù)字那么好。

    四、訓(xùn)練模型

    1、線性回歸和邏輯回歸

    訓(xùn)練線性回歸模型:訓(xùn)練一個模型是指設(shè)置模型的參數(shù)使得該模型在訓(xùn)練集上的表現(xiàn)較好,為此,要先找到一個衡量模型好壞的評定方法。常用評估回歸的標準是RMSE,因此未來訓(xùn)練一個線性回歸模型,需要通過梯度下降法或求解正規(guī)方程的方法來找到一個參數(shù)θθ,使得預(yù)測和真實的均方誤差最小。

    正態(tài)方程求解:

    生成一些近似線性的數(shù)據(jù),來測試一下方程:

    import numpy as np x=2*np.random.ran(100,1) y=4+3*x+np.random.randn(100,1)

    現(xiàn)在讓我們使用正態(tài)方程來計算 , 我們將使用 Numpy 的線性代數(shù)模塊( np.linalg ) 中
    的 inv() 函數(shù)來計算矩陣的逆, 以及 dot() 方法來計算矩陣的乘法

    X_b = np.c_[np.ones((100, 1)), X] theta_best = np.linalg.inv(X_b.T.dot(X_B)).dot(X_b.T).dot(y)

    我們生產(chǎn)數(shù)據(jù)的函數(shù)實際上是y=4+3x 。 讓我們看一下最后的計算結(jié)果。

    theta_best array([[4.21509616],[2.77011339]])

    現(xiàn)在可以用θθ來進行預(yù)測:

    >>> X_new = np.array([[0],[2]]) >>> X_new_b = np.c_[np.ones((2, 1)), X_new] >>> y_predict = X_new_b.dot(theta.best) >>> y_predict array([[4.21509616],[9.75532293]])

    繪制:

    plt.plot(X_new,y_predict,"r-") plt.plot(X,y,"b.") plt.axis([0,2,0,15]) plt.show()

    計算復(fù)雜度:

    正態(tài)方程需要計算XTX?1XTX?1,計算復(fù)雜度很高,但是線性情況下預(yù)測也是很快的。

    梯度下降求解:

    梯度下降是一種非常通用的優(yōu)化算法, 它能夠很好地解決一系列問題。 梯度下降的整體思路
    是通過的迭代來逐漸調(diào)整參數(shù)使得損失函數(shù)達到最小值。

    數(shù)值歸一化很重要,否則會使得收斂很慢,模型不穩(wěn)定,可能收斂不到局部最優(yōu)點。

    批量梯度下降隨機梯度下降小批量梯度下降SGD

    (1) 批量梯度下降

    eta=0.1 n_iterations=1000 m=100theta=np.random.randn(2,1) for iteration in range(n_iterations):gradients=2/m*X_b.T.dot(X_b.dot(theta)-y)theta=theta-eta*gradients

    輸出:

    theta array([[4.21509616],[2.77011339]])

    看! 正態(tài)方程的表現(xiàn)非常好。 完美地求出了梯度下降的參數(shù)。 但是當你換一個學習率會發(fā)生
    什么? 圖 4-8 展示了使用了三個不同的學習率進行梯度下降的前 10 步運算( 虛線代表起始位
    置)

    在左面的那副圖中, 學習率是最小的, 算法幾乎不能求出最后的結(jié)果, 而且還會花費大量的
    時間。 在中間的這幅圖中, 學習率的表現(xiàn)看起來不錯, 僅僅幾次迭代后, 它就收斂到了最后
    的結(jié)果。 在右面的那副圖中, 學習率太大了, 算法是發(fā)散的, 跳過了所有的訓(xùn)練樣本, 同時
    每一步都離正確的結(jié)果越來越遠。

    為了找到一個好的學習率, 你可以使用網(wǎng)格搜索( 詳見第二章) 。 當然, 你一般會限制迭代
    的次數(shù), 以便網(wǎng)格搜索可以消除模型需要很長時間才能收斂這一個問題。

    (2) 隨機梯度下降

    批量梯度下降的最要問題是計算每一步的梯度時都需要使用整個訓(xùn)練集, 這導(dǎo)致在規(guī)模較大
    的數(shù)據(jù)集上, 其會變得非常的慢。 與其完全相反的隨機梯度下降, 在每一步的梯度計算上只
    隨機選取訓(xùn)練集中的一個樣本。 很明顯, 由于每一次的操作都使用了非常少的數(shù)據(jù), 這樣使
    得算法變得非常快。 由于每一次迭代, 只需要在內(nèi)存中有一個實例, 這使隨機梯度算法可以
    在大規(guī)模訓(xùn)練集上使用。

    其呈現(xiàn)出更多的不規(guī)律性: 它到達最小
    值不是平緩的下降, 損失函數(shù)會忽高忽低, 只是在大體上呈下降趨勢。 隨著時間的推移, 它
    會非常的靠近最小值, 但是它不會停止在一個值上, 它會一直在這個值附近擺動( 如圖 4-
    9) 。 因此, 當算法停止的時候, 最后的參數(shù)還不錯, 但不是最優(yōu)值

    當損失函數(shù)很不規(guī)則時( 如圖 4-6) , 隨機梯度下降算法能夠跳過局部最小值。 因此, 隨機梯
    度下降在尋找全局最小值上比批量梯度下降表現(xiàn)要好。

    隨機性可以很好的跳過局部最優(yōu)值,但是不能達到局部最小值,因此,可以通過降低學習率的方法,也叫模擬退火法,使學習率越來越小,從而使算法到達全局最小值。

    隨機梯度下降代碼:

    n_epochs=50 t0,t1=5,50def learning_schedule(t):return t0/(t+t1) theta=np.random.randn(2,1)for epoch in range(n_epochs):for i in range(m):random_index=np.random.randint(m)xi=X_b[random_index:random_index+1]yi=y[random_index:random_index+1]gradients=2*xi.T.dot(xi,dot(theta)-yi)eta=learning_schedule(epoch*m+i)theta=theta-eta*gradients theta array([[4.21076011],[2.748560791]])

    圖 4-10 展示了前 10 次的訓(xùn)練過程( 注意每一步的不規(guī)則程度) :

    由于每個實例的選擇是隨機的, 有的實例可能在每一代中都被選到, 這樣其他的實例也可能
    一直不被選到。 如果你想保證每一次迭代過程, 算法可以遍歷所有實例, 一種方法是將訓(xùn)練
    集打亂重排, 然后選擇一個實例, 之后再繼續(xù)打亂重排, 以此類推一直進行下去。 但是這樣
    收斂速度會非常的慢。

    通過使用 Scikit-Learn 完成線性回歸的隨機梯度下降, 你需要使用 SGDRegressor 類, 這個類
    默認優(yōu)化的是均方差損失函數(shù)。 下面的代碼迭代了 50 代, 其學習率 為0.1( eta0=0.1 ) ,
    使用默認的 learning schedule ( 與前面的不一樣) , 同時也沒有添加任何正則項
    ( penalty = None ) :

    from sklearn.linear_model import SGDRegressorsgd_reg + SGDRregressor(n_iter=50, penalty=None, eta0=0.1)sgd_reg.fit(X,y.ravel())

    (3) 小批量梯度下降

    在迭代的每一步, 批量梯度使用整個訓(xùn)練集, 隨機梯度時候用僅僅一個實例, 在小批量梯度下降中, 它則使用一個隨機的小型實例集。 它比隨機梯度的主要優(yōu)點在于你可以通過矩陣運算的硬件優(yōu)化得到一個較好的訓(xùn)練表現(xiàn), 尤其當你使用 GPU 進行運算的時候。

    小批量梯度下降在參數(shù)空間上的表現(xiàn)比隨機梯度下降要好的多, 尤其在有大量的小型實例集
    時。 作為結(jié)果, 小批量梯度下降會比隨機梯度更靠近最小值。 但是, 另一方面, 它有可能陷
    在局部最小值中( 在遇到局部最小值問題的情況下, 和我們之前看到的線性回歸不一樣) 。

    圖4-11顯示了訓(xùn)練期間三種梯度下降算法在參數(shù)空間中所采用的路徑。 他們都接近最小值,
    但批量梯度的路徑最后停在了最小值, 而隨機梯度和小批量梯度最后都在最小值附近擺動。
    但是, 不要忘記, 批次梯度需要花費大量時間來完成每一步, 但是, 如果你使用了一個較好
    的 learning schedule , 隨機梯度和小批量梯度也可以得到最小值。

    2、邏輯回歸

    二分類模型,當估計概率大于50%的時候,模型預(yù)測該示例為正類,反之為負類。

    邏輯回歸是將線性回歸的得分函數(shù)通過sigmoid函數(shù)映射為0~1之間的概率值,使用交叉熵損失函數(shù)作為損失函數(shù),度量原始分布和預(yù)測分布的差別。

    該損失函數(shù)是合理的,因為當一個樣本為正例的時候,當p接近0的時候,-log(p)很大,也就是將正例判斷為負例的時候,損失函數(shù)會很大,當p接近于1的時候,-log(p)接近于0,損失函數(shù)會很小。

    整個訓(xùn)練集上的損失函數(shù)是所以實例的平均值,可以用一個表達式來統(tǒng)一表示,稱為對數(shù)損失函數(shù):

    但是這個損失函數(shù)對于求解最小化損失函數(shù)的 是沒有公式解的( 沒有等價的正態(tài)方程) 。
    但好消息是, 這個損失函數(shù)是凸的, 所以梯度下降( 或任何其他優(yōu)化算法) 一定能夠找到全
    局最小值( 如果學習速率不是太大, 并且你等待足夠長的時間) 。

    3、softmax回歸

    邏輯回歸是softmax回歸的二分類時的特殊情況,可以將映射函數(shù)從sigmoid變?yōu)閟oftmax就可以實現(xiàn)多分類,

    和 Logistic 回歸分類器一樣, Softmax 回歸分類器將估計概率最高( 它只是得分最高的類) 的
    那類作為預(yù)測結(jié)果, 如公式 4-21 所示。

    我們的目標是建立一個模型在目標類別上有著較高的概率,可以用交叉熵來定義當前的損失函數(shù),當模型對目標類得出了一個較低的概率,會懲罰該模型,交叉熵通常用于衡量待測類別和目標類別的匹配程度。


    練習題4
  • 如果你有一個數(shù)百萬特征的訓(xùn)練集,你應(yīng)該選擇哪種線性回歸訓(xùn)練算法?

    可以使用隨機梯度下降法或小批量梯度下降法,數(shù)據(jù)集太大基本無法使用全量梯度下降法,所需內(nèi)存太大。

  • 假設(shè)你訓(xùn)練集中特征的數(shù)值尺度(scale) 有著非常大的差異,哪種算法會受到影響?有
    多大的影響?對于這些影響你可以做什么?

    如果訓(xùn)練集的特征尺度差距太大,損失函數(shù)的等高線會呈橢圓狀,利用梯度下降來求最優(yōu)解的過程中會很難收斂,梯度方向變化很劇烈,收斂速度很慢,并且可能不會收斂到最優(yōu)點。

  • 訓(xùn)練 Logistic 回歸模型時,梯度下降是否會陷入局部最低點?

    當訓(xùn)練一個邏輯回歸模型的時候,梯度下降不會陷入局部最小值,因為損失函數(shù)是凸函數(shù)

  • 在有足夠的訓(xùn)練時間下,是否所有的梯度下降都會得到相同的模型參數(shù)?

    如果優(yōu)化問題是凸的(如線性回歸或邏輯回歸),和假設(shè)學習率不是很高,那么所有的梯度下降算法都會接近全球最優(yōu),最終生產(chǎn)出相當相似的模型。不過,除非你漸漸降低學習率,隨機GD和小批量GD永遠不會真正收斂;相反,它們會在全局最優(yōu)值附近來回跳躍。這意味著即使你讓它們運行的時間很長,這些梯度下降算法產(chǎn)生的結(jié)果會略有不同模型。

  • 假設(shè)你使用批量梯度下降法,畫出每一代的驗證誤差。當你發(fā)現(xiàn)驗證誤差一直增大,接
    下來會發(fā)生什么?你怎么解決這個問題?

    如果驗證誤差一直增大的話,一種可能就是學習率過大,算法發(fā)散,可以降低學習率,還有一種可能就是過擬合了,應(yīng)該早停訓(xùn)練。

  • 當驗證誤差升高時,立即停止小批量梯度下降是否是一個好主意?

    由于梯度下降的隨機性,不能保證在每輪迭代都會保證訓(xùn)練取得進展,如果馬上停止訓(xùn)練的時候,可能會過早停止而無法達到最佳狀態(tài),更好的選擇是定期保存模型,如果經(jīng)過很長一段時間仍然沒有改進的話,可以恢復(fù)到保存的最好模型。

  • 哪個梯度下降算法(在我們討論的那些算法中) 可以最快到達解的附近?哪個的確實會收斂?怎么使其他算法也收斂?

    隨機梯度下降法的訓(xùn)練和迭代速度最快,因為它只考慮一次訓(xùn)練一個實例,因此它通常是第一個到達全局最優(yōu)的附加的,然而只有批量梯度下降在給定足夠的時間的時候是收斂的,也就是隨機梯度下降和小批量梯度下降是都是收斂到最優(yōu)解的附近,除非學習率下降到非常小。

  • 假設(shè)你使用多項式回歸,畫出學習曲線,在圖上發(fā)現(xiàn)學習誤差和驗證誤差之間有著很大的間隙。這表示發(fā)生了什么?有哪三種方法可以解決這個問題?

    表明模型出現(xiàn)了過擬合的情況,在訓(xùn)練集上表現(xiàn)好,驗證集上表現(xiàn)不好

    增加訓(xùn)練集、正則化、dropout

  • 假設(shè)你使用嶺回歸,并發(fā)現(xiàn)訓(xùn)練誤差和驗證誤差都很高,并且?guī)缀跸嗟取D愕哪P捅憩F(xiàn)是高偏差還是高方差?這時你應(yīng)該增大正則化參數(shù) ,還是降低它?

    高偏差,可以降低正則化參數(shù)

  • 你為什么要這樣做:
    使用嶺回歸代替線性回歸?

    • 模型有正則化的時候會比沒有正則化的時候又更好的泛化性能,嶺回歸就是對模型的參數(shù)做了正則化,約束其幅值變化不能太大,否則會容易出現(xiàn)過擬合。

    Lasso 回歸代替嶺回歸?

    • Lasso回歸是L1正則化,也就是對模型參數(shù)的幅值正則化,該正則化也叫“稀疏選擇算子”,可以對重要的特征進行選擇,增加模型的可解釋性,使得更多不重要的特征的權(quán)值置為0,只保留重要的特征,且越重要權(quán)重越高。

    彈性網(wǎng)絡(luò)代替 Lasso 回歸?

  • 假設(shè)你想判斷一副圖片是室內(nèi)還是室外,白天還是晚上。你應(yīng)該選擇二個邏輯回歸分類
    器,還是一個 Softmax 分類器?

    可以選擇兩個邏輯回歸來實現(xiàn)

  • 在 Softmax 回歸上應(yīng)用批量梯度下降的早期停止法(不使用 Scikit-Learn) 。

  • 五、SVM

    支持向量機( SVM) 是個非常強大并且有多種功能的機器學習模型, 能夠做線性或者非線性
    的分類, 回歸, 甚至異常值檢測。 機器學習領(lǐng)域中最為流行的模型之一, 是任何學習機器學
    習的人必備的工具。 SVM 特別適合應(yīng)用于復(fù)雜但中小規(guī)模數(shù)據(jù)集的分類問題

    在 Scikit-Learn 庫的 SVM 類, 你可以用 C 超參數(shù)( 懲罰系數(shù)) 來控制這種平衡。

    import numpy as np from sklearn import datasets from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.svm import LinearSVCiris = datasets.load_iris() X = iris["data"][:, (2, 3)] # petal length, petal width y = (iris["target"] == 2).astype(np.float64) # Iris-Virginica svm_clf = Pipeline((("scaler", StandardScaler()),("linear_svc", LinearSVC(C=1, loss="hinge")),)) svm_clf.fit(X_scaled, y)Then, as usual, you can use the model to make predictions: svm_clf.predict([[5.5, 1.7]]) array([ 1.])

    logistics回歸分類器輸出的是概率,SVM分類器不會輸出每個類別的概率。

    作為一種選擇, 你可以在 SVC 類, 使用 SVC(kernel=”linear”, C=1) , 但是它比較慢, 尤其在
    較大的訓(xùn)練集上, 所以一般不被推薦。 另一個選擇是使用 SGDClassifier 類,
    即 SGDClassifier(loss=”hinge”, alpha=1/(m*C)) 。 它應(yīng)用了隨機梯度下降( SGD 見第四章)
    來訓(xùn)練一個線性 SVM 分類器。 盡管它不會和 LinearSVC 一樣快速收斂, 但是對于處理那些不
    適合放在內(nèi)存的大數(shù)據(jù)集是非常有用的, 或者處理在線分類任務(wù)同樣有用。

    利用SVM實現(xiàn)回歸:你可以使用 Scikit-Learn 的 LinearSVR 類去實現(xiàn)線性 SVM 回歸

    練習題5
  • 支持向量機背后的基本思想是什么

    支持向量機的背后的思想就是尋找具有最大間隔的分類平面,來對正負樣本進行分類。

  • 什么是支持向量

    支持向量就是在不改變分類平面方向的情況下來移動分類平面,分類平面會和樣本點有接觸,越過支持向量就會出現(xiàn)錯分的情況。

  • 當使用 SVM 時,為什么標準化輸入很重要?

    SVM是嘗試尋找出具有最大分類間隔的平面,所以如果不對輸入進行歸一化的話,SVM會更傾向于忽略小的特征,以大數(shù)量級的樣本為主導(dǎo)。

    SVM 對特征縮放比較敏感,可以看到圖 5-2:左邊的圖中,垂直的比例要更大于水平的
    比例,所以最寬的“街道”接近水平。但對特征縮放后(例如使用Scikit-Learn的StandardScaler) ,判定邊界看起來要好得多,如右圖。

  • 分類一個樣本時,SVM 分類器能夠輸出一個置信值嗎?概率呢?

    SVM分類器可以輸出測試示例與決策邊界之間的距離,可以用這個作為信心指數(shù),然后該分數(shù)不能直接轉(zhuǎn)換成分類估計概率。

  • 在一個有數(shù)百萬訓(xùn)練樣本和數(shù)百特征的訓(xùn)練集上,你是否應(yīng)該使用 SVM 原始形式或?qū)ε?
    形式來訓(xùn)練一個模型?
  • 該問題只適用于線性SVM,因為內(nèi)核化只能使用對偶形式,SVM的原始問題的計算復(fù)雜度是和實例數(shù)量m成正比的,對偶形式的計算復(fù)雜度處于m2m2m3m3之間,所以對于百萬以上的數(shù)據(jù)集,可以使用原始形式,因為對偶形式計算很慢。

  • 假設(shè)你用 RBF 核來訓(xùn)練一個 SVM 分類器,如果對訓(xùn)練集欠擬合:你應(yīng)該增大或者減
    小 γ 嗎?調(diào)整參數(shù) C 呢?
  • 如果訓(xùn)練集欠擬合的話,說明對誤差的懲罰太小,對模型的約束太小,可以增大C,欠擬合說明RBF核的標準差太大,可以減小標準差,即增大γγ

  • 使用現(xiàn)有的 QP 解決方案,你應(yīng)該怎么樣設(shè)置 QP 參數(shù)(H , f , A ,和 b ) 去解決
    一個軟間隔線性 SVM 分類器問題?

  • 在一個線性可分的數(shù)據(jù)集訓(xùn)練一個 LinearSVC ,并在同一個數(shù)據(jù)集上訓(xùn)練一
    個 SVC 和 SGDClassifier ,看它們是否產(chǎn)生了大致相同效果的模型。

  • 在 MNIST 數(shù)據(jù)集上訓(xùn)練一個 SVM 分類器。因為 SVM 分類器是二元的分類,你需要使
    用一對多(one-versus-all) 來對 10 個數(shù)字進行分類。你可能需要使用小的驗證集來調(diào)
    整超參數(shù),以加快進程。最后你能達到多少準確度?

  • 在加利福尼亞住宅(California housing) 數(shù)據(jù)集上訓(xùn)練一個 SVM 回歸模型

  • 六、決策樹

    練習題6
  • 在 100 萬例訓(xùn)練集上訓(xùn)練(沒有限制) 的決策樹的近似深度是多少?

    包含m個樹葉的平衡良好的二叉樹的深度等于log2(m),四舍五入。一個二叉決策樹(一個只做二叉決策的樹,就像ScikitLearn中的所有樹一樣)會在訓(xùn)練結(jié)束時或多或少地保持平衡,每次訓(xùn)練都有一片葉子實例,如果訓(xùn)練沒有限制。因此,如果訓(xùn)練集包含一百萬情況下,決策樹的深度log2(10^6)≈20以來(實際上更多樹一般不會完全平衡)

  • 節(jié)點的基尼指數(shù)比起它的父節(jié)點是更高還是更低?它是通常情況下更高/更低,還是永遠
    更高/更低?

    節(jié)點的基尼指數(shù)通常低于其父節(jié)點,這是由CART數(shù)的訓(xùn)練損失函數(shù)所確定的,每個節(jié)點經(jīng)過最優(yōu)屬性分割之后,子節(jié)點的基尼指數(shù)之和都會小于父節(jié)點的基尼指數(shù),然而如果一個孩子節(jié)點的基尼指數(shù)比另外一個的基尼指數(shù)小,則可能比其父節(jié)點的基尼不純度更大,但是其基尼不純度的增加肯定小于另外孩子基尼不純度的減少。

  • 如果決策樹過擬合了,減少最大深度是一個好的方法嗎?

    是一個好方法,可以對模型進行約束,使其規(guī)范化

  • 如果決策樹對訓(xùn)練集欠擬合了,嘗試縮放輸入特征是否是一個好主意?

    決策樹對屬性的數(shù)值縮放并不敏感,數(shù)值縮放不會影響其最優(yōu)分裂點的選擇,

  • 如果對包含 100 萬個實例的數(shù)據(jù)集訓(xùn)練決策樹模型需要一個小時,在包含 1000 萬個實
    例的培訓(xùn)集上訓(xùn)練另一個決策樹大概需要多少時間呢?

    決策樹的計算復(fù)雜度為O(n×mlog(m))O(n×mlog(m))所以如果訓(xùn)練集增加了10倍,復(fù)雜度會增加以下倍數(shù)K=(n×10m×log(10m))/(n×m×log(m)=10×log(10m)/log(m)K=(n×10m×log(10m))/(n×m×log(m)=10×log(10m)/log(m),如果m=10^6,K=11.7,大概需要11.7小時

  • 如果你的訓(xùn)練集包含 100,000 個實例,設(shè)置 presort=True 會加快訓(xùn)練的速度嗎?

  • 只有當數(shù)據(jù)集小于幾千時,才會加速訓(xùn)練實例。如果它包含100,000個實例,那么設(shè)置presort=True的訓(xùn)練將會慢得多。

    七、集成學習

    接下來的代碼創(chuàng)建和訓(xùn)練了在 sklearn 中的投票分類器。 這個分類器由三個不同的分類器組成
    ( 訓(xùn)練集是第五章中的 moons 數(shù)據(jù)集) :

    >>> from sklearn.ensemble import RandomForestClassifier >>> from sklearn.ensemble import VotingClassifier >>> from sklearn.linear_model import LogisticRegression >>> from sklearn.svm import SVC >>> log_clf = LogisticRegression() >>> rnd_clf = RandomForestClassifier() >>> svm_clf = SVC() >>> voting_clf = VotingClassifier(estimators=[('lr', log_clf), ('rf', rnd_clf), >>> (' svc', svm_clf)],voting='hard') >>> voting_clf.fit(X_train, y_train)

    讓我們看一下在測試集上的準確率:

    >>> from sklearn.metrics import accuracy_score >>> for clf in (log_clf, rnd_clf, svm_clf, voting_clf): >>> clf.fit(X_train, y_train) >>> y_pred = clf.predict(X_test) >>> print(clf.__class__.__name__, accuracy_score(y_test, y_pred)) LogisticRegression 0.864 RandomForestClassifier 0.872 SVC 0.888 VotingClassifier 0.896

    投票分類器比其他單獨的分類器表現(xiàn)的都要好

    sklearn中的bagging

    接下來的代碼訓(xùn)練了一個 500 個決策樹分類器的集成, 每一個都是在數(shù)據(jù)集上有放回采樣 100 個訓(xùn)練實例下進行訓(xùn)練

    n_jobs 參數(shù)告訴 sklearn 用于訓(xùn)練和預(yù)測所需要 CPU核的數(shù)量。 ( -1 代表著 sklearn 會使用所有空閑核) :

    >>>from sklearn.ensemble import BaggingClassifier >>>from sklearn.tree import DecisionTreeClassifier >>>bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,max_samples=100, bootstrap=True, n_jobs=-1) >>>bag_clf.fit(X_train, y_train) >>>y_pred = bag_clf.predict(X_test)

    圖 7-5 對比了單一決策樹的決策邊界和 Bagging 集成 500 個樹的決策邊界, 兩者都在 moons
    數(shù)據(jù)集上訓(xùn)練。 正如你所看到的, 集成的分類比起單一決策樹的分類產(chǎn)生情況更好: 集成有
    一個可比較的偏差但是有一個較小的方差( 它在訓(xùn)練集上的錯誤數(shù)目大致相同, 但決策邊界
    較不規(guī)則) 。

    out-of-bag評價:

    對于 Bagging 來說, 一些實例可能被一些分類器重復(fù)采樣, 但其他的有可能不會被采樣。 BaggingClassifier 默認采樣。 BaggingClassifier 默認是有放回的采樣 m 個實例( bootstrap=True ) , 其中 m 是訓(xùn)練集的大小, 這意味著平均下來只有63%的訓(xùn)練實例被每個分類器采樣, 剩下的37%個沒有被采樣的訓(xùn)練實例就叫做 Out-of-Bag 實例。 注意對于每一個的分類器它們的 37% 不是相同的。

    因為在訓(xùn)練中分類器從來沒有看到過 oob 實例, 所以它可以在這些實例上進行評估, 而不需要單獨的驗證集或交叉驗證。 你可以拿出每一個分類器的 oob 來評估集成本身。

    在 sklearn 中, 你可以在訓(xùn)練后需要創(chuàng)建一個 BaggingClassifier 來自動評估時設(shè)
    置 oob_score=True 來自動評估。 接下來的代碼展示了這個操作。 評估結(jié)果通過變
    量 oob_score_ 來顯示:

    >>> bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,bootstrap=T rue, n_jobs=-1, oob_score=True) >>> bag_clf.fit(X_train, y_train) >>> bag_clf.oob_score_ 0.93066666666666664

    Adabooost:

    >>>from sklearn.ensemble import AdaBoostClassifier >>>ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200,algorithm="SAMME.R", learning_rate=0.5) >>>ada_clf.fit(X_train, y_train)

    如果你的 Adaboost 集成過擬合了訓(xùn)練集, 你可以嘗試減少基分類器的數(shù)量或者對基分類器使
    用更強的正則化。

    GBDT:

    梯度提升也是通過向集成中逐步增加分類器運行的, 每一個分類器都修正之前的分類結(jié)果。 然而, 它并不像 Adaboost 那樣每一次迭代都更改實例的權(quán)重, 這個方法是去使用新的分類器去擬合前面分類器預(yù)測的殘差。

    梯度提升回歸樹(GBRT):

    # 首先用DecisionTreeRegressor來擬合訓(xùn)練集 from sklearn.tree import DecisionTreeRegressor tree_reg1=DecisionTreeRgressor(max_depth=2) tree_reg1.fit(X,y)# 之后在第一個分類器的殘差上訓(xùn)練第二個分類器 y2=y-tree_reg1.predict(X) tree_reg2=DecisionTreeRegressor(max_depth=2) tree_reg2.fit(X,y2)# 隨后在第二個分類器的殘差上訓(xùn)練第三個分類器 y3 = y2 - tree_reg1.predict(X) tree_reg3 = DecisionTreeRegressor(max_depth=2) tree_reg3.fit(X, y3)# 現(xiàn)在我們有了一個包含三個回歸器的集成。 它可以通過集成所有樹的預(yù)測來在一個新的實例 上進行預(yù)測。 y_pred=sum(tree.predict(X_new) for tree in (tree_reg1,tree_reg2,tree_reg3))

    圖7-9在左欄展示了這三個樹的預(yù)測, 在右欄展示了集成的預(yù)測。 在第一行, 集成只有一個
    樹, 所以它與第一個樹的預(yù)測相似。 在第二行, 一個新的樹在第一個樹的殘差上進行訓(xùn)練。
    在右邊欄可以看出集成的預(yù)測等于前兩個樹預(yù)測的和。 相同的, 在第三行另一個樹在第二個
    數(shù)的殘差上訓(xùn)練。 你可以看到集成的預(yù)測會變的更好。

    sklearn中可以使用GradientBoostingRegressor來訓(xùn)練梯度回歸樹,與RandomForestClassifier 相似, 它也有超參數(shù)去控制決策樹的生長( 例如 max_depth , min_samples_leaf 等等) , 也有超參數(shù)去控制集成訓(xùn)練, 例如基分類器的數(shù)量( n_estimators ) 。 接下來的代碼創(chuàng)建了與之前相同的集成:

    from sklearn.ensemble import GradientBoostingRegressor gbrt = GradientBoostingRegressor(max_depth=2,n_estimators=3,learning_rate=1.0) gbrt.fit(X,y)

    超參數(shù)learning_rate確立了每個樹的貢獻,如果你把它設(shè)置為一個很小的樹, 例如 0.1, 在
    集成中就需要更多的樹去擬合訓(xùn)練集, 但預(yù)測通常會更好。 這個正則化技術(shù)叫做 shrinkage

    圖 7-10 展示了兩個在低學習率上訓(xùn)練的 GBRT 集成: 其中左面是一個沒有足夠樹去擬合訓(xùn)練
    集的樹, 右面是有過多的樹過擬合訓(xùn)練集的樹

    下面的代碼用120個樹訓(xùn)練了一個GBRT集成,然后在訓(xùn)練的每個階段驗證錯誤以找到樹的最佳數(shù)量,最后使用GBRT樹的最優(yōu)數(shù)量訓(xùn)練另一個集成。

    >>>import numpy as np >>>from sklearn.model_selection import train_test_split >>>from sklearn.metrics import mean_squared_error >>>X_train, X_val, y_train, y_val = train_test_split(X, y) >>>gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=120) >>>gbrt.fit(X_train, y_train) >>>errors = [mean_squared_error(y_val, y_pred) for y_pred in gbrt.staged_predict(X_val)] >>>bst_n_estimators = np.argmin(errors) >>>gbrt_best = GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators) >>>gbrt_best.fit(X_train, y_train)
    練習題7
  • 如果你在相同訓(xùn)練集上訓(xùn)練 5 個不同的模型,它們都有 95% 的準確率,那么你是否可以
    通過組合這個模型來得到更好的結(jié)果?如果可以那怎么做呢?如果不可以請給出理由。

    可以使用集成學習并結(jié)合投票規(guī)則來獲得更好的準確率,集成學習的基學習器有很大的不同的時候會有較好的投票結(jié)果,利用不同的數(shù)據(jù)集學到的基學習器的組合同樣可以獲得較好的效果。

  • 軟投票和硬投票分類器之間有什么區(qū)別?

    硬投票分類器只計算集合中每個分類器的投票,并選擇得到最多選票的類,軟投票分類器計算每個類的平均估計類概率,并選擇概率最高的類,也就是給置信度高的類更高的權(quán)重,但是前提是可以得到每個類的概率。

  • 是否有可能通過分配多個服務(wù)器來加速 bagging 集成系統(tǒng)的訓(xùn)練?pasting 集成,boosting 集成,隨機森林,或 stacking 集成怎么樣?

    boosting集成是串行生成的基分類器,不能分布式進行。
    bagging、pasting、stacking都可以并行進行

  • out-of-bag 評價的好處是什么?

    在包外評估中,包外集成中的每個預(yù)測器都使用它沒有經(jīng)過訓(xùn)練的實例進行評估(它們被保留了下來)。這樣就可以對集成進行相當公正的評估,而不需要額外的驗證集。這樣,您就有了更多可用的實例來進行培訓(xùn),您的集成可以稍微好一些。

  • 是什么使 Extra-Tree 比規(guī)則隨機森林更隨機呢?這個額外的隨機有什么幫助呢?那這個
    Extra-Tree 比規(guī)則隨機森林誰更快呢?

    當您在隨機森林中種植一棵樹時,只考慮在每個節(jié)點上分割特征的一個隨機子集。對于額外樹來說也是如此,但是它們更進一步:不像常規(guī)的決策樹那樣搜索可能的最佳閾值,而是對每個特性使用隨機閾值。這種額外的隨機性就像一種正則化的形式:如果一個隨機森林超過了訓(xùn)練數(shù)據(jù),額外的樹可能會表現(xiàn)得更好。此外,由于額外的樹不會搜索最好的閾值,它們比隨機森林訓(xùn)練的速度要快得多。然而,它們在進行預(yù)測時既不比隨機森林快也不慢。

  • 如果你的 Adaboost 模型欠擬合,那么你需要怎么調(diào)整超參數(shù)?

    增加樣本量、減小正則化程度,提高模型速度

  • 如果你的梯度提升過擬合,那么你應(yīng)該調(diào)高還是調(diào)低學習率呢?

    降低學習率,或使用早停的方法來尋找正確數(shù)量的基學習器。

  • 八、降維

    PCA:常用的線性降維方法它的目標是通過某種線性投影,將高維的數(shù)據(jù)映射到低維的空間中表示,即把原先的n個特征用數(shù)目更少的m個特征取代,新特征是舊特征的線性組合。并期望在所投影的維度上數(shù)據(jù)的方差最大,盡量使新的m個特征互不相關(guān)。從舊特征到新特征的映射捕獲數(shù)據(jù)中的固有變異性。以此使用較少的數(shù)據(jù)維度,同時保留住較多的原數(shù)據(jù)點的特性。

    很多機器學習的問題都會涉及到有著幾千萬甚至數(shù)百萬維的特征的訓(xùn)練實例,這會使得訓(xùn)練過程非常緩慢,同時很難找到一個很好的解,也稱為維數(shù)災(zāi)難。

    降維可以加快訓(xùn)練速度,也可以提高數(shù)據(jù)可視化的程度。

    PCA:將數(shù)據(jù)投影到具有最大方差的坐標軸上,可以損失更少的信息,也可以使得原始數(shù)據(jù)集投影到該軸上的均方距離最小。

    • 首先尋找具有最大方差的軸:最大化的保留原始數(shù)據(jù)的信息

    • 之后尋找和第一條軸正交的軸作為第二條軸,保證可以獲得最大的殘差

    備注:主成分的方向不穩(wěn)定: 如果您稍微打亂一下訓(xùn)練集并再次運行 PCA, 則某些新PC 可能會指向與原始 PC 方向相反。 但是, 它們通常仍位于同一軸線上。 在某些情況下, 一對 PC 甚至可能會旋轉(zhuǎn)或交換, 但它們定義的平面通常保持不變。

    如何找到主成分:利用奇異值分解SVD對矩陣進行分解,

    X_centered=X-X.mean(axis=0) U,s,V=np.linalg.svd(X_centered) c1=V.T[:,0] c2=V.T[:,1]

    PCA 假定數(shù)據(jù)集以原點為中心。 正如我們將看到的, Scikit-Learn 的 PCA 類負責
    為您的數(shù)據(jù)集中心化處理。 但是, 如果您自己實現(xiàn) PCA( 如前面的示例所示) , 或者如
    果您使用其他庫, 不要忘記首先要先對數(shù)據(jù)做中心化處理。

    投影:一旦確定了所有的主成分,可以選擇將數(shù)據(jù)集投影到由前d個主成分構(gòu)成的超平面上,從而將數(shù)據(jù)集降至d維,為了將訓(xùn)練集投影到超平面上, 可以簡單地通過計算訓(xùn)練集矩陣 X 和 Wd 的點積, Wd 定義為包含前 d 個主成分的矩陣( 即由 V^T 的前 d 列組成的矩陣)

    方差解釋率:另一個非常有用的信息是每個主成分的方差解釋率, 可以通過explained_variance_ratio_變量獲得,表示位于每個主成分軸上的數(shù)據(jù)集方差的比例。

    print(pca.explained_variance_ratio_) array([0.84248607, 0.14631839])

    這表明, 84.2% 的數(shù)據(jù)集方差位于第一軸, 14.6% 的方差位于第二軸。 第三軸的這一比例不
    到1.2%, 因此可以認為它可能沒有包含什么信息。

    通常我們傾向于選擇加起來到方差解釋率能夠達到足夠占比( 例如 95%) 的維度的數(shù)量, 而
    不是任意選擇要降低到的維度數(shù)量。 當然, 除非您正在為數(shù)據(jù)可視化而降低維度 – 在這種情
    況下, 您通常希望將維度降低到 2 或 3。

    其他降維方法:

    還有很多其他的降維方法, Scikit-Learn 支持其中的好幾種。 這里是其中最流行的:

    • 多維縮放MDS:在嘗試保持實例之間距離的同時降低了維度( 參見圖 8-13)

    • t-分布隨機鄰域嵌入( t-Distributed Stochastic Neighbor Embedding, t-SNE) 可以用于降低維?度, 同時試圖保持相似的實例臨近并將不相似的實例分開。 它主要用于可視化,尤其是用于可視化高維空間中的實例( 例如, 可以將MNIST圖像降維到 2D 可視化) 。

    • 線性判別分析( Linear Discriminant Analysis, LDA) 實際上是一種分類算法, 但在訓(xùn)練過程中, 它會學習類之間最有區(qū)別的軸, 然后使用這些軸來定義用于投影數(shù)據(jù)的超平面。 LDA 的好處是投影會盡可能地保持各個類之間距離, 所以在運行另一種分類算法( 如 SVM 分類器) 之前, LDA 是很好的降維技術(shù)

    練習題8
  • 減少數(shù)據(jù)集維度的主要動機是什么?主要缺點是什么?

    主要動機:加速訓(xùn)練,去除噪聲和冗余特征,使得算法性能更好;可以可視化來尋找更好的特征;可以節(jié)省空間。

    主要缺點:會丟失部分信息,可能降低后續(xù)算法的性能;是計算密集型的;增加了機器學習管道的復(fù)雜性;降低可解釋性

  • 什么是維度爆炸?

    維度爆炸是指高維空間中出現(xiàn)了許多低維空間不存在的問題,在機器學習中,一個常見的表現(xiàn)是,隨機采樣的高維向量通常非常稀疏,增加了過度擬合的風險,使得在沒有大量訓(xùn)練數(shù)據(jù)的情況下很難識別數(shù)據(jù)中的模式。

  • 一旦對某數(shù)據(jù)集降維,我們可能恢復(fù)它嗎?如果可以,怎樣做才能恢復(fù)?如果不可以,
    為什么?

    一旦數(shù)據(jù)集通過降維降到了一個較小的維度,就幾乎不會是想完全的復(fù)現(xiàn),因為在維度減小的過程中,已經(jīng)有信息丟失了,雖然PCA有逆過程,但可以重構(gòu)一個和原始數(shù)據(jù)集比較相似的數(shù)據(jù)集,但是t-SNE沒有。

  • PCA 可以用于降低一個高度非線性對數(shù)據(jù)集嗎?

    PCA可以顯著降低大多數(shù)數(shù)據(jù)集的維數(shù),即使他們是高度非線性的,因為它至少可以消除無用的維度,然而如果每個維度都很有用,那么利用PCA之后丟失很多的信息。

  • 假設(shè)你對一個 1000 維的數(shù)據(jù)集應(yīng)用 PCA,同時設(shè)置方差解釋率為 95%,你的最終數(shù)據(jù)
    集將會有多少維?

    這是一個棘手的問題:它取決于數(shù)據(jù)集。讓我們來看兩個極端的例子。首先,假設(shè)數(shù)據(jù)集由幾乎完全對齊的點組成。在這種情況下,PCA可以將數(shù)據(jù)集減少到一個維度,同時仍然保留95%的方差。現(xiàn)在假設(shè)數(shù)據(jù)集由完全隨機的點組成,散布在1000個點周圍維度。在這種情況下,所有1000維都需要保持95%的方差。所以答案是,它取決于數(shù)據(jù)集,它可以是1到1000之間的任何數(shù)字。把被解釋的方差作圖成維數(shù)的函數(shù)是得到a的一種方法數(shù)據(jù)集固有維數(shù)的粗略概念

  • 在什么情況下你會使用普通的 PCA,增量 PCA,隨機 PCA 和核 PCA?

    常規(guī)PCA是默認值,但它只在數(shù)據(jù)集適合內(nèi)存的情況下工作。增量PCA對于不適合內(nèi)存的大型數(shù)據(jù)集有用,但它比常規(guī)PCA要慢,所以如果數(shù)據(jù)集適合內(nèi)存你應(yīng)該喜歡常規(guī)的PCA。

    增量PCA也適用于在線任務(wù),當您需要動態(tài)應(yīng)用PCA時,每當一個新實例到達時。隨機當您想要大大減少維度并且數(shù)據(jù)集適合時,PCA是有用的記憶;在這種情況下,它比普通PCA快得多。

    最后,核PCA是對非線性數(shù)據(jù)集有用。

  • 你該如何評價你的降維算法在你數(shù)據(jù)集上的表現(xiàn)?

    直觀地說,如果一個降維算法在不丟失太多信息的情況下從數(shù)據(jù)集中消除了大量的維數(shù),那么它的性能就會很好。一種測量方法是應(yīng)用反向變換并測量重構(gòu)誤差。然而,并不是所有的降維算法都提供了反向轉(zhuǎn)換。或者,如果您使用降維作為另一種機器學習算法(例如,隨機森林分類器)之前的預(yù)處理步驟,那么您可以簡單地測量第二種算法的性能;如果降維不會丟失太多信息,那么算法的性能應(yīng)該與使用原始數(shù)據(jù)集時一樣好。

  • 將兩個不同的降維算法串聯(lián)使用有意義嗎?

    將兩種不同的降維算法串聯(lián)起來是絕對有意義的。一個常見的例子是使用PCA快速擺脫大量無用的維數(shù),然后應(yīng)用另一種慢得多的降維算法,如LLE。這種分兩步的方法可能會產(chǎn)生與僅使用LLE相同的性能,但只是一小部分時間。

  • 總結(jié)

    以上是生活随笔為你收集整理的hands-on Machine Learning with sklearn的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。