ml0


0、知識點

監督分為分類和回歸

回歸問題:預測明天多少度(輸出是連續變量):線性回歸,決策樹,KNN,神經網絡,boosting和bagging

分類問題:預測明天是晴天還是雨天(輸出是離散變量):LR,svm,因子分解機,朴素貝葉斯,決策樹,KNN,神經網絡,boosting和bagging

無監督學習包括聚類(Kmeans,混合高斯,層次聚類),關聯與推薦,PCA

泛化強:對未知數據集也能表現良好

s.t.=受約束=已知

如:
目標函數:min {x+2}
s.t. x={1,2,3}

其題意為,已知x的取值為1、2、3,求x+2的最小值。

二分類中的線性和非線性: 

線性分類器就是用一個“超平面”將兩個樣本隔離開,如:

(1)二維平面上的兩個樣本用一條直線來進行分類;
(2)三維立體空間內的兩個樣本用一個平面來進行分類(如下圖);
(3)N維空間內的兩個樣本用一個超平面來進行分類。

非線性分類器就是用一個“超曲面”或者多個超平(曲)面的組合將兩組樣本隔離開(不屬於線性的分類器),如:

(1)二維平面上的兩組樣本用一條曲線或折線來進行分類;
(2)三維立體空間內的兩組樣本用一個曲面或者折面來進行分類;
(3)N維空間內的兩組樣本用一個超曲面來進行分類。

【線性回歸】

在幾何問題上,線性回歸就是尋找一個超平面去擬合樣本點(把樣本點都放上去),當樣本是二維時(x1,x2)就是找一條直線,定義損失函數為最小二乘估計的損失函數,W是待求參數:

 當W為下圖時,損失最小:

 

最小二乘法的損失函數最小化問題《=》噪聲(預測值-真實值)服從高斯分布的極大似然估計 

 特點是:線性、全局性、數據未加工(未降維)

【線性分類】 

  【感知機】

它是二分類的線性模型,其輸入是實例的特征向量,輸出的是事例的類別,分別是+1和-1,屬於判別模型,學習的目標在幾何上就是學到一個超平面 wx+b=0 能將2類樣本分開就行,所以存在很多超平面都滿足,模型是:f(x)=sign( wx+b ),等價於一個全連接層加含有1個神經元的輸出層,激活函數是sign

【邏輯回歸LR】

用於解決二分類問題,假定二分類標簽為y = 0 or 1

判別模型的 P(y=1 | x ) = h(x) = sigmoid(wx) =  sigmoid(w1x1+w2x2),即已知該樣本的特征x1,x2,求該樣本的標簽y=1的概率值

等價於全連接神經網絡+1個神經元的輸出層,激活函數是sigmoid,損失函數是交叉熵

MLE來求W:

 

 

因此基於極大似然估計,定義交叉熵代價函數如下:

所以單個樣本的損失=   -  log(預測該樣本屬於實際類別的概率),對於多分類交叉熵也是一樣

其中sigmoid的導數:

 

導數的值域為(0,0.25)

代碼:

定義目標函數:

 

為了使得目標函數最大,利用梯度上升算法,梯度更新符號由-變+:

def sigmoid(inX):  #sigmoid函數
    return 1.0/(1+exp(-inX))

def gradAscent(dataMat, classLabels): # 梯度上升更新參數
# dataMat:m*n大小,一行對應一個樣本的特征
# classLabels:m*1,樣本標簽
    m,n = shape(dataMatrix)
    alpha = 0.001  # 學習率
    maxCycles = 500 #設置迭代的次數
    weights = ones((n,1)) # 初始化權重參數
    for k in range(maxCycles): # 迭代500次
        h = sigmoid(dataMatrix*weights)  # XW
        delta = dataMatrix.T* (classLabels - h)  # 偏導
        weights = weights + alpha * delta # 迭代更新權重
    return weights

 

【線性判別分析】

用於二分類問題,找一個超平面,使得樣本映上去后,類內間距小(類內方差小),類間大(類的均值之間相差大),即求J取最大時的w,找到超平面之后,就把點映射上去,設定一個閾值,判定它的類別

 

 【高斯判別分析】

這是個二分類生成模型,假定樣本的標簽服從伯努利分布(一次實驗,2個結果),但是參數fai未知,特征x | y=0 服從高斯分布1,x | y=1服從高斯分布2,參數μ,theta也未知(這些分布對所有樣本都成立)

要算概率的時候就拿pdf來算

通過最大化概率積P(y1|x1)P(y2|x2)P(y3|x3)...P(yn|xn)求出參數,進而比較 P(y=i | 預測x)之間的大小

此處:根據貝葉斯公式,由於比較P(y|x)之間的大小和比較P(x|y)P(y)之間的大小關系等價,所以就是最大化

P(x1|y1)P(y1)*P(x2|y2)P(y2)*P(x3|y3)P(y3)*....*P(xn|yn)P(yn)

 

 

 【朴素貝葉斯分析】 

可以看做高斯判別分析的推廣,只不過加了個朴素的假設,它是一個生成模型,可用於分類和回歸模型

朴素的假設:特征之間的取值相互獨立《=》P(x|y) = P(x1|y)*P(x2|y)*P(x3|y)*..P(xn|y),這只是為了好算

categorial distribution:一次實驗有N個結果

伯努利分布:一次實驗有2個結果

多項式分布:N個categorial distribution,即做N次實驗,每次實驗有N個結果

若特征是離散的,則假定特征服從categorial distribution,若特征是連續的,則假定服從高斯分布

對於標簽的假定也是如此

【SVM】

SVM是一個面向數據的分類算法,一個判別模型,它的目標是為確定一個分類超平面,從而將不同的數據分隔開。距離超平面最近的這幾個訓練樣本點被稱為支持向量,目標是使得兩個異類支持向量到超平面的距離之和為最大。數學上就是找個一個合適的 f(x) = sign ( wx+b ) 使得間隔最大化

svm分為hard-margin svm,soft-margin svm和kernel svm

hard-margin svm:當訓練數據線性可分時,通過硬間隔最大化,學習一個線性的分類器

soft-margin svm:當訓練數據近似線性可分時,通過軟間隔最大化,也學習一個線性的分類器

kernel svm:當訓練數據線性不可分時,通過使用核技巧及軟間隔最大化學習分類器

 

hard-margin svm推導:

 

 

【補充】:上述對偶問題自然滿足弱對偶性,即max min L <= min max L;凸優化+slater條件能推出強對偶關系,由於svm是二次規划問題,滿足以上,所以強對偶成立=>2問題同解,而且強對偶關系<=>KKT條件

slater條件:(relintD是D內的非邊界點,m是一個約束式子)

不使用SMO算法的話也可以使用KKT求出:

 

  

 soft-margin svm:允許樣本存在一些噪聲,此時就要求樣本點可以去分界面的反方向(即分類錯誤),這點體現在約束上,但是不能離分界面太遠(錯的離譜),這點體現在目標函數上,所以引入松弛變量 [公式] > 0,當所有[公式] = 0,就回到了硬間隔了,優化問題為:

 

 這里的C是錯誤程度,比如當C很大的時候,為了使目標函數最小化,我們只能讓 [公式] 接近於0,這樣也就變成了“硬間隔”SVM,表示無法容忍噪音點(錯誤)存在。后面解法類似硬間隔。

 kernel svm:使用了核技巧,核將低緯度非線性可分問題轉換為高緯度線性可分問題,同時高緯度空間出現的內積可以通過引入正定核函數來簡化運算

 【補充】:

核函數和正定核函數的定義(下面的X是低緯度空間,R是一個高維度空間,fai都能把低緯度映射到高維度,核能把2個低緯度映射到高緯度):

希爾伯特空間的元素是函數:

核函數有:線性核函數(未做映射),多項式核函數,高斯核函數,通過核函數可以直接求出映射到高維空間后的內積,其中高斯核函數用的最多,不僅僅是因為需要調的參數比較少。
最重要的原因是:\color{red}{高斯核函數等價於低維映射到無窮維后展開后的點積。} 

 

 

【LR與SVM的比較】

第一,本質上是其loss function不同,​邏輯回歸方法基於概率理論,假設樣本為1的概率可以用sigmoid函數來表示,然后通過極大似然估計的方法估計出參數的值,支持向量機​基於幾何間隔最大化原理,認為存在最大幾何間隔的分類面為最優分類面

第二,支持向量機只考慮局部的邊界線附近的點,而邏輯回歸考慮全局,影響SVM決策面的樣本點只有少數的支持向量,當在支持向量外添加或減少任何樣本點對分類決策面沒有任何影響,抗噪聲能力要強於LR;而在LR中,每個樣本點都會影響決策面的結果。
第三,在具體應用時,LR很少運用核函數機制,這帶來的計算復雜度是相當高的,支持向量機采用核函數的機制
第四,計算復雜度不同。對於海量數據,SVM的效率較低,LR效率比較高。
 

機器學習之深入理解SVM

http://blog.csdn.net/sinat_35512245/article/details/54984251

https://www.bilibili.com/video/BV1Hs411w7ci?p=3

實戰:svm.ipynb

https://blog.csdn.net/weixin_38753213/article/details/110358948

2.請簡要介紹下Tensorflow的計算圖。

TensorFlow和Pytorch都需要通過編程構建一個計算圖,然后將數據作為輸入,通過這個計算圖規定的計算操作進行計算,最后得到計算結果。計算圖模型由節點(nodes)和線(edges)組成,節點表示操作符Operator,或者稱之為算子,線表示計算間的依賴,實線表示有數據傳遞依賴,傳遞的數據即張量。計算圖從本質上來說,是TensorFlow在內存中構建的程序邏輯圖,計算圖可以被分割成多個塊,並且可以並行地運行在多個不同的cpu或gpu上,這被稱為並行計算。因此,計算圖可以支持大規模的神經網絡,如下:

 

 2、PCA

降維分為人工直接降維、線性降維(PCA、MDS)、非線性降維(ISOMAP、LLE)

思想:將一組線性相關的變量通過正交變換變換到一組線性無關的變量(主成分),即對原始特征空間的重構

可以通過2種方法求出主成分:最大投影方差/最小重構代價

最大投影方差:尋求主成分uk使得樣本映射上去之后方差最大

最小重構代價:用主成分uk分別表示原來樣本和降維后的樣本,兩樣本之間的距離最小

求出主成分后發現方差矩陣S的特征向量就是主成分,想降到幾維就取幾個特征向量

還可以對HX(中心化后的數據矩陣)做奇異值分解,找到V,也能得到主成分 

 

  

3.在k-means或kNN,我們是用歐氏距離來計算最近的鄰居之間的距離。為什么不用曼哈頓距離?

k-means:屬於無監督(標簽)學習

kmeans是按照距離將樣本點分為k類,k是事先定好的
kmeans流程:
1、選取K個點做為初始聚集的簇心,也可選擇非樣本點;
2、分別計算每個樣本點到 K個簇心的距離,該點離哪個簇心近,它就歸屬到對應的簇,直到所有點都歸屬到簇,此時所有點被分為了 K個簇(類)。
3、重新計算每個簇的中心,作為新的簇心;
4、反復迭代 2 - 3 步驟,直到達到簇中心收斂。

k值的確定:采用先驗知識或者使用輪廓系數(Silhouette Coefficient和Calinski-Harabasz score),它能衡量簇內的稠密程度和簇間的離散程度,值越大則聚類效果越好

Silhouette Coefficient:它計算每個樣本點的輪廓系數均值作為最終輪廓系數,它的范圍在【-1,1】,選擇最終輪廓系數最大的 k 值就好,單個樣本點的輪廓系數計算公式是:(b-a)/max(b,a),其中b是該樣本點到其他簇心距離的平均,a是該樣本到自己簇心的距離的平均

 Calinski-Harabasz score:

 

 

詳細:https://blog.csdn.net/weixin_39857513/article/details/109883946

實戰:Kmeans.ipynb

https://blog.csdn.net/lynn_001/article/details/86679270

Knn:屬於監督學習,看與未分類樣本最近的K個已分類樣本,取K個已分類樣本中類別數最多的類別

詳細:https://blog.csdn.net/acceptedday/article/details/99681262

 

曼哈頓距離(只能橫着走,豎着走,不能斜着走,最后計算總距離):

991e80130b95feab5c870c7d6d5f4bee.png

歐氏距離:n維空間2點的直線距離

366b726a3e603775d4d3059461809cf3.png

其中:

樣本x:x1 x2 x3 x4 x5 ... xn

樣本y:y1 y2 y3 y4 y5 ... yn

 

7、決策樹

決策樹是一種樹形結構,常用的分支准則:信息增益、信息增益比、Gini系數。不同分支規則對應不同的樹,如ID3,C4.5,CART決策樹,其中cart既能回歸又能分類

比如【ID3決策樹】

計算每個屬性的信息增益(標簽離散+特征離散),最大的信息增益的屬性作為划分屬性,從而進行一次划分,然后對葉子節點繼續划分

詳細:https://blog.csdn.net/qq_41661809/article/details/90321622

 

 8、cart 決策樹

是二叉樹,每個划分節點以是否進行划分,cart分類樹:基於基尼系數划分;cart回歸樹:采用誤差平方和度量

【cart 分類樹】

步驟:

1️⃣計算所有特征的基尼系數,如果某個特征列的值都一致,則不用考慮它:

|D|=總樣本數=8

特征只有2個取值的基尼系數是相等的,即Gini(D,工資=0)=Gini(D,工資=1)=工資為1的有3個 / 8 *(1-   這3個是“好的”概率的平方 -  這3個是“不好”概率的平方 )  +  工資不為1的有5個 / 8 * (1-  這5個是“好的”概率的平方 -  這5個是“不好”概率的平方 ) 

2️⃣選擇基尼系數最小的特征作為划分節點(基尼系數越大,不確定性越大),然后划分所有樣本D,划分為D0,D1:

對於D,選擇最小的基尼系數0.3,工資和平台=0都行,此時選擇工資=0(/工資=1 )作為划分依據,將D划分為D0,D1

3️⃣如果某個子集的樣本標簽一致,則不用划分它,只划分標簽不一樣的子集:

D1的標簽一致,不用再划分,此時划分D0

4️⃣對於新的子集,繼續計算基尼系數並進行划分,直到所有子集內的樣本標簽一致停止(假定停止條件是准確率100%),此時生成了決策樹 :

D0此時前面的特征不在考慮,接下來計算D0中壓力和平台=0、1、2的基尼系數

選最小的平台=0作為依據繼續划分

 5️⃣ 預測:輸入要預測的樣本,待預測樣本落至某一葉子節點,則輸出該葉子節點中所有樣本所屬類別最多的那一類(即葉子節點中的樣本可能不是屬於同一個類別,則多數為主)

 

 【cart 回歸樹】

定義Cm為第m個葉子節點里面所有樣本的標簽值的平均,單個葉子的損失為它里面所有樣本的標簽與葉子c的差值平方和,整體損失函數為所有葉子的損失加起來

列舉按照所有特征的所有的候選值進行划分后的結果,取最小的損失,比如針對第一個特征(若有特征列完全一樣,不考慮該列),如年齡有10,14,17,取中間值作為候選閾值:12,16,每個閾值對應一棵小樹,求每個小樹的損失值,取最小損失的樹作為第一次划分,此時樣本被分為2類D1,D2,然后接下來分別對子集進行同樣的划分操作,如對子樹D1,先對身高特征選候選閾值,然后計算所有可能的樹的損失,取最小的那個,其他子集操作相同....

預測時,預測樣本落在哪個節點,就預測它的標簽為節點的C值,假定有M個葉子,公式預測值 f(x) 為:

 

 

 

6、集成學習

集成算法:使用多個機器學習模型來構建

集成學習分為boosting和bagging

7、boosting

 

 

【adaboost】

用於解決二分類問題,標簽為-1/1,假定 n 個弱分類器G,一般選用單層決策樹,即當x<k,G(x) = 1,當x>=k,G(x) = -1,k是參數,需要訓練學習

首先初始化每個數據的權重,1/N,然后訓練第一個分類器G1(在候選閾值中找到使得它的分類錯誤率最低的K),計算誤差e=分類錯誤的樣本的權重之和,再算G1的權重α1,根據公式,誤差率大的話該學習器的權重就小(重要性降低):

 

然后采用指數損失函數更新訓練數據的權值,使得分類正確的樣本降低它的權重,分類錯誤的樣本提高它的權重,指數損失的公式:

 

 在更新了的權重的數據集上,訓練第二個分類器....,最后用G(x)做最終的分類器

 上面算法的理論基礎是前向分布算法+指數損失函數,前向分布算法的思想是先更新第一棵樹的參數,再更新第二棵樹,再第三棵樹...,而不是采用傳統梯度下降的思想,因為梯度下降是一次性更新所有樹,參數太多了,計算量太大了。

 

項目:AdaBoost.ipynb

https://www.cnblogs.com/pinard/p/6136914.html

https://blog.csdn.net/cindy407/article/details/94867720

https://www.bilibili.com/video/BV1x44y1r7Zc?p=4&spm_id_from=pageDriver

【提升樹】 

分類器的權重都為1,預測值=所有分類器的輸出相加=落入的每棵樹的葉子值相加

二分類問題的提升樹:算法流程和adaboost一樣,只不過分類器的權重置為1了

回歸問題的提升樹:分類器是回歸樹,每個分類器的輸出就是對殘差的逼近,即用殘差來訓練每個分類器,殘差是指前n-1個分類器的輸出和與真實值的差,采用前向分布算法依次優化每個分類器,損失函數為平方誤差損失

 

GBDT(二分類和回歸的推廣):此時的損失函數是一般意義上的,分類器是回歸樹,目標是新增一個決策樹不會使得整體損失變大,即:

 

其中fm(x)=前m個分類器輸出之和,通過一階泰勒展開推導出用損失函數的負梯度去做擬合才能滿足條件, 所以算法流程是:計算當前損失函數的負梯度,把樣本代進去得到訓練樣本,訓練樣本的標簽就是負梯度,用這些訓練樣本去擬合當前分類器,然后按照前向分布算法再訓練下一個分類器,當損失函數用MES時,負梯度就是殘差了,對於二分類問題,損失函數用交叉熵,分類器相加的結果再通過sigmoid函數作為預測值,由於為了使得負梯度能更好地擬合等價於使得整體損失函數更小,在用訓練樣本建立單棵回歸樹時沒有采用它傳統的MSE,而是用整體損失函數作為評估,在候選回歸樹中,選擇使得整體最小的回歸樹,因此每個葉子節點的標簽不再是平均值了,而是使用整體損失函數+泰勒二階導數推出來的值,但是傳統回歸樹的構造結構和采用整體損失函數進行樹的構造結構一樣,所以為了簡化運算,先用mse來構造樹,然后葉節點的標簽用整體損失函數的推導結果:

 

 

項目:GBDT.ipynb

xgboost

xgboost針對傳統GBDT算法做了很多細節改進,損失函數在平方誤差的基礎上還要加個正則項,其中正則項為:

 其中T是葉子節點個數,wi是葉子節點的值,2個超參數

 使用貪婪+增益來划分樹:列出划分根節點的所有情況,計算每個增益(標簽連續)=划分前損失-划分后損失,此處引入一階+二階泰勒展開方便計算,然后取最大的增益划分,即損失下降的最快,然后子節點同理,都是一個一個節點來處理的

 不想考慮所有特征列了,速度太慢=》優化——列采樣:1、按樹隨機:先隨機選幾個特征,然后樹的划分就只看這幾個特征了,其他特征拋棄,2、按層隨機:每層的候選特征列是重新隨機的,即每一層划分前,隨機選擇部分特征列,然后這一層就在部分特征列里面選擇特征,下一層划分時,又重新地隨機選擇部分列....

 不想考慮所有候選特征值了=》優化——加權分位法:定義每個樣本點的權重為損失函數在該點的二階導,搜索候選特征值,使得按該特征值划分子集之后,子集里面的樣本權重加起來差不多,即不會頭重腳輕

缺失值處理:將特征列x1為空的樣本都收集起來作為集合D,分別計算一下把D放到每個葉子里面的增益,哪個增益大就放到哪個葉子

時間復雜度優化:犧牲空間,提前分別按照特征列將樣本預排序並分塊存入磁盤,如:

 

 每個塊不僅存儲索引,還存有相對應的樣本梯度信息以方便計算的時候直接提取,這樣還能提高緩存利用率,新建一個線程專門用於存取塊,而且對各個子樹的划分進行並行處理

 【LightGBM】

相對於xgboost, 具有訓練速度快和內存占用率低的特點。XGBoost不足之處在於:xgboost在進行最優分裂點的選擇上是先進行預排序,然后對所有特征的所有候選分裂點計算這些分裂點分裂后的目標函數增益,這個過程的空間復雜度和時間復雜度很大。LightGBM 從多個角度出發,對XGBoost算法進行優化:

(1)為了解決分裂點數量過多的問題,LightGBM采用直方圖算法。

決策樹的划分不再以樣本點划分,而是以直方圖為單位。直方圖算法說白了就是對特征進行分桶,先把連續的浮點特征值離散化成k個整數,同時構造一個寬度為k的直方圖, 並根據特征所在的bin對其進行梯度求和個個數統計,這樣計算增益只用以bin里的梯度和為單位,計算增益的時間復雜度從不同特征值數量 [公式] 降低到直方圖箱數量 [公式] ,所以速度提升會很明顯。bins的數量是遠小於樣本不同取值的數量的,所以分桶之后要遍歷的分裂點的個數為num-bins-1,2個bin中間的做候選,減少了計算量。

在這里插入圖片描述

在這里插入圖片描述

LightGBM另一個優化是Histogram(直方圖)做差加速。一個葉子的直方圖可以由它的父親節點的直方圖與它兄弟的直方圖做差得到,在速度上可以提升一倍。在實際構建樹的過程中,LightGBM還可以先計算直方圖小的葉子節點,然后利用直方圖做差來獲得直方圖大的葉子節點,這樣就可以用非常微小的代價得到它兄弟葉子的直方圖。直方圖做差加速能讓耗時降低到原先的 [公式]

 在這里插入圖片描述

(2)為了解決樣本數量過多的問題, Lightgbm采用單邊梯度抽樣算法。

GBDT中梯度小的訓練樣本可以說明數據已經被模型學習得很好了,直接想法就是丟掉這部分梯度小的數據。然而這樣做會改變數據的分布,將會影響訓練模型的精確度,為了避免此問題,提出了GOSS算法。GOSS算法的亮點在於:根據樣本的權重信息對樣本進行抽樣,減少了大量梯度小的樣本,但是還能不會過多的改變數據集的分布

GOSS在進行數據采樣的時候只保留了梯度較大的數據,但為了避免丟棄梯度小的數據而帶來樣本分布的改變,在計算增益時為梯度小的樣本引入一個常數進行平衡。

GOSS算法首先將要進行分裂的特征的所有取值按照絕對值大小降序排序,選取絕對值最大的 a% 個數據。然后在剩下的較小梯度數據中隨機選擇 b% 個數據。接着將這 b% 個數據乘以一個常數(1 − a) / b。這樣算法不會過多改變原數據集的分布。最后使用這( a + b ) %個數據來計算信息增益。舉例說明:
在這里插入圖片描述

通過采樣的方式,選出了兩個梯度大的6號和7號,然后又從剩下的樣本里面隨機選了2個梯度小的4號和2號,如果直接把另外四個給刪掉的話,這時候會改變數據的分布,但應該怎么做呢? 也就是乘以一個常數(1 − a) / b,如下圖所示:

在這里插入圖片描述

梯度小的樣本乘上相應的權重之后,我們在基於采樣樣本的估計直方圖中可以發現Ni的總個數依然是8個, 雖然6個梯度小的樣本中去掉了4個,留下了兩個。 但是這2個樣本在梯度上和個數上都進行了3倍的放大,所以可以防止采樣對原數數據分布造成太大的影響。

(3)為了解決特征數量過多的問題,Lightgbm采用互斥特征捆綁算法
高維度的數據往往是稀疏的,這種稀疏性啟發我們設計一種無損的方法來減少特征的維度。通常被捆綁的特征都是互斥的(即特征不會同時為非零值,像one-hot),這樣兩個特征捆綁起來才不會丟失信息。如果兩個特征並不是完全互斥(部分情況下兩個特征都是非零值),可以用一個指標對特征不互斥程度進行衡量,稱之為沖突比率,當這個值較小時,我們可以選擇把不完全互斥的兩個特征捆綁,而不影響最后的精度。EFB算法就是通過捆綁特征來降低特征的維度。EFB 算法利用特征和特征間的關系構造一個加權無向圖,從而判定哪些特征應該綁在一起

 (4)帶深度限制的 Leaf-wise 算法:

與前面的按層生長的決策樹生長策略不同,該算法每次從當前所有葉子中,找到分裂增益最大的一個葉子,然后分裂,如此循環,同時增加了一個最大深度的限制,在保證高效率的同時防止過擬合。在同等分裂次數的情況下,顯然按葉子生長能夠把損失函數降低更多。

(5)采用 many-vs-many 模式分裂節點:對於類別特征,傳統的決策樹在學習節點分裂時,是一種 one-vs-rest 模式,每次只能根據一個類別做分類,如下圖。這種模式效率比較低,而且不利於決策樹學習。LightGBM 對此進行了優化,采用 many-vs-many 模式分裂節點,如下圖。

(6)多機並行優化:之前的並行方法主要有兩種:1)特征並行(每個 worker 擁有全部樣本的部分特征);2)數據並行(每個 worker 擁有一部分數據的全部特征)。他們都是針對尋找最優分裂點這個過程,進行並行計算,LightGBM 在數據並行的基礎上進行了優化,提出選舉並行,極大地降低通信耗時

 

詳細:

https://blog.csdn.net/zhong_ddbb/article/details/106244036

 https://zhuanlan.zhihu.com/p/366952043

8、

 【bagging】

 如隨機森林

1、對於每棵樹而言,隨機且有放回地從訓練集中的抽取樣本作為該樹的訓練集,所以每棵樹的訓練集里面可能包含重復的訓練樣本。

2、將K個訓練集抽取的樣本分別給K個基(弱)分類器訓練(並行),在訓練每棵樹時,如果存在M個特征,則在每個節點分裂的時候,從M中隨機選擇m個特征維度(m << M),使用這些m個特征維度中最佳特征來分割節點

3、

 

詳細:https://www.bilibili.com/video/BV1x44y1r7Zc?p=3

 

10、處理樣本(某個類別過多,某個類別幾乎沒有,如識別欺詐交易)的方法: 

1️⃣擴充數據集:首先想到能否獲得更多數據,尤其是小類(該類樣本數據極少)的數據,更多的數據往往能得到更多的信息。

2️⃣對數據集進行重采樣:對小類的數據樣本進行過采樣來增加小類的數據樣本個數,如SMOTE算法是通過對少數樣本進行插值來獲取新樣本的。比如對於每個少數類樣本a,從 a最鄰近的樣本中選取 樣本b,然后在對 ab 中隨機選擇一點作為新樣本。對大類的數據樣本進行欠采樣來減少大類的數據樣本個數,采樣算法容易實現,效果也不錯,但可能增大模型的偏差(Bias),因為放大或者縮小某些樣本的影響相當於改變了原數據集的分布。對大樣本的隨機欠采樣可以采用Easy Ensemble算法:

從大類樣本中隨機產生和小類樣本一樣的個數N_i,與小樣本組合成2*N_i個樣本輸入1個基分類器(論文中采用的基分類器是adaboost)中訓練

重復操作給第二個基分類器去訓練....

最后結合所有基分類器進行決策。下圖中Hi是第i個基分類器,總共有T個基分類器:

 

 

3️⃣人造數據:給樣本的某個屬性增加噪聲,如圖像的數據增強

4️⃣改變算法:使用代價函數時,可以 增加小類樣本的權值,降低大類樣本的權值(這種方法其實是產生了新的數據分布,即產生了新的數據集),從而使得分類器將重點集中在小類樣本身上。

比如平衡交叉熵函數:

 其中m為正樣本個數,n為負樣本個數,N為樣本總數,m+n=N

 

 focal loss

focal loss相比balanced cross entropy而言,二者都是試圖解決樣本不平衡帶來的模型訓練問題,后者從樣本分布角度對損失函數添加權重因子,前者從樣本分類難易程度出發,使分類不准確的樣本權重在loss中增加了。

  

5️⃣問題轉換:把它看做一分類(One Class Learning)或異常檢測(Novelty Detection)問題。這類方法的重點不在於捕捉類間的差別,而是為其中一類進行建模,經典的工作包括one-shot Learning等

【one-shot Learning】

定義:某個類別下的樣本只有1個或者很少的情況下,模型能夠正確的預測分類

核心思想:比如在人臉識別的情境下,使用Siamese 神經網絡,該網絡能將圖片映射成一個向量,然后通過計算相似度來定義損失函數Triplet Loss,該公式要計算同一類別下的兩張圖片的輸出向量之間的差異以及不同類別下的2張圖片...,通過采用梯度下降來更新參數以實現最小化損失函數,同一類別的圖片之間差異會小,不同類別的圖片之間差異會大,這樣神經網絡就能做識別了。真正在訓練階段,1個類別起碼要有10個樣本。

下圖Triplet Loss中,s1是屬於A類別圖片1的輸出向量,s2是屬於A類別圖片2的輸出向量,s3是屬於B類別圖片3的輸出向量,α是超參數:

loss推導:

 

6️⃣改變評價指標,如用混淆矩陣代替准確率

9、分類器模型評價指標

分類器評價指標主要有:

混淆矩陣
Accuracy
Precision
Recall
F1 score
ROC 曲線
AUC
PR 曲線

【混淆矩陣】

通過混淆矩陣可以觀察到A類別中有多少被分到了B類別,這樣可以有針對性的設計特征等,使得類別更有區分性,進而觀察模型在各個類別上的表現;

對角線是預測對了的數目,其他地方預測錯了,4個加起來是總樣本數

真正(True Positive , TP):正樣本中被模型預測為正,預測對了。
假正(False Positive , FP):負樣本但被模型預測為正,預測錯了。
假負(False Negative , FN):正樣本但被模型預測為負,預測錯了。
真負(True Negative , TN):負樣本被模型預測為負,預測對了。

從中可以計算出:

【准確率(Accuracy)】
准確率是最常用的分類性能指標。適用場景:不同的分類是同等地位的,閾值給定
Accuracy = (TP+TN)/(TP+FN+FP+TN),即正確預測的正反例數 /總數

【精確率(Precision)】

適用於不同類別地位不同的場景,閾值給定
精確率是預測出是正的里面有多少真正是正的。可理解為查准率。關注誤報的比例。100%表示,挑出來的全是對的,越高表示只有十足的把握才去報告。如嫌疑人定罪,嫌疑人是正樣本,基於不錯怪一個好人的原則,對於嫌疑人的定罪我們希望是非常准確的。即時有時候放過了一些罪犯(recall低),但也是值得的。強調識別的准確性
Precision = TP/(TP+FP),即正確預測的正例數 /預測正例總數

【召回率(Recall)】

適用於不同類別地位不同的場景,閾值給定
召回率表現出在實際正樣本中,分類器能預測出多少。與真正率相等,可理解為查全率。關注漏檢的概率。100%表示,一個也沒漏,越高表示只要有可能發生,就預測為發生。對於地震的預測,地震做正樣本,我們希望的是RECALL非常高,也就是說每次地震我們都希望預測出來。這個時候我們可以犧牲PRECISION。情願發出1000次警報,把10次地震都預測正確了,也不要預測100次對了8次漏了兩次。強調識別的覆蓋面。
Recall = TP/(TP+FN),即正確預測的正例數 /實際正例總數

【F1 score】

適用於不同類別地位不同的場景,閾值給定
F1分數(F1-score)是分類問題的一個衡量指標。它是精確率和召回率的調和平均數,最大為1,最小為0。F1-score越大自然說明模型質量更高。F1的核心思想在於,在盡可能地提高精確度(Precision)和召回率(Recall)的同時,也希望兩者之間的差異盡可能的小。

F_{1}=2\cdot \frac{precision\cdot recall}{precision+recall}

【ROC曲線與AUC值】

適用於比較模型性能,閾值未定

定義橫坐標FPR:TP/(TP+FN),即被預測為正的正樣本數 /正樣本實際數。

縱坐標FPR:FP/(FP+TN),即被預測為正的負樣本數 /負樣本實際數。

一個混淆矩陣對應一個點,當改變模型對正負樣本的判別閾值會產生多個混淆矩陣,圖中為多個點,連起來形成ROC曲線,即模型的不同閾值對應roc上的不同點,左下閾值高,右上閾值低,最優的閾值離左上角最近。一條ROC曲線對應一個模型。如果ROC是光滑的,那么基本可以判斷沒有太大的overfitting
ROC曲線下的面積就是AUC值,AUC值越大模型越好,即曲線越靠近左上角模型越好

對於N分類,可以求出宏觀AUC值:計算每個類別的AUC值,取平均

也可以求出微觀AUC值:先轉換成右下的表格(多分類轉二分類),根據右下表格計算

 

AUC計算方式2:

理解為預測為正樣本的概率大於預測為負樣本的概率的概率:P(P正樣本 > P負樣本)

 

 AUC計算方式3:

這次用排序算,下圖M是正樣本個數,分母是M*N

 

 

【pr曲線】

適用於比較模型性能,閾值未定

PR曲線中的P代表的是precision(精准率),R代表的是recall(召回率),其代表的是精准率與召回率的關系,一般情況下,將recall設置為橫坐標,precision設置為縱坐標。

一個閾值對應PR曲線上的一個點。選取不同的閾值,就得到很多點,連起來就是PR曲線。

不同模型對應不同曲線

   

         圖片來源於周志華老師的<機器學習>一書.

當PR曲線越靠近右上方時,表明模型性能越好,與ROC曲線類似,在對不同模型進行比較時,若一個模型的PR曲線被另一個模型的PR曲線完全包住則說明后者的性能優於前者.如上圖中橘色線代表的模型要優於藍色線代表的模型,若模型的PR曲線發生了交叉,則無法直接判斷哪個模型更好.在周志華老師的機器學習上中提到了可以用平衡點.它是查准率=查全率時的取值,如上圖黑色線代表的模型的平衡點要大於橘色線模型代表的平衡點,表明前者優於后者

 

 9、回歸問題的評價指標

【均方誤差(MSE)】

均方誤差是指:觀測值與真值偏差的平方和與觀測次數的比值,MSE相當於模型中的損失函數,模型之間的對比也可以用它來比較。MSE可以評價模型的預測精度,MSE的值越小,說明預測模型對於目標的擬合程度越精確。
在這里插入圖片描述

【均方根誤差(RMSE)】
RMSE其實是MSE開根號,兩者實質一樣,但RMSE能更好的描述數據。因為RMSE跟數據是一個級別的,更容易感知數據。
在這里插入圖片描述

【平均絕對誤差(MAE)】

在這里插入圖片描述

【平均絕對百分比誤差(MAPE)】

與RMSE相比,更加魯棒,因為MAPE對每個點的誤差進行了歸一化。但是當實際值為零時,MAPE會采用未定義的值,MAPE的值可能超過100%。MAPE將偏向於預測不足而不是過度預測的模型。

在這里插入圖片描述

【擬合優度/R-Squared】

一般用在線性模型中,表示回歸直線對觀測值的擬合程度。R2 越接近於1,說明回歸直線對觀測值的擬合程度越好;相反,R2值越小,說明回歸直線對觀測值的擬合程度越差。受樣本量影響,不同數據集的模型結果比較會有一定的誤差,不斷添加特征雖然能讓模型的效果提升,而這種提升是虛假的。

在這里插入圖片描述

【校正決定系數(Adjusted R-square)】

在這里插入圖片描述

這是對R2的修正,能對添加的特征給出懲罰,也就是說隨意添加一個特征不一定能讓模型擬合度上升。其中,n為樣本數量,p為特征數量。取值范圍還是負無窮到1,大多是 0~1,且越大越好

10、標准方程法:要求損失函數最小的參數,讓損失函數的偏導數=0來算參數

11、魯棒性:較高精度和有效性,離群點和噪聲對算法影響不大

 

8.overfitting過擬合怎么解決?

1️⃣、交叉驗證

數據集一般划分為:訓練集,驗證集(選擇超參數),測試集(最后的評估作用)。如果數據樣本量小於一萬條,我們就會采用交叉驗證來訓練優化選擇模型。

 

交叉驗證分為:

簡單交叉驗證。首先,我們測試集分為兩部分(比如: 70%的訓練集,30%的驗證集),然后用訓練集來訓練模型,在驗證集上驗證模型及參數。接着,我們再把樣本打亂,重新選擇訓練集和驗證集,繼續訓練數據和檢驗模型。

 

K折交叉驗證S-Folder Cross Validation)。

將訓練集划分為K份(折)(先划分為訓練接和測試集,然后對測試集實施交叉驗證),訓練完后,先用第一折的驗證集評估模型分數,再用第二折的驗證集評估分數...,最后取平均分數為該模型的評估分數,為了能實現更好的隨機性,第一折驗證完后,所有數據可以重新打亂,再划分折,然后再次評估分數....最后取平均

 

2️⃣、用更多數據進行訓練

用更多相關數據訓練模型有助於更好地識別信號,避免將噪聲作為信號。數據增強是增加訓練數據的一種方式,可以通過翻轉(flipping)、平移(translation)、旋轉(rotation)、縮放(scaling)、更改亮度(changing brightness)等方法來實現。

 

3️⃣、移除特征

移除特征能夠降低模型的復雜性,並且在一定程度上避免噪聲,使模型更高效。為了降低復雜度,我們可以移除層或減少神經元數量,使網絡變小。

4️⃣、早停

對模型進行迭代訓練時,我們可以度量每次迭代的性能。當驗證損失開始增加時,我們應該停止訓練模型,這樣就能阻止過擬合。

  

5️⃣、正則化

損失函數后面的額外項,常用的額外項一般有兩種,稱作L1正則化和L2正則化。 前面的系數是懲罰系數,越大則懲罰力度越強,泛化能力越強

對於線性回歸模型,使用L1正則化的模型建叫做Lasso回歸,使用L2正則化的模型叫做Ridge回歸(嶺回歸)。

L1 懲罰的目的是優化權重絕對值的總和。它生成一個簡單且可解釋的模型,且對於異常值是魯棒的。

為了使得最終的損失函數最小,L1的結果就是產生稀疏權值矩陣,這樣很多特征xi前的權值就是0了,這些特征就不用考慮了,即可以用於特征選擇,L1假設模型參數服從拉普拉斯分布

 

 

L2 懲罰權重值的平方和。該模型能夠學習復雜的數據模式,但對於異常值不具備魯棒性。結果是所有參數都較小,但是不具備稀疏性。貝葉斯角度理解,L2正則化其實是加入了數據的先驗知識,認為權重參數服從高斯先驗分布=正態分布,所以在損失函數中加入這樣的先驗知識,讓模型表現更好。

在線性回歸模型中,標准方程法求最小化損失函數時的參數W,加入正則項還能實現可逆:

 

 

 

詳細:https://mp.weixin.qq.com/s/uB9TuYZ-OboDXPvGP02ISg

https://blog.csdn.net/m0_38045485/article/details/82147817?utm_source=blogxgwz6

 

6️⃣、Dropout

每次神經網絡訓練一次,就隨機禁用部分神經網絡單元。它可以在任何隱藏層或輸入層上實現,但不能在輸出層上實現。該方法可以免除對其他神經元的依賴,進而使網絡學習獨立的相關性。測試階段就不殺死了,用原網絡。

 

⑦、batch normalizatin

對於神經網絡的每層,當前一層神經元輸出值經過WX+B后,就進行標准化,隨后再經過激活函數,后面層也是...

對於標准化,在訓練階段,使用batch自己的均值(比如第1個樣本的第1個特征,加上第2個樣本的第1個特征,……,再加上第 N 個樣本的第1個特征,求平均值,得到特征1的均值)和標准差來歸一化batch(對所有特征),以及scale和shift操作:

 

 這兩個參數是神經網絡需要學習的量,同時對每個特征分別維護它的全局滑動均值和滑動方差:

moving_mean = moving_mean * momentum + mean(batch) * (1-momentum)

moving_var = moving_var * momentum + var(batch) * (1-momentum)

預測階段,使用訓練階段的滑動均值和滑動方差來歸一化batch的各個特征

圖示:

 

 

 作用:對於一個batch而言,不適用歸一化之前,單個神經元在處理每個樣本時,傳過來的值比較發散,分布不同,經過激活函數映射后,如tanh,多數樣本都被映射到了值域邊界附近,不利於信息傳播,容易發生梯度消失和爆炸,反之,使用了BN后,能夠保證數據分布相同且集中,有利於數據傳遞(這種分布指的是各個樣本在同一個特征內分布一致)。增加的scale和shift操作,這兩個參數是通過訓練學習到的,意思是通過scale和shift把這個值從標准正態分布左移或者右移一點並長胖一點或者變瘦一點,等價於非線性函數的值從正中心周圍的線性區往非線性區動了動,訓練他倆的目的是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網絡收斂速度太慢。

 

詳細:https://www.cnblogs.com/guoyaohua/p/8724433.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM