「文末高能」
編輯 | 哈比
在這個文章中,我們主要面向初學者或中級資料分析師,他們對識別和應用機器學習演算法都非常感興趣,但是初學者在面對各種機器學習演算法時,都會遇到乙個問題是 「在實際專案中,我到底應該使用哪種演算法呢?」。
這個問題的答案取決於許多的因素,其中包括:
資料的維度大小,資料的質量和資料的特徵屬性;
你可以利用的計算資源;
你所在的專案組對該項目的時間預計;
你手上的資料能應用在哪些專案中;
即使是一位經驗豐富的資料科學家,在沒有對資料嘗試很多種不同的演算法之前,他也不能確定哪一種演算法在資料上面有更好的表現。但是,我們並不主張這種方式,乙個乙個演算法去試驗。
我們希望自己有一點先驗知識,可以指導我們去如何選擇演算法模型,幫助我們少走一點彎路。
機器學習演算法表
上面的機器學習演算法表可以幫助我們如何去選擇乙個合適的機器學習演算法,對於我們特定的專案問題。這篇文章,我們主要來講講如何去使用這個**。
因為這個**是為初學者所設定的,所以我們在討論這些演算法的時候,會做一些簡化的假設工作。
這裡所推薦的機器學習演算法是由幾位資料科學家,機器學習專家和演算法開發人員所共同反饋總結的。隨著後續的發展,我們會收集更加全的演算法來更新這張表。
如果你想要進行降維操作,那麼你可以使用主成分分析方法(pca);
如果你想要快速進行手寫數字**,那麼你可以使用決策樹或者邏輯回歸;
如果你想要進行資料分層操作,那麼你可以使用分層聚類。
有時候,我們可能會有很多的條件需要去匹配演算法,但有時候可能我們連一條總結的規則都沒有,以至於不能去利用這個演算法表。其實,這是很正常的,因為這個演算法表是我們憑藉工程師的經驗總結處理的,因此有一些規則並不是很準確。
我和幾個好朋友一起討論過這個問題,我們一直覺得尋找最好的演算法的唯一路徑可能就是去嚐遍所有的演算法。但是這種方法非常 「蠢」。
機器學習型別
這部分我們會介紹一些最流行的機器學習模型型別。如果你對這些類別比較熟悉,那麼對你以後去選擇機器學習模型是非常有利的。
監督學習
監督學習演算法是基於一組標記資料進行**的。
比如,歷史銷售資料可以來**未來的銷售**。應用監督學習演算法,我們需要乙個包含標籤的訓練資料集。我們可以使用這個訓練資料集去訓練我們的模型,從而得到乙個從輸入資料到輸出期望資料之間的對映函式。
這個模型的推斷作用是從乙個資料集中學習出一種模式,可以讓這個模型適應新的資料,也就是說去**一些沒有看到過的資料。
分類:當資料被用於**乙個分類時,監督學習演算法也可以稱為是一種分類演算法。比如,我們的一張可以被分類標記為狗或者貓。如果我們的分類標籤只有兩個類別,那麼我們也把這個分類稱之為二分類問題。當我們需要分類的東西超過兩個類別的時候,這個模型就是乙個多分類模型了。
回歸:當我們**的值是乙個連續值時,這個問題就變成了乙個回歸問題。
半監督學習
監督學習帶來的最大挑戰是標註資料,這是一項非常耗時的工程而且非常昂貴。那麼如果標籤的數量有限,我們應該怎麼辦呢?我們可以使用一些非標記的資料來加強監督學習。
由於在這種情況下我們的機器學習演算法不是完全的監督學習,所有我們把該演算法稱之為半監督學習演算法。
在半監督學習中,我們可以使用未標記的資料和一小部分的標記資料來訓練我們的模型,從而來提高我們模型的準確性。
無監督學習
在使用無監督學習的時候,我們所使用的資料都是不用進行標記的。我們的演算法模型會自動的去發現資料內在的一些模式,比如聚類結構,層次結構,稀疏樹和圖等等。
聚類:將一組資料進行分組,使得乙個組裡面的資料跟別的組裡面的資料是有一定的區別,也就是說每乙個組即使乙個聚類。這種方法經常被用來做資料切分,也就是把乙個大的資料集先切割成幾個小的資料集,而每乙個小的資料集都是乙個高度相似的資料集。這樣可以幫助分析者從中更好的找到資料之間的內部結構。
降維:減少資料變數中的維度。在很多的應用中,原始資料都是非常高維度的特徵,但是這些維度中很多的特徵都是多餘的,或者說跟任務的沒有相關性。降低維度可以幫助我們更好的而發現真實資料之間潛在的內部關係。
強化學習
強化學習是根據環境對智慧型體(agent)的反饋來分析和優化智慧型體的行為。智慧型體根據不同的場景會去嘗試不同的動作,然後分析不同動作所會帶來什麼的回報,選取其中最大回報作為所採取的最終動作。
反覆試錯和獎勵機制是強化學習和別的演算法最不同的地方。
那麼如何選擇這些類別的演算法呢?
當我們去選擇乙個演算法的時候,總是會考慮到很多的方面,比如:模型準確率,訓練時間,可擴充套件性等等。這其中,最重要的可能就是準確率,但是對於初學者而言,可能最重要的是他們的熟悉程度。如果他們對乙個模型很熟悉,那麼第乙個嘗試的往往就是這個模型。
當給定乙個資料集的時候,我們首先想到的應該是如何快速的得到乙個結果,也就是我們常說的 demo 演算法。在這個過程中,我們首先關心的並不是演算法結果的好壞,而是一整個演算法在資料上面執行的流程。
初學者更加傾向於去選擇一些容易實現的演算法,並且可以快速得到結果。這樣的工作節奏是非常好的,一旦你獲得了一些結果並且熟悉了資料,你可能就會願意花更多的時候去使用更加複雜的演算法來理解這些資料,從而獲得更好的結果。
即使我們到了這個階段,最好的演算法可能也不是那個獲得最高準確率的演算法,因為對於乙個演算法我們需要仔細的去調整引數和長時間訓練才能得到乙個演算法模型的最佳效能。而上面我們只是去簡單的執行了一下模型,得到乙個結果而已。
選擇演算法時的注意事項
正確率獲得最準確的答案可能不總是最必要的。有時乙個近似答案也是足夠了,當然這取決於你想要如何去使用你自己的演算法模型。如果是這種情況,你可以採用乙個近似的方法來縮短你構建模型的時間。
這種近似的處理方式還有另乙個優點,就是可以幫助我們一定程度上面避免過擬合。
訓練時間
訓練模型所需要的時間在不同演算法之間是變化很大的,有些演算法可能幾分鐘就可以訓練完成,有些演算法可能需要幾個小時才能訓練完成。訓練時間往往與模型準確率是密切相關的,簡單的說,可能訓練時間越長,模型的準確率就越高。
另外,有些演算法可能對數值離散點資料更加敏感,而有些可能對連續資料更加敏感。如果我們的資料集非常大,而且時間非常緊,那麼根據模型的訓練時間來選擇演算法是一條非常好的路徑。
線性很多的機器學習演算法是可以利用線性模型來解決的。線性分類演算法假設資料是可以利用一條直線來進行**的。
線性回歸模型假設資料遵循一條直線劃分,這些假設對於一些資料分析並不是乙個很壞的假設,但是在某些方面,這些假設可能就會降低很多的準確率。
對於一些非線性邊界 —— 依賴於線性分類模型就會降低很多的精度了。
有些資料可能無法簡單的判斷資料是線性的還是非線性的,但是在實際專案中很多的資料都會有一種非線性趨勢,這也是我們使用線性回歸方法產生比較大的誤差的乙個原因。
儘管線性模型存在很多的不好方面,但是他往往是最簡單的演算法,我們可以進行快速開發和試錯。
模型引數
引數是機器學習模型中最重要的部分。比如,模型的迭代次數,模型的規模大小等等都會影響到最後我們需要得到的結果,對演算法的訓練時間和準確性都是非常敏感的。
通常,具有大量引數的演算法都需要我們更多的實驗和調參來找到乙個最好的引數組合。
當然大型的引數組合也是具有很多好處的,比如演算法的靈活性會更加的強大。通常,我們可以得到乙個更加好的模型結果。
個別演算法的精準使用
對於個別演算法,我們需要認真仔細的研究它的 「脾氣」,知道這些演算法的輸入資料特徵是什麼,演算法具體描述是什麼,他們是如何工作的額,以及他們的輸出結果是代表什麼含義。接下來,我們來學習幾個例子。
線性回歸和邏輯回歸
線性回歸是利用數理統計中回歸分析,來確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法。**值 y 與變數 x 之間的關係是:
其中訓練資料集是:
引數向量 β 是我們需要模型學習的。
如果因變數不是連續的,而是離散分類的,那麼線性回歸就需要被轉換成邏輯回歸。邏輯回歸是一種非常簡單,但是非常強大的分類演算法。因此,當我們討論二分類問題時,可以把等式寫成:
在邏輯回歸中,我們使用不同的假設估計來區分屬於類別 「1」 的概率和屬於類別 「-1」 的概率。具體的說,我們嘗試學習的函式是:
其中,決策樹和整合樹
決策樹,隨機森林和梯度提公升都是基於決策樹實現的演算法。決策樹有很多種,但是所有的變種都只做一件事 —— 將特徵標籤細分到特定相同的區域裡面。決策樹是非常容易理解的,而且非常容易實現。
然而,當我們把樹的深度做的很深的時候,模型就非常容易過擬合。這時候,採用隨機森林和梯度提公升演算法可以獲得良好的效能,這兩種模型也是目前比較流行的方式。
神經網路和深度學習
神經網路是在 20 世紀 80 年代中期由於其並行和分布式的處理能力而興起的。近年來,由於卷積神經網路,迴圈神經網路和一些無監督學習演算法的興起,圖形處理單元(gpu)和大規模並行處理(mpp)等越來越強大的計算能力,使得神經網路再次得到了復興。
換句話說,以前的淺層神經網路已經演變成了深層神經網路。深度神經網路在監督學習中取得了非常好的表現,比如語音識別和影象分類領域都獲得了比人類好的正確率。在無監督領域,比如特徵提取,深度學習也取得了很好的效果。
一般情況下,乙個神經網路主要由三方面組成:輸入層,隱藏層和輸出層。訓練資料定義了輸入層和輸出層的維度大小。當我們的輸出層是一些分類標籤的時候,那麼那麼我們整個模型所處理的就是乙個分類問題。當輸出層是乙個連續變數的時候,那麼我們的整個模型所處理的就是乙個回歸問題。當我們的輸出層和輸入層相同時,那麼我們的這個模型所處理的可能是提取資料內部的特徵。中間的隱藏層大小決定了整個模型的複雜性和建模能力。
總結至此,我們已經學習了幾個演算法的精準使用。在我們實際的專案中,我們需要做到對自己所熟悉的個別演算法靈活使用。具體的演算法表,可以檢視下面這個:
關於cachedrowset在實際專案中的應用
由於專案需求原因,需要實現乙個功能就是,抽取大量的資料庫資料然後寫入文字並打包上傳。看似乙個很簡單的東西,在大資料量的環境下就顯得不是那麼簡單了。首先有60張左右的表需要進行資料的處理。各個公司情況不同,表的總資料量可能是幾千萬到幾十億不等。所以,耗時非常嚴重。由於只是單純的進行資料的提取加工寫入文...
OTP在實際專案中的整合
提起動態令牌,大家都會想到認證伺服器,而這個認證伺服器又怎麼應用到實際的應用系統中呢?在這裡做乙個分析和說明,幫助廣大使用者能夠更好的使用otp動態令牌這種身份認證產品。從前面otp原理部分中可以看出,伺服器端是在乙個範圍內計算出多個otp,然後檢驗客戶端硬體產生的otp口令是否在這個範圍內。那麼伺...
元件在實際專案中的使用
元件在實際專案中的使用 自動封裝元件 封裝元件後元件間傳值 父傳子props 子傳父 emit 元件事件的呼叫 在父元件內 元件標籤新增ref 自定義名 this.refs.自定義元件名.子元件方法 元件插槽 套入資料或分開布局 slot的使用就像它的名字一樣,在元件內定義一塊空間,取名為slota...