1. 程式人生 > >機器學習常見問題解答

機器學習常見問題解答

正則化

正則化是針對過擬合而提出的,以為在求解模型最優的是一般優化最小的經驗風險,現在在該經驗風險上加入模型複雜度這一項(正則化項是模型引數向量的範數),並使用一個rate比率來權衡模型複雜度與以往經驗風險的權重,如果模型複雜度越高,結構化的經驗風險會越大,現在的目標就變為了結構經驗風險的最優化,可以防止模型訓練過度複雜,有效的降低過擬合的風險。

奧卡姆剃刀原理,能夠很好的解釋已知資料並且十分簡單才是最好的模型。

過擬合

如果一味的去提高訓練資料的預測能力,所選模型的複雜度往往會很高,這種現象稱為過擬合。所表現的就是模型訓練時候的誤差很小,但在測試的時候誤差很大。

產生的原因

  1. 因為(特徵)引數太多,會導致我們的模型複雜度上升,容易過擬合
  2. 權值學習迭代次數足夠多(Overtraining),擬合了訓練資料中的噪聲和訓練樣例中沒有代表性的特徵.

解決方法

  1. 交叉驗證法
  2. 減少特徵
  3. 正則化
  4. 權值衰減
  5. 驗證資料

泛化能力

泛化能力是指模型對未知資料的預測能力

什麼是交叉驗證法?

它的基本思想就是將原始資料(dataset)進行分組,一部分做為訓練集來訓練模型,另一部分做為測試集來評價模型。

為什麼用交叉驗證法?

  1. 交叉驗證用於評估模型的預測效能,尤其是訓練好的模型在新資料上的表現,可以在一定程度上減小過擬合。
  2. 還可以從有限的資料中獲取儘可能多的有效資訊。

主要有:留出法 (holdout cross validation)(訓練集、驗證集和測試集),  k 折交叉驗證(k-fold cross validation)(

每一次挑選其中 1 份作為測試集,剩餘 k-1 份作為訓練集用於模型訓練。

還有一種比較特殊的交叉驗證方式,Bootstrapping: 通過自助取樣法,即在含有 m 個樣本的資料集中,每次隨機挑選一個樣本,再放回到資料集中,再隨機挑選一個樣本,這樣有放回地進行抽樣 m 次,組成了新的資料集作為訓練集。

生成模型和判別模型

  1. 生成模型:由資料學習聯合概率分佈P(X,Y),然後求出條件概率分佈P(Y|X)作為預測的模型,即生成模型:P(Y|X)= P(X,Y)/ P(X)。(樸素貝葉斯)
    生成模型可以還原聯合概率分佈p(X,Y),並且有較快的學習收斂速度,還可以用於隱變數的學習
  2. 判別模型:由資料直接學習決策函式Y=f(X)或者條件概率分佈P(Y|X)作為預測的模型,即判別模型。(k近鄰、決策樹)
    直接面對預測,往往準確率較高,直接對資料在各種程度上的抽象,所以可以簡化模型

線性分類器與非線性分類器的區別以及優劣

如果模型是引數的線性函式,並且存線上性分類面,那麼就是線性分類器,否則不是。
常見的線性分類器有:LR,貝葉斯分類,單層感知機、線性迴歸
常見的非線性分類器:決策樹、RF、GBDT、多層感知機

SVM兩種都有(看線性核還是高斯核)

  • 線性分類器速度快、程式設計方便,但是可能擬合效果不會很好
  • 非線性分類器程式設計複雜,但是效果擬合能力強

特徵比資料量還大時,選擇什麼樣的分類器?

線性分類器,因為維度高的時候,資料一般在維度空間裡面會比較稀疏,很有可能線性可分

對於維度很高的特徵,你是選擇線性還是非線性分類器?

理由同上

對於維度極低的特徵,你是選擇線性還是非線性分類器?

非線性分類器,因為低維空間可能很多特徵都跑到一起了,導致線性不可分

L1和L2正則的區別,如何選擇L1和L2正則

他們都是可以防止過擬合,降低模型複雜度

  • L1是在loss function後面加上 模型引數的1範數(也就是|xi|)
  • L2是在loss function後面加上 模型引數的2範數(也就是sigma(xi^2)),注意L2範數的定義是sqrt(sigma(xi^2)),在正則項上沒有新增sqrt根號是為了更加容易優化

  • L1 會產生稀疏的特徵

  • L2 會產生更多地特徵但是都會接近於0

L1會趨向於產生少量的特徵,而其他的特徵都是0,而L2會選擇更多的特徵,這些特徵都會接近於0。L1在特徵選擇時候非常有用,而L2就只是一種規則化而已。

特徵向量的歸一化方法

  1. 線性函式轉換,表示式如下:y=(x-MinValue)/(MaxValue-MinValue)
  2. 對數函式轉換,表示式如下:y=log10 (x)
  3. 反餘切函式轉換 ,表示式如下:y=arctan(x)*2/PI
  4. 減去均值,乘以方差:y=(x-means)/ variance
k-means

k-means與kNN雖然都是以k打頭,但卻是兩類演算法——kNN為監督學習中的分類演算法,而k-means則是非監督學習中的聚類演算法;二者相同之處:均利用近鄰資訊來標註類別。

聚類是資料探勘中一種非常重要的學習流派,指將未標註的樣本資料中相似的分為同一類,正所謂“物以類聚,人以群分”嘛。k-means是聚類演算法中最為簡單、高效的,核心思想:由使用者指定k個初始質心(initial centroids),以作為聚類的類別(cluster),重複迭代直至演算法收斂。


在k-means演算法中,用質心來表示cluster;且容易證明k-means演算法收斂等同於所有質心不再發生變化。基本的k-means演算法流程如下:

選取k個初始質心(作為初始cluster);
repeat:
    對每個樣本點,計算得到距其最近的質心,將其類別標為該質心所對應的cluster;
    重新計算k個cluser對應的質心;
until 質心不再發生變化

對於歐式空間的樣本資料,以平方誤差和(sum of the squared error, SSE)作為聚類的目標函式,同時也可以衡量不同聚類結果好壞的指標:(最小化)

SSE=i=1kxCidist(x,ci)

k-means存在缺點:

  • k-means是區域性最優的,容易受到初始質心的影響;因選擇初始質心不恰當而造成次優的聚類結果(SSE較大)

    同時,k值的選取也會直接影響聚類結果,最優聚類的k值應與樣本資料本身的結構資訊相吻合,而這種結構資訊是很難去掌握,因此選取最優k值是非常困難的。

優化:

為了解決上述存在缺點,在基本k-means的基礎上發展而來二分 (bisecting) k-means,其主要思想:一個大cluster進行分裂後可以得到兩個小的cluster;為了得到k個cluster,可進行k-1次分裂。演算法流程如下:

初始只有一個cluster包含所有樣本點;
repeat:
    從待分裂的clusters中選擇一個進行二元分裂,所選的cluster應使得SSE最小;
until 有k個cluster
二分k-means演算法對初始質心的選擇不太敏感,因為初始時只選擇一個質心。

 kNN演算法

kNN演算法是監督學習中分類方法的一種。所謂監督學習與非監督學習,是指訓練資料是否有標註類別,若有則為監督學習,若否則為非監督學習。監督學習是根據輸入資料(訓練資料)學習一個模型,能對後來的輸入做預測。在監督學習中,輸入變數與輸出變數可以是連續的,也可以是離散的。若輸入變數與輸出變數均為連續變數,則稱為迴歸;輸出變數為有限個離散變數,則稱為分類;輸入變數與輸出變數均為變數序列,則稱為標註

kNN演算法的核心思想非常簡單:在訓練集中選取離輸入的資料點最近的k個鄰居,根據這個k個鄰居中出現次數最多的類別(最大表決規則),作為該資料點的類別。最大表決規則等價於經驗風險最小化

存在問題:

k值得選取對kNN學習模型有著很大的影響。若k值過小,預測結果會對噪音樣本點顯得異常敏感。特別地,當k等於1時,kNN退化成最近鄰演算法,沒有了顯式的學習過程。若k值過大,會有較大的鄰域訓練樣本進行預測,可以減小噪音樣本點的減少;但是距離較遠的訓練樣本點對預測結果會有貢獻,以至於造成預測結果錯誤

SVM(Support Vector Machines)

由簡至繁SVM可分類為三類:線性可分(linear SVM in linearly separable case)的線性SVM、線性不可分的線性SVM、非線性(nonlinear)SVM。

線性可分(linear SVM 

線性可分是理想情形,大多數情況下,由於噪聲或特異點等各種原因,訓練樣本是線性不可分的

將距離分離超平面最近的兩個不同類別的樣本點稱為支援向量(support vector)的,構成了兩條平行於分離超平面的長帶,二者之間的距離稱之為margin。顯然,margin更大,則分類正確的確信度更高(與超平面的距離表示分類的確信度,距離越遠則分類正確的確信度越高)。通過計算容易得到:

margin=2w

非線性(nonlinear)SVM

解決非線性分類問題的思路,通過空間變換ϕϕ(一般是低維空間對映到高維空間xϕ(x)x→ϕ(x))後實現線性可分

AdaBoost

AdaBoost能夠自適應(addaptive)地調整樣本的權值分佈,將分錯的樣本的權重設高、分對的樣本的權重設低;所以被稱為“Adaptive Boosting”。sklearn的AdaBoostClassifier實現了AdaBoost,預設的基分類器是能fit()帶權值樣本的DecisionTreeClassifier。

整合學習(ensemble learning)通過組合多個基分類器(base classifier)來完成學習任務,頗有點“三個臭皮匠頂個諸葛亮”的意味。基分類器一般採用的是弱可學習(weakly learnable)分類器,通過整合學習,組合成一個強可學習(strongly learnable)分類器。所謂弱可學習,是指學習的正確率僅略優於隨機猜測的多項式學習演算法;強可學習指正確率較高的多項式學習演算法。整合學習的泛化能力一般比單一的基分類器要好,這是因為大部分基分類器都分類錯誤的概率遠低於單一基分類器的。

偏差-方差分解”(bias variance decomposition)是用來解釋機器學習演算法的泛化能力的一種重要工具。對於同一個演算法,在不同訓練集上學得結果可能不同

誤差可以分解為3個部分:bias、variance、noise

bias度量了演算法本身的擬合能力,刻畫模型的準確性;variance度量了資料擾動所造成的影響,刻畫模型的穩定性。為了取得較好的泛化能力,則需要充分擬合數據(bias小),並受資料擾動的影響小(variance小)。但是,bias與variance往往是不可兼得的:

  • 當訓練不足時,擬合能力不夠強,資料擾動不足以產生較大的影響,此時bias主導了泛化錯誤率;
  • 隨著訓練加深時,擬合能力隨之加強,資料擾動漸漸被學習到,variance主導了泛化錯誤率。

Bagging與Boosting

整合學習需要解決兩個問題:

  • 如何調整輸入訓練資料的概率分佈及權值;
  • 如何訓練與組合基分類器。

從上述問題的角度出發,整合學習分為兩類流派:Bagging與Boosting。

Bagging(Bootstrap Aggregating)對訓練資料擦用自助取樣(boostrap sampling),即有放回地取樣資料;每一次的取樣資料集訓練出一個基分類器,經過

MM次取樣得到MM個基分類器,然後根據最大表決(majority vote)原則組合基分類器的分類結果。

Boosting的思路則是採用重賦權(re-weighting)法迭代地訓練基分類器,即對每一輪的訓練資料樣本賦予一個權重,並且每一輪樣本的權值分佈依賴上一輪的分類結果;基分類器之間採用序列式的線性加權方式進行組合。

從“偏差-方差分解”的角度看,Bagging關注於降低variance,而Boosting則是降低bias;Boosting的基分類器是強相關的,並不能顯著降低variance。Bagging與Boosting有分屬於自己流派的兩大殺器:Random Forests(RF)和Gradient Boosting Decision Tree(GBDT)。本文所要講的AdaBoost屬於Boosting流派。

樸素貝葉斯

樸素貝葉斯(Naïve Bayes)屬於監督學習的生成模型,實現簡單,沒有迭代,學習效率高,在大樣本量下會有較好的表現。但因為假設太強——假設特徵條件獨立,在輸入向量的特徵條件有關聯的場景下並不適用。

樸素貝葉斯分類器的主要思路:通過聯合概率P(x,y)=P(x|y)P(y)P(x,y)=P(x|y)P(y)建模,運用貝葉斯定理求解後驗概率P(y|x)P(y|x);將後驗概率最大者對應的的類別作為預測類別。