<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 一、機器學習基礎 有一天,人工智能將像看非洲平原上的化石骨架一樣回望我們。 一只生活在塵土中的直立猿,用粗俗的語言和工具滅絕。 ——內森·貝特曼(Nathan Bateman),前 Machina(電影節 2014) 這句話似乎夸大了核心內容,難以理解,但是隨著技術和科學的進步,誰知道呢? 作為一個物種,我們一直夢想創造出智能的,具有自我意識的機器。 隨著研究,技術和計算能力民主化的最新發展,**人工智能**(**AI**),**機器學習**(**ML**) 深度學習已在技術人員和一般人群中引起了極大的關注和炒作。 盡管好萊塢承諾的未來值得商,,但我們已經開始在日常生活中看到和使用智能系統。 從諸如 Google Now,Siri,Alexa 和 Cortana 之類的智能對話引擎,到無人駕駛汽車,我們正在日常工作中逐漸接受這種智能技術。 隨著我們步入學習機器的新時代,重要的是要了解基本概念和概念已經存在了一段時間,并且已經被地球上的聰明人不斷改進。 眾所周知,全球數據的 90% 是在最近幾年中創建的,并且我們將以越來越高的速度繼續創建更多的數據。 機器學習,深度學習和人工智能領域幫助我們利用這些海量數據來解決各種現實問題。 本書分為三個部分。 在第一部分中,我們將開始與 AI,ML 和深度學習相關的基本概念和術語,然后是深度學習架構的深入細節。 本章為讀者提供了有關 ML 基本概念的快速入門,然后在后續各章中開始進行深度學習。 本章涵蓋以下方面: * ML 簡介 * 機器學習方法 * CRISP-DM - 機器學習項目的工作流程 * ML 流水線 * 探索性數據分析 * 特征提取與工程 * 特征選擇 本書的每一章都基于前幾章的概念和技術。 精通 ML 和深度學習基礎知識的讀者可以選擇他們認為必要的主題,但建議順序閱讀這些章節。 您可以在 [GitHub 存儲庫](https://github.com/dipanjanS/hands-on-transfer-learning-with-python)中的`Chapter 1`文件夾中快速閱讀本章的代碼。 可以根據需要參考本章。 # 為什么要 ML? 我們生活的世界中,我們的日常工作涉及與數字世界的多個接觸點。 我們有計算機協助我們進行通訊,旅行,娛樂等。 我們一直無縫使用的數字在線產品(應用,網站,軟件等)幫助我們避免了平凡而又重復的任務。 這些軟件已由程序員明確使用每條指令進行編程以使這些軟件能夠執行定義的任務,并使用計算機編程語言(如 C,C++,Python,Java 等)開發。 下圖描述了計算設備(計算機,電話等)與帶有輸入和定義的輸出的顯式編程的軟件應用之間的典型交互: ![](https://img.kancloud.cn/6b/2f/6b2f7ded59d02f2264ea73255e9f0c4b_1425x747.png) 傳統編程范例 盡管當前的范例已經在幫助我們開發出驚人的復雜軟件/系統,以一種非常有效的方式來解決來自不同領域和方面的任務,但它們仍需要有人為此類程序定義并編寫明確的規則才能工作。 這些任務對于計算機來說很容易解決,但對人類來說卻是困難或費時的。 例如,執行復雜的計算,存儲大量數據,通過龐大的數據庫進行搜索等等都是可以在定義規則后由計算機有效執行的任務。 然而,還有另一類問題可以由人類直觀地解決,但是很難編程。 對象識別,玩游戲等問題對我們來說很自然,但很難用一組規則來定義。 艾倫·圖靈(Alan Turing)在他的地標性論文[《計算機械和智能》](https://www.csee.umbc.edu/courses/471/papers/turing.pdf)中介紹了**圖靈測試**,討論了通用計算機以及它們是否能夠執行此類任務。 這種體現了通用計算思想的新范式在更廣泛的意義上促成了 AI 的產生。 這種新的范式,更好地稱為 ML 范式,是計算機或機器從經驗(類似于人類學習)中學習來解決任務的方法,而不是經過明確編程才能做到的。 因此,人工智能是研究的一個涵蓋領域,而機器學習和深度學習是其中的特定研究子領域。 AI 是一個通用字段,還包括其他子字段,可能涉及也可能不涉及學習(例如,參見符號 AI)。 在本書中,我們將把時間和精力僅用于 ML 和深度學習。 人工智能,機器學習和深度學習的范圍可以可視化如下: ![](https://img.kancloud.cn/f7/21/f7217a181d2888b22aca0d48ee9014af_937x919.png) 人工學習的范圍,以機器學習和深度學習為子領域 # 正式定義 由湯姆·米切爾(Tom Mitchell)提出的 ML 的正式定義解釋如下。 如果 *P* 所衡量的計算機程序在 *T* 上的表現,會隨著經驗 *E* 而提高,該計算機程序據稱可以從 *E* 的經驗中以表現指標 *P* 學習某些任務 *T*。 該定義以非常簡潔的方式很好地捕捉了 ML 的本質。 讓我們以現實世界為例,以更好地理解它。 讓我們考慮一個任務(*T*)是識別垃圾郵件。 現在,我們可能會向有關垃圾郵件和非垃圾郵件的系統提供許多示例(或經驗),從中可以學習而不是對其進行明確編程。 然后可以在學習到的識別垃圾郵件的任務上對程序或系統的表現進行測量(*P*)。 有趣,不是嗎? # 淺層和深度學習 因此,ML 的任務是從訓練示例中識別模式,并將這些學習到的模式(或表示形式)應用于新的看不見的數據。 ML 有時也稱為**淺層學習**,因為它學習*單層表示形式*的性質(在大多數情況下)。 這使我們想到“表示層是什么”和“什么是深度學習”,我們將在后續章節中回答這些問題。 讓我們快速了解一下深度學習。 深度學習是機器學習的一個子領域,它涉及從訓練示例中學習連續的有意義的表示,以解決給定的任務。 深度學習與人工神經網絡緊密相關,人工神經網絡由一個接一個的堆疊的多層組成,這些層捕獲連續的表示。 如前所述,不要擔心是否難以理解和理解,我們將在后續章節中更深入地介紹。 由于我們正在生成和收集的數據量以及更快的計算能力,ML 已成為流行語。 在以下各節中,讓我們更深入地研究 ML。 # 機器學習技術 ML 是 AI 的一個流行子領域,涵蓋了非常廣泛的領域。 如此受歡迎的原因之一是在其能力范圍內的復雜算法,技術和方法的綜合工具箱。 多年來,該工具箱已經得到開發和改進,并且正在不斷研究新的工具箱。 為了明智地理解和使用 ML 工具箱,請考慮以下幾種分類方法。 基于人工監督量的分類: * **監督學習**:此類學習涉及人為監督。 在監督學習下的算法利用訓練數據和相關的輸出來學習兩者之間的映射,并將其應用于看不見的數據。 分類和回歸是監督學習算法的兩種主要類型。 * **無監督學習**:此類算法嘗試從輸入數據中學習固有的潛在結構,模式和關系,而沒有任何關聯的輸出/標簽(人工監督)。 聚類,降維,關聯規則挖掘等是無監督學習算法的幾種主要類型。 * **半監督學習**:此類算法是監督學習和無監督學習的混合體。 在這種情況下,該算法可處理少量帶標簽的訓練數據和更多未標記的數據。 因此創造性地利用了監督和非監督方法來解決給定的任務。 * **強化學習**:這類算法與有監督和無監督學習方法有些不同。 這里的中心實體是一個智能體,它會在一段時間內進行訓練,同時與環境互動以最大化獎勵/獎勵。 智能體基于與環境的交互所獲得的獎勵/懲罰,反復學習和更改策略/策略。 根據數據可用性進行分類: * **批量學習**:這也稱為**離線學習**。 當所需的訓練數據可用時,將使用這種類型的學習,并且可以在部署到生產/現實世界中之前對模型進行訓練和微調。 * **在線學習**:顧名思義,在這種情況下,一旦數據可用,學習就不會停止。 而是在這種情況下,將數據以小批量的形式輸入到系統中,并且訓練過程將使用新的一批數據繼續進行。 前面討論的分類為我們提供了如何組織,理解和利用 ML 算法的抽象視圖。 將它們分類的最常見方法是有監督和無監督學習算法。 讓我們更詳細地介紹這兩個類別,因為這將有助于我們開始進一步的高級主題,稍后再進行介紹。 # 監督學習 監督學習算法是一類利用數據樣本(也稱為**訓練樣本**)和相應的輸出(或**標簽**)推斷兩者之間映射函數的算法。 推斷的映射函數或習得函數是此訓練過程的輸出。 然后,將習得函數用于正確映射新的和看不見的數據點(輸入元素)以測試習得函數的表現。 監督學習算法的一些關鍵概念如下: * **訓練數據集**:在訓練過程中使用的訓練樣本和相應的輸出稱為**訓練數據**。 形式上,訓練數據集是一個由兩個元素組成的元組,由輸入元素(通常是向量)和相應的輸出元素或信號組成。 * **測試數據集**:用于測試學習函數表現的未知數據集。 該數據集也是一個包含輸入數據點和相應輸出信號的二元組。 該集合中的數據點不用于訓練階段(此數據集也進一步分為驗證集合;我們將在后續章節中對此進行詳細討論)。 * **習得函數**:這是訓練階段的輸出。 也稱為*推斷函數*或*模型*。 根據訓練數據集中的訓練示例(輸入數據點及其對應的輸出)推斷此函數。 理想的模型/習得函數將以這樣的方式學習映射,即可以將結果也推廣到看不見的數據。 有多種可用的監督學習算法。 根據用例需求,可以將它們主要分類為分類和回歸模型。 # 分類 簡而言之,這些算法可幫助我們回答*客觀*問題或*是/否*預測。 例如,“這些算法在這樣的場景下有用嗎”或“該腫瘤會癌變嗎”等。 形式上,分類算法的主要目標是根據輸入數據點預測本質上屬于分類的輸出標簽。 輸出標簽本質上是分類的; 也就是說,它們每個都屬于離散的類或類別。 **Logistic 回歸**,**支持向量機**(**SVM**),**神經網絡**,**隨機森林**, **K 最近鄰**(**KNN**),**決策樹**等是一些流行的分類算法。 假設我們有一個真實的用例來評估不同的汽車模型。 為簡單起見,讓我們假設該模型可以根據多個輸入訓練樣本預測每種汽車模型的輸出是可接受的還是不可接受的。 輸入的訓練樣本具有諸如購買價格,門數,容量(以人數計)和安全性的屬性。 除類標簽之外的級別將每個數據點表示為可接受或不可接受。 下圖描述了即將出現的二分類問題。 分類算法將訓練樣本作為輸入以準備監督模型。 然后,利用該模型來預測新數據點的評估標簽: ![](https://img.kancloud.cn/dd/f6/ddf65539334b6eabdeacb99972a7442d_1216x538.png) 監督學習:用于汽車模型評估的二分類 由于在分類問題中輸出標簽是離散類,因此如果只有兩個可能的輸出類,則該任務稱為**二分類問題**,否則稱為多類分類。 預測明天是否下雨將是一個二分類問題(輸出是“是”或“否”),而從掃描的手寫圖像中預測數字將是具有 10 個標簽(零到九個可能的輸出標簽)的多類分類。 。 # 回歸 此類監督學習算法有助于我們回答*數量*或*定量*類型的問題。 正式而言,回歸模型的關鍵目標是值的估計。 在這種情況下,輸出標簽本質上是連續的(相對于分類而言是離散的)。 在回歸問題的情況下,輸入數據點稱為*自變量*或*解釋變量*,而輸出稱為*因變量*。 還使用訓練數據樣本來訓練回歸模型,該訓練數據樣本包括輸入(或獨立)數據點以及輸出(或相關)信號。 線性回歸,多元回歸,回歸樹等是一些監督式回歸算法。 可以基于建模模型如何對因變量和自變量之間的關系建模來進一步分類。 **簡單線性回歸**模型適用于單個自變量和單個因變量。 **普通最小二乘**(**OLS**)回歸是一種流行的線性回歸模型。 多元回歸或多元回歸是只有一個因變量的地方,而每個觀察值都是由多個解釋變量組成的向量。 多項式回歸模型是多元回歸的一種特殊情況。 在此,因變量被建模為自變量的第 n 次冪。 由于多項式回歸模型擬合或映射因變量和自變量之間的非線性關系,因此這些也稱為**非線性回歸**模型。 以下是線性回歸的示例: ![](https://img.kancloud.cn/7e/b9/7eb959a1a8564890426c2db356ed4f4c_676x415.png) 監督學習:線性回歸 為了理解不同的回歸類型,讓我們考慮一個真實的用例,它基于汽車的速度來估計汽車的停止距離。 在這里,根據我們擁有的訓練數據,我們可以將停車距離建模為速度的線性函數或汽車速度的多項式函數。 請記住,主要目的是在不過擬合訓練數據本身的情況下最大程度地減少誤差。 上圖描述了線性擬合,而下圖描述了同一數據集的多項式擬合: ![](https://img.kancloud.cn/6f/42/6f4244ca50d64230d25dae7255f228c0_700x450.png) 監督學習:多項式回歸 # 無監督學習 顧名思義,此類算法無需監督即可學習/推斷概念。 與監督學習算法基于包含輸入數據點和輸出信號的訓練數據集推斷映射函數不同,無監督算法的任務是在訓練數據中查找模式和關系,而訓練數據集中沒有可用的輸出信號。 這類算法利用輸入數據集來檢測模式,并挖掘規則或組/集群數據點,以便從原始輸入數據集中提取有意義的見解。 當我們沒有包含相應輸出信號或標簽的訓練集的自由時,無監督算法會派上用場。 在許多實際場景中,可以使用沒有輸出信號的數據集,很難手動標記它們。 因此,無監督算法有助于彌補這種差距。 與監督學習算法類似,也可以對非監督算法進行分類,以易于理解和學習。 以下是無監督學習算法的不同類別。 # 聚類 分類的無監督等效項稱為**聚類**。 這些算法可以幫助我們將數據點聚類或分組為不同的組或類別,而無需在輸入/訓練數據集中使用任何輸出標簽。 這些算法嘗試使用固有特征基于某種相似性度量將輸入數據集中的模式和關系查找到不同的組中,如下圖所示: ![](https://img.kancloud.cn/10/6e/106ec1d02236cb2d91cf2bcac5cd2c76_1254x522.png) 無監督學習:將新聞文章聚類 有助于理解群集的真實示例可以是新聞文章。 每天有數百篇新聞文章,每一篇都涉及從政治,體育到娛樂等不同主題。 如上圖所示,可以使用聚類來實現將這些物品組合在一起的無監督方法。 有多種執行聚類過程的方法。 最受歡迎的是: * 基于質心的方法。 流行的是 K 均值和 K 中心點。 * 聚集和分裂的層次聚類方法。 流行的是沃德氏和親和力傳播。 * 基于數據分布的方法,例如高斯混合模型。 * 基于密度的方法,例如 DBSCAN 等。 # 降維 數據和 ML 是最好的朋友,但是越來越多的數據帶來了很多問題。 大量的屬性或膨脹的特征空間是一個常見問題。 較大的特征空間在分析和可視化數據時會帶來問題,以及與訓練,內存和空間限制有關的問題。 這也被稱為**維度詛咒**。 由于無監督方法可以幫助我們從未標記的訓練數據集中提取見解和模式,因此它們也有助于我們減少維度。 換句話說,無監督方法通過幫助我們從完整的可用列表中選擇一組代表性的特征來幫助我們減少特征空間: ![](https://img.kancloud.cn/9c/6d/9c6dc5bbb26b836d7321e010061961ad_889x338.png) 無監督學習:使用 PCA 減少維度 **主成分分析**(**PCA**),最近鄰和判別分析是一些流行的降維技術。 上圖是對基于 PCA 的降維技術工作的著名描述。 它顯示了瑞士卷形狀,其中數據以三維空間表示。 PCA 的應用導致將數據轉換為二維空間,如圖的右側所示。 # 關聯規則挖掘 這類無監督的 ML 算法有助于我們理解事務數據集并從中提取模式。 這些算法也稱為**市場籃子分析**(**MBA**),可幫助我們識別跨交易的項目之間有趣的關系和關聯。 使用關聯規則挖掘,我們可以回答諸如“人們在給定商店中一起購買了哪些物品*或*購買葡萄酒的人也傾向于購買奶酪嗎”之類的問題等等。 FP-growth,ECLAT 和 Apriori 是用于關聯規則挖掘任務的最廣泛使用的算法。 # 異常檢測 異常檢測是根據歷史數據識別罕見事件/觀測的任務。 異常檢測也稱為**離群值檢測**。 異常或離群值通常具有以下特征:不經常發生或隨時間推移而突然突然爆發。 對于此類任務,我們為算法提供了歷史數據集,因此它可以以無監督的方式識別和了解數據的正常行為。 學習后,該算法將幫助我們識別與該學習行為不同的模式。 # CRISP-DM **跨行業數據挖掘標準流程**(**CRISP-DM**)是數據挖掘和分析項目中最流行且使用最廣泛的流程之一。 CRISP-DM 提供了所需的框架,該框架清楚地概述了執行數據挖掘和分析項目所需的步驟和工作流程,從業務需求到最終部署階段以及介于兩者之間的所有內容。 CRISP-DM 以首字母縮略詞本身更廣為人知,是一種經過嘗試,測試且可靠的行業標準過程模型,適用于數據挖掘和分析項目。 CRISP-DM 清楚地描述了執行任何項目所必需的步驟,過程和工作流,從正式的業務需求到測試和部署解決方案以將數據轉化為見解。 數據科學,數據挖掘和 ML 都是要嘗試運行多個迭代過程以從數據中提取見解和信息。 因此,我們可以說,分析數據的確是一門藝術,也是一門科學,因為它并非總是無緣無故地運行算法。 許多主要工作涉及了解業務,所投入工作的實際價值以及表達最終結果和見解的正確方法。 數據科學和數據挖掘項目本質上是迭代的,以從數據中提取有意義的見解和信息。 數據科學與科學一樣具有藝術性,因此在應用實際算法(再次經過多次迭代)并最終進行評估和部署之前,需要花費大量時間來了解業務價值和手頭的數據。 與具有不同生命周期模型的軟件工程項目相似,CRISP-DM 可幫助我們從頭到尾跟蹤數據挖掘和分析項目。 該模型分為六個主要步驟,涵蓋從業務和數據理解到評估和最終部署的各個方面,所有這些本質上都是迭代的。 請參見下圖: ![](https://img.kancloud.cn/fc/19/fc19805f5c9117f4d4dc368f4da8cb00_485x481.png) 描述 ML 項目工作流程的 CRISP-DM 模型 現在讓我們更深入地研究六個階段中的每個階段,以更好地了解 CRISP-DM 模型。 # 業務了解 第一步也是最重要的一步是了解業務。 這一關鍵步驟始于設置業務環境和問題要求。 正式定義業務需求對于將其轉換為數據科學和分析問題陳述至關重要。 此步驟還用于為業務和數據科學團隊設置期望和成功標準,使其位于同一頁面上并跟蹤項目進度。 此步驟的主要交付成果是詳細計劃,包括主要里程碑,時間表,假設,約束,警告,預期問題和成功標準。 # 數據理解 數據收集和理解是 CRISP-DM 框架的第二步。 在這一步中,我們將進行更深入的了解,以了解和分析上一步中形式化的問題陳述的數據。 此步驟開始于調查先前詳細項目計劃中概述的各種數據源。 然后將這些數據源用于收集數據,分析不同的屬性并記錄數據質量。 此步驟還涉及通常稱為探索性數據分析的內容。 **探索性數據分析**(**EDA**)是非常重要的子步驟。 在 EDA 期間,我們分析了數據的不同屬性,屬性和特征。 我們還將 EDA 期間的數據可視化,以更好地理解和發現以前可能看不見或忽略的模式。 此步驟為后續步驟奠定了基礎,因此,這一步驟根本不能忽略。 # 數據準備 這是任何數據科學項目中的第三步,也是最耗時的步驟。 一旦我們了解了業務問題并探索了可用數據,便會進行數據準備。 此步驟涉及數據集成,清理,整理,特征選擇和特征工程。 首先,最重要的是數據集成。 有時候,可以從各種來源獲得數據,因此需要根據某些鍵或屬性進行組合以更好地使用。 數據清理和整理是非常重要的步驟。 這涉及處理缺失值,數據不一致,修復不正確的值以及將數據轉換為可攝取格式,以便 ML 算法可以使用它們。 數據準備是最耗時的步驟,占任何數據科學項目總時間的 60-70% 以上。 除了數據集成和處理之外,此步驟還包括根據相關性,質量,假設和約束條件選擇關鍵特征。 這也稱為**特征選擇**。 有時候,我們不得不從現有特征中衍生或生成特征。 例如,根據用例要求,從出生日期算起年齡等等。 此步驟稱為**特征工程**,并且根據用例再次需要此步驟。 # 建模 第四步或建模步驟是進行實際分析和機器學習的地方。 此步驟將在上一步中準備的干凈和格式化的數據用于建模目的。 這是一個迭代過程,與數據準備步驟同步工作,因為模型/算法需要具有不同屬性集的不同設置/格式的數據。 此步驟涉及選擇相關工具和框架,以及選擇建模技術或算法。 此步驟包括基于業務理解階段中確定的期望和標準進行模型構建,評估和模型微調。 # 評價 一旦建模步驟生成滿足成功標準,表現基準和模型評估指標的模型,就需要進行徹底的評估。 在此步驟中,我們將在進行部署階段之前考慮以下活動: * 基于質量并與業務目標保持一致來對結果評估進行建模 * 確定做出的任何其他假設或放松約束 * 數據質量,信息丟失以及數據科學團隊和/或**主題專家**(**中小企業**)的其他反饋 * 端到端 ML 解決方案的部署成本 # 部署 CRISP-DM 模型的最后一步是部署到生產。 在多次迭代過程中開發,微調,驗證和測試的模型將保存起來并準備用于生產環境。 構建了適當的部署計劃,其中包括有關硬件和軟件要求的詳細信息。 部署階段還包括進行檢查和監視方面,以評估生產中的模型的結果,表現和其他指標。 # 標準 ML 工作流程 CRISP-DM 模型提供了用于 ML 和相關項目管理的高級工作流。 在本節中,我們將討論用于處理 ML 項目的技術方面和標準工作流的實現。 簡而言之,ML 流水線是一個端到端的工作流程,由數據密集型項目的各個方面組成。 一旦涵蓋了業務理解,風險評估以及 ML 或數據挖掘技術選擇等初始階段,我們便會著手推動項目的解決方案空間。 下圖顯示了具有不同子組件的典型 ML 流水線或工作流: ![](https://img.kancloud.cn/cb/0e/cb0e74b2b0bac1f3c67fe07689166054_862x362.png) 典型的 ML 流水線 標準 ML 流水線大致包括以下階段。 # 數據獲取 數據收集和提取通常是故事的起點。 數據集有各種形式,包括結構化和非結構化數據,這些數據通常包括丟失或嘈雜的數據。 每種數據類型和格式都需要特殊的機制來進行數據處理和管理。 例如,如果一個項目涉及對推文的分析,我們需要使用 Twitter API 并開發機制以提取所需的推文,這些推文通常為 JSON 格式。 其他場景可能涉及已經存在的結構化或非結構化公共數據集或私有數據集,除了僅開發提取機制外,這兩種情況都可能需要其他權限。 Sarkar 和他們的合著者在《Python 機器學習》的第 3 章中討論了與使用各種數據格式有關的相當詳細的內容,如果您有興趣進一步研究,請參閱它。 # 數據準備 值得重申的是,這是在整個流水線中花費最大時間的地方。 這是一個相當詳細的步驟,涉及基本和重要的子步驟,其中包括: * 探索性數據分析 * 數據處理與整理 * 特征工程和提取 * 特征縮放和選擇 # 探索性數據分析 到目前為止,項目的所有初始步驟都圍繞業務環境,需求,風險等。 這是我們實際深入研究收集/可用數據的第一個接觸點。 EDA 幫助我們了解數據的各個方面。 在此步驟中,我們將分析數據的不同屬性,發現有趣的見解,甚至可視化不同維度上的數據以獲得更好的理解。 此步驟可幫助我們收集手頭的數據集的重要特征,這不僅在項目的后期階段很有用,而且還有助于我們在流水線早期識別和/或緩解潛在問題。 我們將在本章后面介紹一個有趣的示例,以使讀者了解 EDA 的過程和重要性。 # 數據處理與整理 此步驟與將數據轉換為可用形式有關。 在大多數情況下,ML 算法無法使用第一步中檢索到的原始數據。 形式上,數據整理是將數據從一種形式清除,轉換和映射為另一種形式,以便在項目生命周期的后期階段使用的過程。 此步驟包括缺少數據插補,類型轉換,處理重復項和異常值,等等。 為了更好的理解,我們將在用例驅動的章節中介紹這些步驟。 # 特征工程和提取 經過預處理和處理后的數據達到了可以被特征工程和提取步驟利用的狀態。 在此步驟中,我們利用現有屬性來導出和提取上下文/用例特定的屬性或特征,這些屬性或特征可以在接下來的階段中被 ML 算法利用。 我們根據數據類型采用不同的技術。 特征工程和提取是一個相當復雜的步驟,因此在本章的后面部分將進行更詳細的討論。 # 特征縮放和選擇 在某些情況下,可用特征的數量過大,會對整個解決方案產生不利影響。 具有大量屬性的數據集的處理和處理不僅成為問題,而且還導致解釋,可視化等方面的困難。 這些問題被正式稱為維度**的詛咒**。 因此,特征選擇可以幫助我們確定可以在建模步驟中使用的代表性特征集,而不會造成太多信息損失。 有多種技術可以執行特征選擇。 本章后面的部分將討論其中的一些。 # 建模 在建模過程中,我們通常將數據特征提供給 ML 方法或算法并訓練模型,通常是為了優化特定的成本函數,在大多數情況下,目的是減少誤差并歸納從數據中學到的表示形式。 根據數據集和項目要求,我們應用一種或多種不同的機器學習技術的組合。 這些可以包括有監督的技術(例如分類或回歸),無監督的技術(例如聚類),甚至是結合了不同技術的混合方法(如先前在“ML 技術”部分中所討論的)。 建模通常是一個迭代過程,我們經常利用多種算法或方法,并根據模型評估表現指標來選擇最佳模型。 由于這是一本有關遷移學習的書,因此我們將在后續章節中主要基于深度學習構建模型,但是建模的基本原理與 ML 模型非常相似。 # 模型評估和調整 開發模型只是從數據中學習的一部分。 建模,評估和調整是迭代步驟,可幫助我們微調和選擇表現最佳的模型。 # 模型評估 模型基本上是數據的通用表示形式,并且是用于學習該表示形式的基礎算法。 因此,模型評估是針對某些標準評估構建模型以評估其表現的過程。 模型表現通常是定義為提供數值以幫助我們確定任何模型的有效性的函數。 通常,會根據這些評估指標對成本或損失函數進行優化以構建準確的模型。 根據所使用的建模技術,我們利用相關的評估指標。 對于有監督的方法,我們通常利用以下技術: * 根據模型預測與實際值創建混淆矩陣。 這涵蓋了諸如**真陽性**(**TP**),**假陽性**(**FP**),**真陰性**(**TN**)和**假陰性**(**FN**)將其中一個類別視為正類別(通常是感興趣的類別)。 * 從混淆矩陣得出的度量標準,包括準確率(總體表現),精度(模型的預測能力),召回率(命中率)和 F1 分數(精確度和召回率的諧和平均值)。 * **受試者特征曲線**(**ROC**)和**曲線下面積**(**AUC**)。 * R 平方(確定系數),**均方根誤差**(**RMSE**),F 統計量,**赤池信息準則**(**AIC**),以及專門用于回歸模型的 p 值。 評估無監督方法(例如聚類)的流行指標包括: * 輪廓系數 * 誤差平方和 * 同質性,完整性和 V 度量 * 卡林斯基 - 哈拉巴茲指數 請注意,此列表描述了廣泛使用的最受歡迎的度量標準,但絕不是模型評估度量標準的詳盡列表。 交叉驗證也是模型評估過程的重要方面,在該過程中,我們利用基于交叉驗證策略的驗證集通過調整模型的各種超參數來評估模型表現。 您可以將超參數視為可以用來調整模型以構建有效且表現更好的模型的旋鈕。 當我們在隨后的章節中使用大量的實際操作示例來評估模型時,這些評估技術的用法和細節將更加清晰。 # 偏差方差權衡 監督學習算法可幫助我們推斷或學習從輸入數據點到輸出信號的映射。 該學習導致目標或習得函數。 現在,在理想情況下,目標函數將學習輸入變量和輸出變量之間的精確映射。 不幸的是,沒有理想。 正如在介紹監督學習算法時所討論的那樣,我們利用稱為**訓練數據集**的數據子集來學習目標函數,然后在稱為**測試數據集**的另一個子集上測試表現。 由于該算法僅看到所有可能數據組合的子集,因此在預測輸出和觀察到的輸出之間會出現誤差。 這稱為**總誤差**或**預測誤差**: *總誤差 = 偏差誤差 + 方差誤差 + 不可約誤差* 不可減少的誤差是由于噪聲,我們對問題的框架,收集數據的方式等導致的固有誤差。 顧名思義,這種誤差是無法避免的,從算法的角度來看,我們幾乎無能為力。 # 偏差 術語**偏差**是指由學習算法推斷目標函數的基礎假設。 高偏差表明該算法對目標函數有更多假設,而低偏差表明該假設較少。 由偏差引起的誤差只是預期(或平均)預測值與實際觀察值之間的差。 為了獲得預測的平均值,我們多次重復學習步驟,然后取平均結果。 偏差誤差有助于我們了解模型的概括性。 低偏差算法通常是非參數算法,例如決策樹,SVM 等,而參數函數(例如線性和邏輯回歸)的偏差很高。 # 方差 方差標志著模型對訓練數據集的敏感性。 眾所周知,學習階段依賴于稱為訓練集的所有可能數據組合的一小部分。 因此,隨著訓練數據集的變化,方差誤差捕獲了模型估計值的變化。 低方差表明預測值的變化要少得多,因為基礎訓練數據集會發生變化,而高方差則指向另一個方向。 非參數算法(例如決策樹)具有較高的方差,而參數算法(例如線性回歸)的靈活性較差,因此方差較低。 # 權衡 偏差方差權衡是同時減少監督學習算法的偏差和方差誤差的問題,這阻止了目標函數泛化到訓練數據點之外。 讓我們看一下以下插圖: ![](https://img.kancloud.cn/19/a2/19a2f893bb8bd1a9661935a4832d8e3d_1368x1369.png) 偏差方差權衡 鼓勵讀者訪問[以下鏈接](https://elitedatascience.com/bias-variance-tradeoff),以更好,更深入地了解偏差方差的權衡方法。 考慮給我們給出一個問題陳述:“給定一個人的身高,確定他/她的體重”。 我們還為訓練數據集提供了相應的身高和體重值。 數據如下圖所示: ![](https://img.kancloud.cn/2d/17/2d179da883f1cae592af98230db3596e_783x474.png) 描繪身高體重數據集的圖 請注意,這是一個說明重要概念的示例,在解決實際問題的后續章節中,我們將使用實際案例。 這是監督學習問題的一個實例,更多是回歸問題的實例(請參閱為什么?)。 利用該訓練數據集,我們的算法將必須學習目標函數,以找到不同個體的身高和體重之間的映射。 # 欠擬合 根據我們的算法,訓練階段可能會有不同的輸出。 假設學習的目標函數如下圖所示: ![](https://img.kancloud.cn/71/ef/71ef43b8b9b0f54c3c409f400ab23164_806x474.png) 欠擬合模型 該惰性函數始終預測恒定的輸出值。 由于目標函數無法學習數據的基礎結構,因此導致**欠擬合**的情況。 欠擬合模型的預測表現較差。 # 過擬合 訓練階段的另一個極端稱為過擬合。 過擬合圖可以表示如下: ![](https://img.kancloud.cn/9d/24/9d2421f92aa95abfd0b5db83ab28b7e8_790x499.png) 過擬合模型 這顯示了一個目標函數,可以完美地映射訓練數據集中的每個數據點。 這就是眾所周知的**模型過擬合**。 在這種情況下,該算法試圖了解包括噪聲在內的確切數據特征,因此無法可靠地預測看不見的新數據點。 # 泛化 欠擬合和過擬合之間的最佳結合點是我們所說的**良好擬合**。 可以很好地概括給定問題的模型圖如下: ![](https://img.kancloud.cn/b7/a9/b7a9b115e88cd2aa6c4a6dae460ee3f3_805x474.png) 很好的概括 可以在看不見的數據點以及訓練數據上表現良好的學習能力被稱為**泛化能力**。 因此,泛化指的是基于在訓練階段學到的概念,目標函數在看不見的數據上執行得如何。 上圖描繪了很好的概括擬合。 # 模型調整 準備和評估模型與調整模型一樣重要。 與為我們提供標準算法集的不同 ML 框架/庫一起工作,我們幾乎從來沒有立即使用它們。 ML 算法具有不同的參數或旋鈕,可以根據項目要求和不同的評估結果進行調整。 通過遍歷超參數或元參數的不同設置來獲得更好的結果,模型調整可以起作用。 超參數是高級抽象上的旋鈕,它是在學習過程開始之前設置的。 這與模型級別參數不同,模型級別參數在訓練階段期間學習。 因此,模型調整也稱為**超參數優化**。 網格搜索,隨機超參數搜索,貝葉斯優化等是執行模型調整的流行方法。 盡管模型調整非常重要,但過度調整可能會對學習過程產生不利影響。 在“偏差方差權衡”部分中討論了與過度調整過程有關的一些問題。 # 部署和監控 一旦完成了模型開發,評估和調整,并進行了多次迭代以改善結果,那么模型部署的最后階段就到了。 模型部署負責各個方面,例如模型持久性,通過不同的機制(例如 API 端點)將模型公開給其他應用,以及制定監視策略。 我們生活在一個瞬息萬變的世界,每時每刻都在變化,關于數據和與用例相關的其他因素也是如此。 我們必須制定監控策略,例如定期報告,日志和測試,以檢查解決方案的表現并在需要時進行更改。 機器學習流水線與軟件工程以及數據科學和機器學習一樣重要。 我們簡要概述并討論了典型流水線的不同組成部分。 根據特定的用例,我們修改了標準流水線以適應需要,同時確保我們不會忽略已知的陷阱。 在接下來的部分中,我們將通過實際示例和代碼片段更詳細地了解典型 ML 流水線的幾個組件。 # 探索性數據分析 當我們開始任何 ML 項目時,EDA 就是我們執行的前幾個任務之一。 正如在“CRISP-DM”一節中所討論的那樣,數據理解是發現有關數據的各種見解并更好地理解業務需求和上下文的重要步驟。 在本節中,我們將使用一個實際的數據集,并使用`pandas`作為我們的數據處理庫以及`seaborn`進行可視化來執行 EDA。 Python 筆記本`game_of_thrones_eda.ipynb`中提供了完整的代碼段和此分析的詳細信息。 首先,我們導入所需的庫并按照以下代碼片段所示設置配置: ```py In [1]: import numpy as np ...: import pandas as pd ...: from collections import Counter ...: ...: # plotting ...: import seaborn as sns ...: import matplotlib.pyplot as plt ...: ...: # setting params ...: params = {'legend.fontsize': 'x-large', ...: 'figure.figsize': (30, 10), ...: 'axes.labelsize': 'x-large', ...: 'axes.titlesize':'x-large', ...: 'xtick.labelsize':'x-large', ...: 'ytick.labelsize':'x-large'} ...: ...: sns.set_style('whitegrid') ...: sns.set_context('talk') ...: ...: plt.rcParams.update(params) ``` 設置和要求到位后,我們可以開始關注數據。 正在考慮進行探索性分析的數據集是`battles.csv`文件,其中包含《權力的游戲》(截至第 5 季)的所有主要戰役。 《權力的游戲》是有史以來最受歡迎的電視連續劇之一,是一部幻想小說,背景是在 *Westeros* 和 *Essos* 的虛構大陸上制作的,充滿了許多情節,還有大量的角色都在為鐵王座而戰! 它是 George R. R. Martin 的《冰與火之歌》小說系列的改編。 作為一個受歡迎的系列,它吸引了許多人的注意,并且數據科學家也不排除在外。 [該筆記本在 Myles O'Neill 增強的 Kaggle 數據集上顯示了 EDA(更多詳細信息](https://www.kaggle.com/mylesoneill/game-of-thrones)。 該數據集基于多個人收集并貢獻的多個數據集的組合。 在此分析中,我們使用了`battles.csv`。 原始戰斗數據由克里斯·阿爾邦(Chris Albon)提供; 更多詳細信息,請參見[這里](https://github.com/chrisalbon/war_of_the_five_kings_dataset)。 以下代碼段使用`pandas`加載`battles.csv`文件: ```py In [2]: battles_df = pd.read_csv('battles.csv') ``` 數據集如以下屏幕快照所示: ![](https://img.kancloud.cn/9e/f5/9ef51204b5433ad05262ed537ac11b5b_953x335.png) 權力的游戲的`Battles.csv`中的示例行 我們可以分別使用`pandas`工具`shape`,`dtypes`和`describe()`查看行的總數,每個屬性的數據類型以及數字屬性的常規統計信息。 我們有 38 場戰斗的數據,其中 25 項屬性描述了每一場。 讓我們了解幻想世界多年來戰斗的分布情況。 以下代碼段繪制了此分布的條形圖: ```py In [3]: sns.countplot(y='year',data=battles_df) ...: plt.title('Battle Distribution over Years') ...: plt.show() ``` 下圖顯示,在 **299** 年中,戰斗次數最多,其次分別是 **300** 和 **298**: ![](https://img.kancloud.cn/ec/68/ec68efa7c066fba3f276d2a152135cd8_999x374.png) 多年來的戰斗分配 在這個幻想的土地上有不同的地區,在可以想象的每個地方都發生著戰斗。 但是,有趣的是看看是否有任何首選區域。 以下代碼段有助于我們準確地回答此問題: ```py In [4]: sns.countplot(x='region',data=battles_df) ...: plt.title('Battles by Regions') ...: plt.show() ``` 以下圖表可幫助我們確定**里弗蘭茲**戰斗最多,其次是**北部**和**西部**: ![](https://img.kancloud.cn/34/19/341905485297c90878ffeb18e74239d9_1000x394.png) 地區戰 還要注意的另一件有趣的事是,只有一場戰役**超越了墻面**(擾流板警報:請稍后關注)。 我們可以使用不同的分組依據進行類似的分析,以了解例如主要死亡人數或每個地區的捕獲數,等等。 我們繼續前進,看看哪個國王攻擊最多。 我們使用餅圖將其可視化,以了解每個參與的國王所進行的戰斗所占的百分比。 請注意,我們基于攻擊國王進行此分析。 防御王也可以執行類似的分析。 以下代碼段準備了一個餅圖,以顯示每個進攻國王的戰斗份額: ```py In [5]: attacker_king = battles_df.attacker_king.value_counts() ...: attacker_king.name='' # turn off annoying y-axis-label ...: attacker_king.plot.pie(figsize=(6, 6),autopct='%.2f') ``` 以下餅形圖顯示了每個進攻國王的戰斗份額: ![](https://img.kancloud.cn/35/f5/35f58704854b192216949f691db775f6_637x321.png) 每個進攻國王的戰斗份額 韋斯特羅斯和埃索斯的土地充滿危險,遍布敵人和威脅。 讓我們稍微分析一下數據,以了解每位國王在多少次獲勝者。 由于國王既可以保衛自己的土地,也可以爭取權力,因此看到保衛和進攻的勝利也很有趣。 以下代碼段有助于我們準備堆積的條形圖,以分析每位國王的進攻和防守勝利: ```py In [6] : attack_winners = battles_df[battles_df. ...: attacker_outcome=='win'] ...: ['attacker_king']. ...: value_counts(). ...: reset_index() ...: ...: attack_winners.rename( ...: columns={'index':'king', ...: 'attacker_king':'wins'}, ...: inplace=True) ...: ...: attack_winners.loc[:,'win_type'] = 'attack' ...: ...: defend_winners = battles_df[battles_df. ...: attacker_outcome=='loss'] ...: ['defender_king']. ...: value_counts(). ...: reset_index() ...: defend_winners.rename( ...: columns={'index':'king', ...: 'defender_king':'wins'}, ...: inplace=True) ...: ...: defend_winners.loc[:,'win_type'] = 'defend' ...: ...: ...: sns.barplot(x="king", ...: y="wins", ...: hue="win_type", ...: data=pd.concat([attack_winners, ...: defend_winners])) ...: plt.title('Kings and Their Wins') ...: plt.ylabel('wins') ...: plt.xlabel('king') ...: plt.show() ``` 前面的代碼段計算出攻擊時每位國王的獲勝次數,然后計算出防守時每位國王的獲勝次數。 然后,我們將兩個結果合并,并使用堆疊的條形圖繪制相同的結果。 結果顯示在下圖中: ![](https://img.kancloud.cn/01/34/0134a14f9e85a60475575ab1ce9d4e37_998x366.png) 每位國王獲勝的次數 上圖清楚地表明,**馬拉松**男孩在進攻和防守中獲勝的次數最多。 到目前為止,他們似乎很幸運。 **Robb Stark** 是第二成功的國王,當然紅色婚禮發生了。 數據集還包含描述所涉及房屋的數量,戰斗指揮官和軍隊規模的屬性。 我們可以進行類似且更深入的分析,以更好地理解戰斗。 我們鼓勵讀者嘗試其中一些作為練習,并檢查 Python 筆記本中的更多指針。 在結束本節之前,讓我們嘗試確定鐵王座之戰中的敵人。 盡管粉絲已經對此有所了解,但讓我們看看數據對此有何評論。 以下代碼段可幫助我們回答此問題: ```py In [7]: temp_df = battles_df.dropna( ...: subset = ["attacker_king", ...: "defender_king"])[ ...: ["attacker_king", ...: "defender_king"] ...: ] ...: ...: archenemy_df = pd.DataFrame( ...: list(Counter( ...: [tuple(set(king_pair)) ...: for king_pair in temp_df.values ...: if len(set(king_pair))>1]). ...: items()), ...: columns=['king_pair', ...: 'battle_count']) ...: ...: archenemy_df['versus_text'] = archenemy_df. ...: apply( ...: lambda row: ...: '{} Vs {}'.format( ...: row[ ...: 'king_pair' ...: ][0], ...: row[ ...: 'king_pair' ...: ][1]), ...: axis=1) ...: archenemy_df.sort_values('battle_count', ...: inplace=True, ...: ascending=False) ...: ...: ...: archenemy_df[['versus_text', ...: 'battle_count']].set_index('versus_text', ...: inplace=True) ...: sns.barplot(data=archenemy_df, ...: x='versus_text', ...: y='battle_count') ...: plt.xticks(rotation=45) ...: plt.xlabel('Archenemies') ...: plt.ylabel('Number of Battles') ...: plt.title('Archenemies') ...: plt.show() ``` 我們首先準備一個臨時數據幀,并刪除所有未列出攻擊者或捍衛者國王姓名的戰斗。 有了干凈的數據框后,我們將遍歷每一行并計算每對戰斗的戰斗次數。 我們忽略了戰斗是國王自己的軍隊(`if len(set(king_pair))>1`)發生的情況。 然后,我們將結果簡單地繪制成條形圖,如下所示: ![](https://img.kancloud.cn/c2/04/c2045969a80529f7170a13dc9281e345_1000x532.png) 權力的游戲中的大敵 我們看到數據集證實了直覺。 **Robb Stark** 和 **Joffrey Baratheon** 已經進行了 19 場戰斗,其他兩對則進行了五場或更少的戰斗。 本節中共享的分析和可視化效果是對數據集可以完成的工作的一瞥。 僅從該數據集中可以提取出更多的模式和見解。 EDA 是一種非常強大的機制,可用于在進入 ML 的其他階段之前詳細了解數據集。 在接下來的章節中,在進入建模,調整,評估和部署階段之前,我們將定期執行 EDA,以幫助我們理解業務問題以及數據集。 # 特征提取與工程 數據準備是任何 ML 項目中最長,最復雜的階段。 在討論 CRISP-DM 模型時,強調了同樣的道理,在該模型中,我們提到了數據準備階段如何占用 ML 項目中總時間的 60-70%。 對原始數據集進行預處理和處理后,下一步就是使其可用于 ML 算法。 特征提取是從原始屬性派生特征的過程。 例如,在處理圖像數據時進行特征提取是指從原始像素級數據中提取紅色,藍色和綠色通道信息作為特征。 同樣,特征工程指的是使用數學變換從現有特征中推導其他特征的過程。 例如,特征工程將幫助我們從一個人的月收入中得出一個特征,例如年收入(基于用例要求)。 由于特征提取和工程設計都可以幫助我們將原始數據集轉換為可用形式,因此 ML 實踐者可以互換使用這些術語。 # 特征工程策略 將原始數據集(后期清理和整理)轉換為可以由 ML 算法使用的特征的過程是領域知識,用例需求和特定技術的組合。 因此,特征描述了基礎數據的各種表示形式,并且是特征工程過程的結果。 由于特征工程將原始數據轉換為自身的有用表示形式,因此根據手頭的數據類型,可以使用各種標準技術和策略。 在本節中,我們將討論其中一些策略,簡要介紹結構化和非結構化數據。 # 處理數值數據 數值數據通常以整數或浮點數的形式在數據集中可用,并且通常稱為**連續數值數據**,通常是 ML 友好數據類型。 友好地說,我們指的是可以直接在大多數 ML 算法中攝取數字數據的事實。 但是,這并不意味著數字數據不需要其他處理和特征工程步驟。 有多種技術可以從數值數據中提取和工程化特征。 讓我們看一下本節中的一些技術: * **原始度量**:這些數據屬性或特征可以直接以其原始或本機格式使用,因為它們出現在數據集中而無需任何其他處理。 示例可以是年齡,身高或體重(只要數據分布不太偏斜!)。 * **計數**:在某些情況下,諸如計數和頻率之類的數字特征也很有用,以描繪重要的細節。 例如,信用卡欺詐事件的發生次數,歌曲收聽次數,設備事件發生的次數等等。 * **二值化**:我們經常可能想對出現或特征進行二值化,特別是僅指示是否存在特定項或屬性(通常以 1 表示)或不存在(以 0 表示)。 這在構建推薦系統等場景中很有用。 * **合并**:此技術通常將來自分析中的任何特征或屬性的連續數值分組或分組為離散的分組,以使每個分組都覆蓋特定的數值范圍。 一旦獲得了這些離散的箱子,我們就可以選擇在其上進一步應用基于分類數據的特征工程。 存在各種裝箱策略,例如固定寬度裝箱和自適應裝箱。 筆記本`feature_engineering_numerical_and_categorical_data.ipynb`中提供了代碼片段,以更好地理解數字數據的特征工程。 # 處理類別數據 常見的另一類重要數據是類別數據。 類別特征具有離散值,這些離散值屬于一組有限的類。 這些類可以表示為文本或數字。 根據類別的順序,類別特征分別稱為**標稱**和**序數**。 標稱特征是具有有限值集合但沒有任何自然順序的那些類別特征。 例如,天氣季節,電影類型等都是標稱特征。 具有有限類集并具有自然順序的類別特征稱為**序數特征**。 例如,星期幾,著裝大小等都是常規的。 通常,特征工程中的任何標準工作流程都涉及將這些類別值轉換為數字標簽的某種形式,然后在這些值上應用某種編碼方案。 流行的編碼方案簡要介紹如下: * **單熱編碼**:此策略為類別屬性創建 *n* 個二元值列,假設存在 *n* 個不同類別 * **虛擬編碼**:此策略為類別屬性創建 *n-1* 個二元值列,假定存在 *n* 個不同類別 * **特征散列**:如果我們使用散列函數將多個特征添加到單個容器或存儲桶(新特征)中,則可以利用此策略,當我們具有大量特征時通常會使用 筆記本`feature_engineering_numerical_and_categorical_data.ipynb`中提供了代碼片段,以更好地理解類別數據的特征工程。 # 處理圖像數據 圖像或視覺數據是豐富的數據源,可以使用 ML 算法和深度學習解決幾個用例。 圖像數據提出了很多挑戰,需要經過仔細的預處理和轉換,然后才能被任何算法使用。 對圖像數據執行特征工程的一些最常見方法如下: * **利用元數據信息或 EXIF 數據**:諸如圖像創建日期,修改日期,尺寸,壓縮格式,用于捕獲圖像的設備,分辨率,焦距等屬性。 * **像素和通道信息**:每個圖像都可以視為像素值矩陣或(`m, n, c`)矩陣,其中`m`代表行數,`n`代表列數,`c`指向顏色通道(例如 R,G 和 B)。 然后可以根據算法和用例的要求將這種矩陣轉換為不同的形狀。 * **像素強度**:有時很難處理具有多種顏色通道的彩色圖像。 基于像素強度的特征提取依賴于基于強度的像素合并,而不是利用原始像素級別的值。 * **邊緣檢測**:可以利用相鄰像素之間對比度和亮度的急劇變化來識別物體邊緣。 有不同的算法可用于邊緣檢測。 * **對象檢測**:我們采用邊緣檢測的概念并將其擴展到對象檢測,然后將識別出的對象邊界用作有用的特征。 同樣,可以基于可用圖像數據的類型來利用不同的算法。 # 基于深度學習的自動特征提取 到目前為止討論的圖像數據和其他類型的特征提取方法需要大量時間,精力和領域知識。 這種特征提取有其優點和局限性。 最近,人們已經研究了深度學習,特別是**卷積神經網絡**(**CNN**),并將其用作自動特征提取器。 CNN 是針對圖像數據進行優化的深度神經網絡的特例。 卷積層是任何 CNN 的核心,它們基本上會在圖像的高度和寬度上應用滑動濾鏡。 像素值與這些濾鏡的點積會生成跨多個周期學習的激活圖。 在每個層次上,這些卷積層都有助于提取特定特征,例如邊緣,紋理,角等。 深度學習和 CNN 還有很多,但是為了簡單起見,讓我們假設 CNN 在每一層都可以幫助我們自動提取不同的低級和高級特征。 反過來,這使我們免于手動執行特征提取。 我們將在接下來的章節中更詳細地研究 CNN,并了解它們如何幫助我們自動提取特征。 # 處理文本數據 數值和分類特征就是我們所謂的結構化數據類型。 它們在 ML 工作流中更易于處理和利用。 文本數據是非結構化信息的重要來源之一,同樣重要。 文本數據提出了與句法理解,語義,格式和內容有關的多個挑戰。 文本數據還提出了轉換為數字形式的問題,然后才能被 ML 算法使用。 因此,在進行文本數據的特征工程之前,需要進行嚴格的預處理和清理步驟。 # 文本預處理 在進行任何特征提取/工程設計之前,文本數據需要仔細而勤奮的預處理。 預處理文本數據涉及多個步驟。 以下是一些最廣泛使用的文本數據預處理步驟的列表: * 分詞 * 轉換為小寫 * 刪除特殊字符 * 縮放 * 停用詞刪除 * 拼寫更正 * 詞干和詞條去除 在與用例有關的章節中,我們將詳細介紹大多數技術。 為了更好地理解,讀者可以參考《Python 實用機器學習》的第 4 章和第 7 章(Sarkar 及其合著者,Springer,2017 年)。 # 特征工程 通過上一節中提到的方法對文本數據進行正確處理后,我們就可以利用以下一些技術來進行特征提取和轉換為數值形式。 Jupyter 筆記本`feature_engineering_text_data.ipynb`中提供了可更好地理解文本數據特征的代碼片段: * **詞袋模型**:這是迄今為止最簡單的文本數據向量化技術。 在此技術中,每個文檔都表示為`N`維度上的向量,其中`N`表示預處理語料庫中所有可能的單詞,向量的每個組成部分表示單詞的存在或其頻率。 * **TF-IDF 模型**:詞袋模型在非常簡單的假設下工作,有時會導致各種問題。 最常見的問題之一與某些單詞由于頻率很高而使其余單詞黯然失色有關,因為詞袋模型利用絕對頻率進行向量化。 **詞頻逆文檔頻率**(**TF-IDF**)模型通過縮放/歸一化絕對頻率來緩解此問題。 在數學上,模型定義如下: `tfidf(w, D) = tf(W, D) * idf(w, D)` 在這里,`tfidf(w, D)`表示每個單詞`w`在文檔`D`中的 TF-IDF 分數, `tf(w, D)`是中每個單詞`w`在文檔`D`中的詞頻,`idf(w, D)`表示逆文檔頻率,計算為語料庫`C`中總文檔數除以`w`所在的文檔數的對數轉換。 除了詞袋和 TF-IDF 外,還有其他轉換,例如 N-gram 袋,以及單詞嵌入,例如 Word2vec,GloVe 等。 我們將在后續章節中詳細介紹其中的幾個。 # 特征選擇 特征提取和工程設計的過程可幫助我們從基礎數據集中提取特征并生成特征。 在某些情況下,這會導致大量輸入要處理的算法。 在這種情況下,懷疑輸入中的許多特征可能是多余的,并可能導致復雜的模型甚至過擬合。 特征選擇是從可用/生成的完整特征集中識別代表性特征的過程。 預期所選特征集將包含所需信息,以使算法能夠解決給定任務而不會遇到處理,復雜性和過擬合的問題。 特征選擇還有助于更好地理解建模過程中使用的數據,并加快處理速度。 特征選擇方法大致可分為以下三類: * **過濾方法**:顧名思義,這些方法可幫助我們根據統計得分對特征進行排名。 然后,我們選擇這些特征的子集。 這些方法通常與模型輸出無關,而是獨立地評估特征。 基于閾值的技術和統計檢驗(例如相關系數和卡方檢驗)是一些受歡迎的選擇。 * **包裝器方法**:這些方法對特征子集的不同組合的表現進行比較搜索,然后幫助我們選擇表現最佳的子集。 向后選擇和正向消除是用于特征選擇的兩種流行的包裝方法。 * **嵌入式方法**:這些方法通過了解哪個特征子集將是最好的,從而提供了前面兩種方法中的最好方法。 正則化和基于樹的方法是流行的選擇。 特征選擇是構建 ML 系統過程中的重要方面。 如果不謹慎處理,它也是造成系統偏差的主要來源之一。 讀者應注意,應該使用與訓練數據集分開的數據集來進行特征選擇。 將訓練數據集用于特征選擇將始終導致過擬合,而將測試集用于特征選擇則會高估模型的表現。 最受歡迎的庫提供了多種特征選擇技術。 諸如`scikit-learn`之類的庫提供了開箱即用的這些方法。 在后面的章節中,我們將看到并利用其中的許多內容。 # 總結 在任何旅程中,了解概念和技術的牢固基礎和共同基礎都非常重要。 通過本章有關機器學習基礎知識的章節,我們試圖實現這一目標。 在開始學習深度學習,遷移學習和更高級的概念之前,必須為 ML 概念奠定堅實的基礎。 在本章中,我們涵蓋了相當多的基礎,并提供了更詳細地研究概念的重要指示。 我們通過理解機器學習為何如此重要以及它是一個完全不同的范例來開始本章。 我們簡要討論了 AI,機器學習和深度學習之間的關系。 然后,本章繼續介紹了不同的機器學習技術,例如有監督,無監督和強化學習。 我們詳細討論了通常使用哪些不同的監督和非監督方法。 本章還簡要介紹了用于 ML 項目工作流程的 CRISP-DM 模型以及 ML 流水線。 我們還討論了《權力的游戲》幻想世界中戰斗數據集的 EDA,以應用不同的概念并了解 EDA 的重要性。 在本章的最后,介紹了特征提取和工程以及特征選擇。 在接下來的章節中,我們將以這些概念為基礎,并最終在涉及不同實際使用案例的章節中應用所學知識。 歡迎登機!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看