https://www.cnblogs.com/zhizhan/p/5007522.html
原文:http://blog.csdn.net/xmu_jupiter/article/details/47108523
對於機器學習的實際運用,光停留在知道了解的層面還不夠,我們需要對實際中容易遇到的一些問題進行深入的挖掘理解。我打算將一些瑣碎的知識點做一個整理。
1 數據不平衡問題
這個問題是經常遇到的。就拿有監督的學習的二分類問題來說吧,我們需要正例和負例樣本的標注。如果我們拿到的訓練數據正例很少負例很多,那么直接拿來做分類肯定是不行的。通常需要做以下方案處理:
1.1 數據集角度
通過調整數據集中正負樣本的比例來解決數據不平衡,方法有:
1.1.1 增加正樣本數量
正樣本本來就少,怎么增加呢?方法是直接復制已有的正樣本丟進訓練集。這樣可以稍微緩解正樣本缺失的困境,但是容易帶來一個問題,就是過擬合的潛在危險。因為這樣粗暴的引入正樣本並沒有增加數據集的樣本多樣性。如何設計復制哪些正樣本有一些技巧,比如選擇有特定意義的代表性的那些。
1.1.2 減少負樣本的數量
首先這是一個通用的合理的方法,但是負樣本的減少必然導致數據多樣性的損失。有一種方法可以緩解這個問題,那就是類似於隨機森林方法,每次正樣本數量不變,隨機選擇等量的不同的負樣本進行模型訓練,反復幾次,訓練多個模型,最后所有的模型投票決定最終的分類結果。
1.2 損失函數的角度
可以重新修改模型訓練的損失函數,使得錯分正樣本的損失變大,錯分負樣本的損失變小。這樣訓練出來的模型就會對正負樣本有一個合理的判斷。
更多於此話題相關內容請移步:
分類中數據不平衡問題的解決經驗
機器學習中的數據不平衡問題
2 異常值處理問題
說到異常值,首先得說一下數據量的問題。異常值不是缺失值,更不是錯誤值,同樣是真實情況的表現,之所以覺得一個數據異常,是因為我們能夠用到的數據量不夠大,無法准確地代表整個此類數據的分布。如果把異常值放在海量數據的大背景下,那么這個異常值也就不那么異常了。
下載摘自某大牛博客一段話:
異常值並非錯誤值,而同樣是真實情況的表現,我們之所以認為異常,只是因為我們的數據量不足夠大而已。但是從實際的工業界來看,考慮到實際的計算能力以及效果,大多數公司都會對大數據做“去噪”,那么在去噪的過程中去除的不僅僅是噪音,也包括“異常點”,而這些“異常點”,恰恰把大數據的廣覆蓋度給降低了,於是利用大數據反而比小數據更容易產生趨同的現象。尤其對於推薦系統來說,這些“異常點”的觀察其實才是“個性化”的極致。
既然說到大數據,同樣是這位大牛的一段話:
說得學術一些,我們不妨認為大數據是頻率學派對於貝葉斯學派一次強有力的逆襲。那么既然說到這個份上了,我們不妨思考一下,我們是不是有希望在回歸貝葉斯學派,利用先驗信息+小數據完成對大數據的反擊呢?
某些機器學習算法對異常值很敏感,比如:K-means聚類,AdaBoost。使用此類算法必須處理異常值。
某些算法擁有對異常值不敏感的特性,比如:KNN,隨機森林。
如何處理異常值?最簡單的方法就是直接丟掉。其它方法我后面會繼續研究。
3 過擬合問題
過擬合可要命了,好不容易訓練一個模型,來一些測試數據,分類結果非常的差。過擬合產生的原因:
- 訓練數據太少
- 模型太復雜
- 訓練數據中存在噪聲點(就算訓練數據足夠多)
幾乎所有的機器學習算法都會容易遇到過擬合的問題。所以先說一些解決過擬合的通用辦法。當然,首先得保證訓練數據不要太少。
3.1 正則化
正則化就是在模型的優化目標上再加入一個懲罰因子。這樣模型的優化策略就從經驗風險最小化變為結構風險最小化。
- 線性回歸正則化就是嶺回歸和lasso回歸,分別對應L2,L1罰項。
- 決策樹正則化就是剪枝,通常把子節點個數作為罰項。
3.2 交叉驗證
在數據量足夠的情況下,可以采用交叉驗證的方式避免過擬合,甚至可以在正則化之后再做一次交叉驗證。
其它詳細研究請點擊:
機器學習過度擬合問題一些原因
4 特征工程問題
有句話必須得放在前面:數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已。由此可見,特征工程尤其是特征選擇在機器學習中占有相當重要的地位。
4.1 什么是特征工程
首先拽一段英文定義:
Feature engineering is the process of transforming raw data into features that better represent the underlying problem to the predictive models, resulting in improved model accuracy on unseen data.
in a word, feature engineering is manually designing what the input x’s should be.
4.2 為什么要進行特征降維和特征選擇
主要是出於如下考慮:
1. 特征維數越高,模型越容易過擬合,此時更復雜的模型就不好用。
2. 相互獨立的特征維數越高,在模型不變的情況下,在測試集上達到相同的效果表現所需要的訓練樣本的數目就越大。
3. 特征數量增加帶來的訓練、測試以及存儲的開銷都會增大。
4. 在某些模型中,例如基於距離計算的模型KMeans,KNN等模型,在進行距離計算時,維度過高會影響精度和性能。
5. 可視化分析的需要。在低維的情況下,例如二維,三維,我們可以把數據繪制出來,可視化地看到數據。當維度增高時,就難以繪制出來了。
在機器學習中,有一個非常經典的維度災難的概念。用來描述當空間維度增加時,分析和組織高維空間,因體積指數增加而遇到各種問題場景。例如,100個平均分布的點能把一個單位區間以每個點距離不超過0.01采樣;而當維度增加到10后,如果以相鄰點距離不超過0.01小方格采樣單位超一單位超正方體,則需要10^20 個采樣點。
正是由於高維特征有如上描述的各種各樣的問題,所以我們需要進行特征降維和特征選擇等工作。
4.3 特征提取
對於高維特征(成百上千維),比如圖像,文本,聲音的特征,特征的每一維沒有顯著意義的,最好要對特征先進行降維,也就是從初始數據中提取有用的信息。通過降維,將高維空間中的數據集映射到低維空間數據,同時盡可能少地丟失信息,或者降維后的數據點盡可能地容易被區分。這樣,可以提取出顯著特征,避免維度災難,還可以避免特征之間的線性相關性。
特征降維常用的算法有PCA,LDA等。
PCA算法通過協方差矩陣的特征值分解能夠得到數據的主成分,以二維特征為例,兩個特征之間可能存在線性關系(例如運動的時速和秒速度),這樣就造成了第二維信息是冗余的。PCA的目標是發現這種特征之間的線性關系,並去除。
LDA算法考慮label,降維后的數據點盡可能地容易被區分。
4.4 特征選擇
通常遇到的情況是:特征不夠用。。在這種情況下,我們就要在設計算法之前,好好地挖掘一下特征。對於邏輯斯蒂回歸和決策樹,每一維的特征是有確切意義的。我們就要從各個方面,抽取與目標相關的所有可用信息作為特征。這個過程可能會比較痛苦。。
然后,是不是特征越多越好?其實也不是。盜一張圖過來如下:
可以發現,剛開始模型的准確率隨着特征數量的增加而增加,當增加到一定程度便趨於穩定了。如果還要強行加入如此多的特征,反而畫蛇添足,容易過擬合。然后,如果出現特征過多出現過擬合的情況,就要適當地進行參數縮減。對於邏輯斯蒂回歸,某一維特征對應的參數如果接近為零,說明這個特征影響不大,就可以去掉。因此,我們的特征選擇過程一般如下:
- 選取盡可能多的特征,必要時先進行降維
- 對特征進行選擇,保留最具有代表性的特征
這個過程的進行要同時觀察模型准確率的變化。
最后,特征選擇有哪些算法呢?
- 過濾方法:將所有特征進行打分評價,選擇最有效的一些特征。比如:卡法檢驗,信息增益,相關系數打分。
- 包裝方法:將特征組合的選擇看做是一個在特征空間中的搜索問題。比如:隨機爬山法,啟發式的搜索方法等。
- 嵌入方法:將特征選擇的過程嵌入到模型訓練的過程中,其實也就是正則化的方法。比如lasso回歸,嶺回歸,彈性網絡(Elastic Net)等。
具體其它細節,以后補充。
推薦一篇美團網的技術報告:
機器學習中的數據清洗與特征處理綜述
還有一篇參考:
機器學習中的特征選擇問題
最后一篇特征選擇的好文:
A introduction on feature seclection

版權聲明:本文為博主原創文章,歡迎轉載,但請注明出處~
訓練樣本大小選取的問題
模型學習的准確度與數據樣本大小有關,那么如何展示更多的樣本與更好的准確度之間的關系呢?
我們可以通過不斷增加訓練數據,直到模型准確度趨於穩定。這個過程能夠很好讓你了解,你的系統對樣本大小及相應調整有多敏感。
所以,訓練樣本首先不能太少,太少的數據不能代表數據的整體分布情況,而且容易過擬合。數據當然也不是越多越好,數據多到一定程度效果就不明顯了。不過,這里假設數據是均勻分布增加的。
然而這里有另一種聲音:
算法使用的數據越多,它的精度會更加准確,所以如果可能要盡量避免抽樣。機器學習理論在預測誤差上有着非常直觀的描述。簡而言之,在機器學習模型和最優預測(在理論上達到最佳可能的誤差)之間的預測誤差的差距可以被分解為三個部分:
由於沒有找到正確函數形式的模型的誤差 由於沒有找到最佳參數的模型的誤差 由於沒用使用足夠數據的模型的誤差
如果訓練集有限,它可能無法支撐解決這個問題所需的模型復雜性。統計學的基本規律告訴我們,如果我們可以的話,應該利用所有的數據而不是抽樣。
其實當然數據越多越好,但是更多的數據意味着獲取的難度以及處理的復雜度等。並且當數據多到一定程度后區別就不那么明顯了。所以我們還是要根據自己情況科學地使用一定數量的數據。
參考資料:
機器學習項目中常見的誤區
開發者成功使用機器學習的十大訣竅
選擇什么模型算法?
很多像我一樣的機器學習新手在遇到問題的時候,都會對用什么樣的模型解決問題感到困惑。除了基本的有監督無監督,分類還是回歸,二分類多分類等等基本的選擇標准,貌似其他的都差不多,通常的做法就是每個模型都試一試,看看哪個效果好就用哪個。。顯然這么做的不夠的。
其實,選擇什么算法最好,關鍵不在於算法,而在於具體要解決的問題,以及問題所具有的數據和特征。下面結合自己的經驗和收集的資料,給出幾點選擇算法的tips。
1 特征角度
特征層次級別
就像古代把人分為三六九等,特征也有層次之分。我們暫且粗略地分為高級別特征和低級別特征,有的時候高級別的特征又叫組合特征。總體上,低級別特征比較有針對性,單個特征覆蓋面小(含有這個特征的數據不多),特征數量(維度)很大。高級別特征比較泛化,單個特征覆蓋面大(含有這個特征的數據很多),特征數量(維度)不大。下圖展示了什么是高級低級特征:
特征級別與線性模型和非線性模型
特征的低級和高級帶來模型選擇上的線性模型和非線性模型的考量:
非線性模型的特征
1)可以主要使用High Level特征,因為計算復雜度大,所以特征維度不宜太高;
2)通過High Level非線性映射可以比較好地擬合目標。線性模型的特征
1)特征體系要盡可能全面,High Level和Low Level都要有;
2)可以將High Level轉換Low Level,以提升模型的擬合能力。
- 線性模型有:邏輯斯蒂回歸,線性SVM等;
- 非線性模型有:決策樹,隨機森林,GBDT等。
例子: 邏輯斯蒂回歸和決策樹用哪個好?
只用高級或者低級特征
那平常我們所糾結的邏輯斯蒂回歸和決策樹用哪個好為例,決策樹是一種非線性模型,因此如果是高級別特征的話我們就選擇決策樹;邏輯斯蒂回歸是一種線性模型,因此如果是低級別特征的話我們就選擇邏輯斯蒂回歸。
然而,在我們是具體應用中,高級特征通常難以獲得,或者獲得的時間和成本很高,然而低級特征卻很容易拿到。所以,在解決問題的初始階段,我們最好先廣泛收集可以用的低級別特征,來一個邏輯斯蒂回歸,作為框架的基線系統。
線性模型對非線性關系缺乏准確刻畫,高級特征剛好可以加入模型的非線性表達,增強模型的表達能力。另外,使用低級特征可以認為是對全局進行建模,而高級特征更加精細,是個性化建模,這就是為什么
- 決策樹深入數據細部,但同時失去了對全局的把握,因為決策樹一般使用高級特征;
- 邏輯回歸始終着眼整個數據的擬合,所以對全局把握較好。但無法兼顧局部數據,或者說缺乏探查局部結構的內在機制,因為邏輯回歸一般使用低級特征;
- 長尾樣本的預測值主要受High Level特征影響,因為長尾樣本是個性化樣本;
- 高頻樣本的預測值主要受Low Level特征影響,因為高頻樣本是大眾化的樣本。
高級特征和低級特征都有
當我們有一些高級特征的時候,就把高級特征和低級特征共同加入到邏輯回歸中進行訓練,這樣訓練出來的模型兼顧了全局化與個性化,會使模型預測的准確率有所提高。具體到邏輯回歸和決策樹的使用上,我們可以充分利用兩者之間的優缺點進行互補。主要思路是利用決策樹對局部數據結構優越的把握能力增加邏輯回歸的效力。在具體做法上有幾種,一種是從決策樹分析中找出數據局部結構,作為在邏輯回歸中構建依變量(interaction)的依據。另一種是在需要對預測因子進行離散化處理時,利用決策樹分析決定最佳切分點。還有一種是把決策樹分類的最終結果作為預測變量,和其他協變量一起代入回歸模型,又稱為“嫁接式模型”。從理論上講,嫁接模型綜合了決策樹和邏輯回歸的優點。最終節點包含了數據中重要的局部結構,而協變量可以拾補被決策樹遺漏的數據整體結構。
本部分參考文獻:
在廣告LR模型中,為什么要做特征組合?
邏輯回歸與決策樹在分類上的一些區別
2 要解決的問題本身
有時候我們要解決的問題可以用單個復雜的模型解決,也可以用多個簡單的模型分別解決各個子問題,再基於各個單模型進行融合解決總問題。融合的方式可以是簡單的線性融合,也可以是更加復雜的融合。
不同模型有不同 優缺點,具體如下:
選擇哪種模式?
1)問題可預估的難度,難度大,則考慮用多模型;
2)問題本身的重要性,問題很重要,則考慮用多模型;
3)多個模型的關系是否明確,關系明確,則可以用多模型。
這一部分主要抄襲美團技術報告:
實例詳解機器學習如何解決問題
3 模型組合
最近模型組合的算法越來越流行,當單個分類器的性能不足以解決實際問題的時候,可以考慮使用模型組合的方法,也就是bagging和boosting的方法。
關於這部分,只知道GBDT在工業界很火,當有了一定了解和實戰經驗后,再來補充。