一、Python
1、Numpy
NumPy(Numerical Python) 是 Python 語言的一個擴充套件程式庫,支援大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。
2、Pandas
pandas 是基於 Numpy 構建的含有更高階資料結構和工具的資料分析包類似於 Numpy 的核心是 ndarray,pandas 也是圍繞著 Series 和 DataFrame 兩個核心資料結構展開的 。Series 和 DataFrame 分別對應於一維的序列和二維的表結構。
3、Matplotlib
Matplotlib 可能是 Python 2D-繪圖領域使用最廣泛的套件。它能讓使用者很輕鬆地將資料圖形化,並且提供多樣化的輸出格式。
4、Sklearn
Sklearn是機器學習中一個常用的python第三方模組,對一些常用的機器學習方法進行了封裝,在進行機器學習任務時,並不需要每個人都實現所有的演算法,只需要簡單的呼叫sklearn裡的模組就可以實現大多數機器學習任務。
機器學習任務通常包括分類(Classification)和迴歸(Regression),常用的分類器包括SVM、KNN、貝葉斯、線性迴歸、邏輯迴歸、決策樹、隨機森林、xgboost、GBDT、boosting、神經網路NN。常見的降維方法包括TF-IDF、主題模型LDA、主成分分析PCA等等。
二、機器學習
1、one-hot
獨熱編碼即 One-Hot 編碼,又稱一位有效編碼,對於每一個特徵,如果它有m個可能值,那麼經過獨熱編碼後,就變成了m個二元特徵。並且,這些特徵互斥,每次只有一個啟用。
直觀來說就是有多少個狀態就有多少位元,而且只有一個位元為1,其他全為0的一種碼制。
2、監督學習
訓練樣本資料中,每個樣本都帶有正確答案。
例如:預測數值型資料的迴歸、預測分類標籤的分類、預測順序的排列。
3、無監督學習
訓練資料中,每個樣本都沒有正確答案。
例如:聚類(相似點)、異常檢測(異常點)。
4、N-gram
N-gram模型是一種語言模型(Language Model,LM),語言模型是一個基於機率的判別模型,它的輸入是一句話(單詞的順序序列),輸出是這句話的機率,即這些單詞的聯合機率(joint probability)。
例如:我說“上火”、“金罐”這兩個詞,你能想到的下一個詞應該更可能“加多寶”,而不是“可口可樂”。N-gram正是基於這樣的想法,它的第一個特點是某個詞的出現依賴於其他若干個詞,第二個特點是我們獲得的資訊越多,預測越準確。
這就好像,我們每個人的大腦中都有一個N-gram模型,而且是在不斷完善和訓練的。我們的見識與經歷,都在豐富著我們的閱歷,增強著我們的聯想能力。
5、啟用函式
它們將非線性特性引入到我們的網路中。
舉例:如果不用啟用函式,每一層輸出都是上層輸入的線性函式,無論神經網路有多少層,輸出都是輸入的線性組合,這種情況就是最原始的感知機(Perceptron)。
如果使用的話,啟用函式給神經元引入了非線性因素,使得神經網路可以任意逼近任何非線性函式,這樣神經網路就可以應用到眾多的非線性模型中。
6、Sigmoid函式(最常用的啟用函式)
Sigmoid函式是一個在生物學中常見的S型函式,也稱為S型生長曲線。在資訊科學中,由於其單增以及反函式單增等性質,Sigmoid函式常被用作神經網路的閾值函式,將變數對映到[0,1]之間。
7、Softmax
或稱歸一化指數函式。他把一些輸入對映為0-1之間的實數,並且歸一化保證和為1,因此多分類的機率之和也剛好為1。
softmax由兩個單片語成,其中一個是max,max即最大值;另一個單詞soft,即最後的輸出是每個分類被取到的機率。
8、歸一化
歸一化(標準化)方法有兩種形式,一種是把數變為(0,1)之間的小數,一種是把有量綱表示式變為無量綱表示式。主要是為了資料處理方便提出來的,把資料對映到0~1範圍之內處理。
模型歸一化後的好處:
1、提升模型的收斂速度。
2、提升模型的精度。
9、損失函式
損失函式的定義是什麼:衡量模型模型預測的好壞。
在解釋下,損失函式就是用來表現預測與實際資料的差距程度。
例如:你做一個線性迴歸,實際值和你的預測值肯定會有誤差,那麼我們找到一個函式表達這個誤差就是損失函式。
10、梯度下降/上升
梯度下降是迭代法的一種,可以用於求解最小二乘問題(線性和非線性都可以)。在求解機器學習演算法的模型引數,即無約束最佳化問題時,梯度下降(Gradient Descent)是最常採用的方法之一,另一種常用的方法是最小二乘法。
在求解損失函式的最小值時,可以透過梯度下降法來一步步的迭代求解,得到最小化的損失函式和模型引數值。反過來,如果我們需要求解損失函式的最大值,這時就需要用梯度上升法來迭代了。
11、學習率(Learning rate)
監督學習以及深度學習中重要的超參,其決定著目標函式能否收斂到區域性最小值以及何時收斂到最小值。合適的學習率能夠使目標函式在合適的時間內收斂到區域性最小值。
以梯度下降為例,為了使梯度下降法有較好的效能,我們需要把學習率的值設定在合適的範圍內。學習率決定了引數移動到最優值的速度快慢。如果學習率過大,很可能會越過最優值;反而如果學習率過小,最佳化的效率可能過低,長時間演算法無法收斂。所以學習率對於演算法效能的表現至關重要。
12、負取樣
自然語言處理領域中,判斷兩個單詞是不是一對上下文詞(context)與目標詞(target),如果是一對,則是正樣本,如果不是一對,則是負樣本。
13、哈夫曼樹
給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。
14、MapReduce之Combiner
1、Combiner是MR程式中Mapper和Reduce之外的一種元件。
2、Combiner元件的父類就是Reducer。
3、Combiner和Reducer之間的區別在於執行的位置。
4、Reducer是每一個接收全域性的MapTask 所輸出的結果。
5、Combiner是在MapTask的節點中執行。
6、每一個map都會產生大量的本地輸出,Combiner的作用就是對map輸出的結果先做一次合併,以較少的map和reduce節點中的資料傳輸量。
7、Combiner的存在就是提高當前網路IO傳輸的效能,也是MapReduce的一種最佳化手段。
8、Combiner就是一次Reducer類中reduce方法的實現,所以這裡的KV需要和Reducer的KV是一致的實際開發一定是先實現Mapper之後,知道了KV,然後再根據需要實現自定義的Combiner中的KV。
15、Hadoop之Shuffle過程
Shuffle過程是MapReduce的核心,描述著資料從map task輸出到reduce task輸入的這段過程。
Hadoop的叢集環境,大部分的map task和reduce task是執行在不同的節點上的,那麼reduce就要取map的輸出結果。那麼叢集中執行多個Job時,task的正常執行會對叢集內部的網路資源消耗嚴重。雖說這種消耗是正常的,是不可避免的,但是,我們可以採取措施儘可能的減少不必要的網路資源消耗。另一方面,每個節點的內部,相比於記憶體,磁碟IO對Job完成時間的影響相當的大。
從以上分析,shuffle過程的基本要求:
1、完整地從map task端拉取資料到reduce task端
2、在拉取資料的過程中,儘可能地減少網路資源的消耗
3、儘可能地減少磁碟IO對task執行效率的影響
16、Word2vec中的CBOW與Skip-Gram模型
先驗機率:是指根據以往經驗和分析得到的機率,如全機率公式,它往往作為"由因求果"問題中的"因"出現的機率。
後驗機率:是指在得到“結果”的資訊後重新修正的機率,是“執果尋因”問題中的"果"。
N-gram:
先驗機率和後驗機率已經知道了,但是一個句子很長,對每個詞進行機率計算會很麻煩,於是有了n-gram模型。
該模型基於這樣一種假設,第N個詞的出現只與前面N-1個詞相關,而與其它任何詞都不相關,整句的機率就是各個詞出現機率的乘積。
一般情況下我們只計算一個單詞前後各兩個詞的機率,即n取2, 計算n-2,.n-1,n+1,n+2的機率。
如果n=3,計算效果會更好;n=4,計算量會變得很大。
Cbow:
cbow輸入是某一個特徵詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量,即先驗機率。
訓練的過程如下圖所示,主要有輸入層(input),對映層(projection)和輸出層(output)三個階段。
Skip-gram:
Skip-Gram模型和CBOW的思路是反著來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量,即後驗機率。
17、Word2vec中的Negative Sampling模型
word2vec訓練方法和傳統的神經網路有所區別,主要解決的是softmax計算量太大的問題,採用Hierarchical Softmax和Negative Sampling模型。
word2vec中cbow,skip-gram都是基於huffman樹然後進行訓練,左子樹為1右子樹為0,同時約定左子樹權重不小於右子樹。
其中,根節點的詞向量對應我們的投影后的詞向量,而所有葉子節點就類似於之前神經網路softmax輸出層的神經元,葉子節點的個數就是詞彙表的大小。在霍夫曼樹中,隱藏層到輸出層的softmax對映不是一下子完成的,而是沿著霍夫曼樹一步步完成的,因此這種softmax取名為"Hierarchical Softmax"。
三、Spark
1、Sprak中的RDD
RDD(Resilient Distributed Dataset)叫做彈性分散式資料集,是Spark中最基本的資料抽象,它代表一個不可變、可分割槽、裡面的元素可平行計算的集合。RDD具有資料流模型的特點:自動容錯、位置感知性排程和可伸縮性。RDD允許使用者在執行多個查詢時顯式地將工作集快取在記憶體中,後續的查詢能夠重用工作集,這極大地提升了查詢速度。
2、RDD、DataFrame、Dataset的共性和區別:
共性:
1、RDD、DataFrame、Dataset全都是spark平臺下的分散式彈性資料集,為處理超大型資料提供便利
2、三者都有惰性機制,在進行建立、轉換,如map方法時,不會立即執行,只有在遇到Action如foreach時,三者才會開始遍歷運算,極端情況下,如果程式碼裡面有建立、轉換,但是後面沒有在Action中使用對應的結果,在執行時會被直接跳過。
3、三者都會根據spark的記憶體情況自動快取運算,這樣即使資料量很大,也不用擔心會記憶體溢位
4、三者都有partition的概念,這樣對每一個分割槽進行操作時,就跟在運算元組一樣,不但資料量比較小,而且可以方便的將map中的運算結果拿出來,如果直接用map,map中對外面的操作是無效的。
5、三者有許多共同的函式,如filter,排序等
6、在對DataFrame和Dataset進行操作許多操作都需要這個包進行支援
7、DataFrame和Dataset均可使用模式匹配獲取各個欄位的值和型別
區別:
RDD:
1、RDD一般和spark mlib同時使用
2、RDD不支援sparksql操作
DataFrame:
1、與RDD和Dataset不同,DataFrame每一行的型別固定為Row,只有透過解析才能獲取各個欄位的值。
2、DataFrame與Dataset一般與spark ml同時使用
3、DataFrame與Dataset均支援sparksql的操作,比如select,groupby之類,還能註冊臨時表/視窗,進行sql語句操作。
4、DataFrame與Dataset支援一些特別方便的儲存方式,比如儲存成csv,可以帶上表頭,這樣每一列的欄位名一目瞭然。
Dataset:
這裡主要對比Dataset和DataFrame,因為Dataset和DataFrame擁有完全相同的成員函式,區別只是每一行的資料型別不同。
DataFrame也可以叫Dataset[Row],每一行的型別是Row,不解析,每一行究竟有哪些欄位,各個欄位又是什麼型別都無從得知,只能用上面提到的getAS方法或者共性中的第七條提到的模式匹配拿出特定欄位。而Dataset中,每一行是什麼型別是不一定的,在自定義了case class之後可以很自由的獲得每一行的資訊。
(待續整理)