欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

常見損失函數(shù)python的簡單介紹

常見損失函數(shù)用法

損失函數(shù)(loss function)又叫做代價函數(shù)(cost function),是用來評估模型的預(yù)測值與真實值不一致的程度,也是神經(jīng)網(wǎng)絡(luò)中優(yōu)化的目標(biāo)函數(shù),神經(jīng)網(wǎng)絡(luò)訓(xùn)練或者優(yōu)化的過程就是最小化損失函數(shù)的過程,損失函數(shù)越小,說明模型的預(yù)測值就越接近真是值,模型的健壯性也就越好。

成都創(chuàng)新互聯(lián)公司作為成都網(wǎng)站建設(shè)公司,專注網(wǎng)站建設(shè)、網(wǎng)站設(shè)計,有關(guān)企業(yè)網(wǎng)站制作方案、改版、費用等問題,行業(yè)涉及辦公空間設(shè)計等多個領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。

常見的損失函數(shù)有以下幾種:

0-1損失函數(shù)是最為簡單的一種損失函數(shù),多適用于分類問題中,如果預(yù)測值與目標(biāo)值不相等,說明預(yù)測錯誤,輸出值為1;如果預(yù)測值與目標(biāo)值相同,說明預(yù)測正確,輸出為0,言外之意沒有損失。其數(shù)學(xué)公式可表示為:

由于0-1損失函數(shù)過于理想化、嚴(yán)格化,且數(shù)學(xué)性質(zhì)不是很好,難以優(yōu)化,所以在實際問題中,我們經(jīng)常會用以下的損失函數(shù)進(jìn)行代替。

感知損失函數(shù)是對0-1損失函數(shù)的改進(jìn),它并不會像0-1損失函數(shù)那樣嚴(yán)格,哪怕預(yù)測值為0.99,真實值為1,都會認(rèn)為是錯誤的;而是給一個誤差區(qū)間,只要在誤差區(qū)間內(nèi),就認(rèn)為是正確的。其數(shù)學(xué)公式可表示為:

顧名思義,平方損失函數(shù)是指預(yù)測值與真實值差值的平方。損失越大,說明預(yù)測值與真實值的差值越大。平方損失函數(shù)多用于線性回歸任務(wù)中,其數(shù)學(xué)公式為:

接下來,我們延伸到樣本個數(shù)為N的情況,此時的平方損失函數(shù)為:

Hinge損失函數(shù)通常適用于二分類的場景中,可以用來解決間隔最大化的問題,常應(yīng)用于著名的SVM算法中。其數(shù)學(xué)公式為:

其中在上式中,t是目標(biāo)值{-1,+1},y為預(yù)測值的輸出,取值范圍在(-1,1)之間。

對數(shù)損失函數(shù)也是常見的一種損失函數(shù),常用于邏輯回歸問題中,其標(biāo)準(zhǔn)形式為:

上式中,y為已知分類的類別,x為樣本值,我們需要讓概率p(y|x)達(dá)到最大值,也就是說我們要求一個參數(shù)值,使得輸出的目前這組數(shù)據(jù)的概率值最大。因為概率P(Y|X)的取值范圍為[0,1],log(x)函數(shù)在區(qū)間[0,1]的取值為負(fù)數(shù),所以為了保證損失值為正數(shù)要在log函數(shù)前加負(fù)號。

交叉熵?fù)p失函數(shù)本質(zhì)上也是一種對數(shù)損失函數(shù),常用于多分類問題中。其數(shù)學(xué)公式為:

注意:公式中的x表示樣本,y代表預(yù)測的輸出,a為實際輸出,n表示樣本總數(shù)量。交叉熵?fù)p失函數(shù)常用于當(dāng)sigmoid函數(shù)作為激活函數(shù)的情景,因為它可以完美解決平方損失函數(shù)權(quán)重更新過慢的問題。

原文參見

用python實現(xiàn)紅酒數(shù)據(jù)集的ID3,C4.5和CART算法?

ID3算法介紹

ID3算法全稱為迭代二叉樹3代算法(Iterative Dichotomiser 3)

該算法要先進(jìn)行特征選擇,再生成決策樹,其中特征選擇是基于“信息增益”最大的原則進(jìn)行的。

但由于決策樹完全基于訓(xùn)練集生成的,有可能對訓(xùn)練集過于“依賴”,即產(chǎn)生過擬合現(xiàn)象。因此在生成決策樹后,需要對決策樹進(jìn)行剪枝。剪枝有兩種形式,分別為前剪枝(Pre-Pruning)和后剪枝(Post-Pruning),一般采用后剪枝。

信息熵、條件熵和信息增益

信息熵:來自于香農(nóng)定理,表示信息集合所含信息的平均不確定性。信息熵越大,表示不確定性越大,所含的信息量也就越大。

設(shè)x 1 , x 2 , x 3 , . . . x n {x_1, x_2, x_3, ...x_n}x

1

,x

2

,x

3

,...x

n

為信息集合X的n個取值,則x i x_ix

i

的概率:

P ( X = i ) = p i , i = 1 , 2 , 3 , . . . , n P(X=i) = p_i, i=1,2,3,...,n

P(X=i)=p

i

,i=1,2,3,...,n

信息集合X的信息熵為:

H ( X ) = ? ∑ i = 1 n p i log ? p i H(X) =- \sum_{i=1}^{n}{p_i}\log{p_i}

H(X)=?

i=1

n

p

i

logp

i

條件熵:指已知某個隨機變量的情況下,信息集合的信息熵。

設(shè)信息集合X中有y 1 , y 2 , y 3 , . . . y m {y_1, y_2, y_3, ...y_m}y

1

,y

2

,y

3

,...y

m

組成的隨機變量集合Y,則隨機變量(X,Y)的聯(lián)合概率分布為

P ( x = i , y = j ) = p i j P(x=i,y=j) = p_{ij}

P(x=i,y=j)=p

ij

條件熵:

H ( X ∣ Y ) = ∑ j = 1 m p ( y j ) H ( X ∣ y j ) H(X|Y) = \sum_{j=1}^m{p(y_j)H(X|y_j)}

H(X∣Y)=

j=1

m

p(y

j

)H(X∣y

j

)

H ( X ∣ y j ) = ? ∑ j = 1 m p ( y j ) ∑ i = 1 n p ( x i ∣ y j ) log ? p ( x i ∣ y j ) H(X|y_j) = - \sum_{j=1}^m{p(y_j)}\sum_{i=1}^n{p(x_i|y_j)}\log{p(x_i|y_j)}

H(X∣y

j

)=?

j=1

m

p(y

j

)

i=1

n

p(x

i

∣y

j

)logp(x

i

∣y

j

)

和貝葉斯公式:

p ( x i y j ) = p ( x i ∣ y j ) p ( y j ) p(x_iy_j) = p(x_i|y_j)p(y_j)

p(x

i

y

j

)=p(x

i

∣y

j

)p(y

j

)

可以化簡條件熵的計算公式為:

H ( X ∣ Y ) = ∑ j = 1 m ∑ i = 1 n p ( x i , y j ) log ? p ( x i ) p ( x i , y j ) H(X|Y) = \sum_{j=1}^m \sum_{i=1}^n{p(x_i, y_j)\log\frac{p(x_i)}{p(x_i, y_j)}}

H(X∣Y)=

j=1

m

i=1

n

p(x

i

,y

j

)log

p(x

i

,y

j

)

p(x

i

)

信息增益:信息熵-條件熵,用于衡量在知道已知隨機變量后,信息不確定性減小越大。

d ( X , Y ) = H ( X ) ? H ( X ∣ Y ) d(X,Y) = H(X) - H(X|Y)

d(X,Y)=H(X)?H(X∣Y)

python代碼實現(xiàn)

import numpy as np

import math

def calShannonEnt(dataSet):

""" 計算信息熵 """

labelCountDict = {}

for d in dataSet:

label = d[-1]

if label not in labelCountDict.keys():

labelCountDict[label] = 1

else:

labelCountDict[label] += 1

entropy = 0.0

for l, c in labelCountDict.items():

p = 1.0 * c / len(dataSet)

entropy -= p * math.log(p, 2)

return entropy

def filterSubDataSet(dataSet, colIndex, value):

"""返回colIndex特征列l(wèi)abel等于value,并且過濾掉改特征列的數(shù)據(jù)集"""

subDataSetList = []

for r in dataSet:

if r[colIndex] == value:

newR = r[:colIndex]

newR = np.append(newR, (r[colIndex + 1:]))

subDataSetList.append(newR)

return np.array(subDataSetList)

def chooseFeature(dataSet):

""" 通過計算信息增益選擇最合適的特征"""

featureNum = dataSet.shape[1] - 1

entropy = calShannonEnt(dataSet)

bestInfoGain = 0.0

bestFeatureIndex = -1

for i in range(featureNum):

uniqueValues = np.unique(dataSet[:, i])

condition_entropy = 0.0

for v in uniqueValues: #計算條件熵

subDataSet = filterSubDataSet(dataSet, i, v)

p = 1.0 * len(subDataSet) / len(dataSet)

condition_entropy += p * calShannonEnt(subDataSet)

infoGain = entropy - condition_entropy #計算信息增益

if infoGain = bestInfoGain: #選擇最大信息增益

bestInfoGain = infoGain

bestFeatureIndex = i

return bestFeatureIndex

def creatDecisionTree(dataSet, featNames):

""" 通過訓(xùn)練集生成決策樹 """

featureName = featNames[:] # 拷貝featNames,此處不能直接用賦值操作,否則新變量會指向舊變量的地址

classList = list(dataSet[:, -1])

if len(set(classList)) == 1: # 只有一個類別

return classList[0]

if dataSet.shape[1] == 1: #當(dāng)所有特征屬性都利用完仍然無法判斷樣本屬于哪一類,此時歸為該數(shù)據(jù)集中數(shù)量最多的那一類

return max(set(classList), key=classList.count)

bestFeatureIndex = chooseFeature(dataSet) #選擇特征

bestFeatureName = featNames[bestFeatureIndex]

del featureName[bestFeatureIndex] #移除已選特征列

decisionTree = {bestFeatureName: {}}

featureValueUnique = sorted(set(dataSet[:, bestFeatureIndex])) #已選特征列所包含的類別, 通過遞歸生成決策樹

for v in featureValueUnique:

copyFeatureName = featureName[:]

subDataSet = filterSubDataSet(dataSet, bestFeatureIndex, v)

decisionTree[bestFeatureName][v] = creatDecisionTree(subDataSet, copyFeatureName)

return decisionTree

def classify(decisionTree, featnames, featList):

""" 使用訓(xùn)練所得的決策樹進(jìn)行分類 """

classLabel = None

root = decisionTree.keys()[0]

firstGenDict = decisionTree[root]

featIndex = featnames.index(root)

for k in firstGenDict.keys():

if featList[featIndex] == k:

if isinstance(firstGenDict[k], dict): #若子節(jié)點仍是樹,則遞歸查找

classLabel = classify(firstGenDict[k], featnames, featList)

else:

classLabel = firstGenDict[k]

return classLabel

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

下面用鳶尾花數(shù)據(jù)集對該算法進(jìn)行測試。由于ID3算法只能用于標(biāo)稱型數(shù)據(jù),因此用在對連續(xù)型的數(shù)值數(shù)據(jù)上時,還需要對數(shù)據(jù)進(jìn)行離散化,離散化的方法稍后說明,此處為了簡化,先使用每一種特征所有連續(xù)性數(shù)值的中值作為分界點,小于中值的標(biāo)記為1,大于中值的標(biāo)記為0。訓(xùn)練1000次,統(tǒng)計準(zhǔn)確率均值。

from sklearn import datasets

from sklearn.model_selection import train_test_split

iris = datasets.load_iris()

data = np.c_[iris.data, iris.target]

scoreL = []

for i in range(1000): #對該過程進(jìn)行10000次

trainData, testData = train_test_split(data) #區(qū)分測試集和訓(xùn)練集

featNames = iris.feature_names[:]

for i in range(trainData.shape[1] - 1): #對訓(xùn)練集每個特征,以中值為分界點進(jìn)行離散化

splitPoint = np.mean(trainData[:, i])

featNames[i] = featNames[i]+'='+'{:.3f}'.format(splitPoint)

trainData[:, i] = [1 if x = splitPoint else 0 for x in trainData[:, i]]

testData[:, i] = [1 if x = splitPoint else 0 for x in testData[:, i]]

decisionTree = creatDecisionTree(trainData, featNames)

classifyLable = [classify(decisionTree, featNames, td) for td in testData]

scoreL.append(1.0 * sum(classifyLable == testData[:, -1]) / len(classifyLable))

print 'score: ', np.mean(scoreL)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

輸出結(jié)果為:score: 0.7335,即準(zhǔn)確率有73%。每次訓(xùn)練和預(yù)測的準(zhǔn)確率分布如下:

數(shù)據(jù)離散化

然而,在上例中對特征值離散化的劃分點實際上過于“野蠻”,此處介紹一種通過信息增益最大的標(biāo)準(zhǔn)來對數(shù)據(jù)進(jìn)行離散化。原理很簡單,當(dāng)信息增益最大時,說明用該點劃分能最大程度降低數(shù)據(jù)集的不確定性。

具體步驟如下:

對每個特征所包含的數(shù)值型特征值排序

對相鄰兩個特征值取均值,這些均值就是待選的劃分點

用每一個待選點把該特征的特征值劃分成兩類,小于該特征點置為1, 大于該特征點置為0,計算此時的條件熵,并計算出信息增益

選擇信息使信息增益最大的劃分點進(jìn)行特征離散化

實現(xiàn)代碼如下:

def filterRawData(dataSet, colIndex, value, tag):

""" 用于把每個特征的連續(xù)值按照區(qū)分點分成兩類,加入tag參數(shù),可用于標(biāo)記篩選的是哪一部分?jǐn)?shù)據(jù)"""

filterDataList = []

for r in dataSet:

if (tag and r[colIndex] = value) or ((not tag) and r[colIndex] value):

newR = r[:colIndex]

newR = np.append(newR, (r[colIndex + 1:]))

filterDataList.append(newR)

return np.array(filterDataList)

def dataDiscretization(dataSet, featName):

""" 對數(shù)據(jù)每個特征的數(shù)值型特征值進(jìn)行離散化 """

featureNum = dataSet.shape[1] - 1

entropy = calShannonEnt(dataSet)

for featIndex in range(featureNum): #對于每一個特征

uniqueValues = sorted(np.unique(dataSet[:, featIndex]))

meanPoint = []

for i in range(len(uniqueValues) - 1): # 求出相鄰兩個值的平均值

meanPoint.append(float(uniqueValues[i+1] + uniqueValues[i]) / 2.0)

bestInfoGain = 0.0

bestMeanPoint = -1

for mp in meanPoint: #對于每個劃分點

subEntropy = 0.0 #計算該劃分點的信息熵

for tag in range(2): #分別劃分為兩類

subDataSet = filterRawData(dataSet, featIndex, mp, tag)

p = 1.0 * len(subDataSet) / len(dataSet)

subEntropy += p * calShannonEnt(subDataSet)

## 計算信息增益

infoGain = entropy - subEntropy

## 選擇最大信息增益

if infoGain = bestInfoGain:

bestInfoGain = infoGain

bestMeanPoint = mp

featName[featIndex] = featName[featIndex] + "=" + "{:.3f}".format(bestMeanPoint)

dataSet[:, featIndex] = [1 if x = bestMeanPoint else 0 for x in dataSet[:, featIndex]]

return dataSet, featName

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

重新對數(shù)據(jù)進(jìn)行離散化,并重復(fù)該步驟1000次,同時用sklearn中的DecisionTreeClassifier對相同數(shù)據(jù)進(jìn)行分類,分別統(tǒng)計平均準(zhǔn)確率。運行代碼如下:

from sklearn.tree import DecisionTreeClassifier

import matplotlib.pyplot as plt

scoreL = []

scoreL_sk = []

for i in range(1000): #對該過程進(jìn)行1000次

featNames = iris.feature_names[:]

trainData, testData = train_test_split(data) #區(qū)分測試集和訓(xùn)練集

trainData_tmp = copy.copy(trainData)

testData_tmp = copy.copy(testData)

discritizationData, discritizationFeatName= dataDiscretization(trainData, featNames) #根據(jù)信息增益離散化

for i in range(testData.shape[1]-1): #根據(jù)測試集的區(qū)分點離散化訓(xùn)練集

splitPoint = float(discritizationFeatName[i].split('=')[-1])

testData[:, i] = [1 if x=splitPoint else 0 for x in testData[:, i]]

decisionTree = creatDecisionTree(trainData, featNames)

classifyLable = [classify(decisionTree, featNames, td) for td in testData]

scoreL.append(1.0 * sum(classifyLable == testData[:, -1]) / len(classifyLable))

clf = DecisionTreeClassifier('entropy')

clf.fit(trainData[:, :-1], trainData[:, -1])

clf.predict(testData[:, :-1])

scoreL_sk.append(clf.score(testData[:, :-1], testData[:, -1]))

print 'score: ', np.mean(scoreL)

print 'score-sk: ', np.mean(scoreL_sk)

fig = plt.figure(figsize=(10, 4))

plt.subplot(1,2,1)

pd.Series(scoreL).hist(grid=False, bins=10)

plt.subplot(1,2,2)

pd.Series(scoreL_sk).hist(grid=False, bins=10)

plt.show()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

兩者準(zhǔn)確率分別為:

score: 0.7037894736842105

score-sk: 0.7044736842105263

準(zhǔn)確率分布如下:

兩者的結(jié)果非常一樣。

(但是。。為什么根據(jù)信息熵離散化得到的準(zhǔn)確率比直接用均值離散化的準(zhǔn)確率還要低????哇的哭出聲。。)

最后一次決策樹圖形如下:

決策樹剪枝

由于決策樹是完全依照訓(xùn)練集生成的,有可能會有過擬合現(xiàn)象,因此一般會對生成的決策樹進(jìn)行剪枝。常用的是通過決策樹損失函數(shù)剪枝,決策樹損失函數(shù)表示為:

C a ( T ) = ∑ t = 1 T N t H t ( T ) + α ∣ T ∣ C_a(T) = \sum_{t=1}^TN_tH_t(T) +\alpha|T|

C

a

(T)=

t=1

T

N

t

H

t

(T)+α∣T∣

其中,H t ( T ) H_t(T)H

t

(T)表示葉子節(jié)點t的熵值,T表示決策樹的深度。前項∑ t = 1 T N t H t ( T ) \sum_{t=1}^TN_tH_t(T)∑

t=1

T

N

t

H

t

(T)是決策樹的經(jīng)驗損失函數(shù)當(dāng)隨著T的增加,該節(jié)點被不停的劃分的時候,熵值可以達(dá)到最小,然而T的增加會使后項的值增大。決策樹損失函數(shù)要做的就是在兩者之間進(jìn)行平衡,使得該值最小。

對于決策樹損失函數(shù)的理解,如何理解決策樹的損失函數(shù)? - 陶輕松的回答 - 知乎這個回答寫得挺好,可以按照答主的思路理解一下

C4.5算法

ID3算法通過信息增益來進(jìn)行特征選擇會有一個比較明顯的缺點:即在選擇的過程中該算法會優(yōu)先選擇類別較多的屬性(這些屬性的不確定性小,條件熵小,因此信息增益會大),另外,ID3算法無法解決當(dāng)每個特征屬性中每個分類都只有一個樣本的情況(此時每個屬性的條件熵都為0)。

C4.5算法ID3算法的改進(jìn),它不是依據(jù)信息增益進(jìn)行特征選擇,而是依據(jù)信息增益率,它添加了特征分裂信息作為懲罰項。定義分裂信息:

S p l i t I n f o ( X , Y ) = ? ∑ i n ∣ X i ∣ ∣ X ∣ log ? ∣ X i ∣ ∣ X ∣ SplitInfo(X, Y) =-\sum_i^n\frac{|X_i|}{|X|}\log\frac{|X_i|}{|X|}

SplitInfo(X,Y)=?

i

n

∣X∣

∣X

i

log

∣X∣

∣X

i

則信息增益率為:

G a i n R a t i o ( X , Y ) = d ( X , Y ) S p l i t I n f o ( X , Y ) GainRatio(X,Y)=\frac{d(X,Y)}{SplitInfo(X, Y)}

GainRatio(X,Y)=

SplitInfo(X,Y)

d(X,Y)

關(guān)于ID3和C4.5算法

在學(xué)習(xí)分類回歸決策樹算法時,看了不少的資料和博客。關(guān)于這兩個算法,ID3算法是最早的分類算法,這個算法剛出生的時候其實帶有很多缺陷:

無法處理連續(xù)性特征數(shù)據(jù)

特征選取會傾向于分類較多的特征

沒有解決過擬合的問題

沒有解決缺失值的問題

即該算法出生時是沒有帶有連續(xù)特征離散化、剪枝等步驟的。C4.5作為ID3的改進(jìn)版本彌補列ID3算法不少的缺陷:

通過信息最大增益的標(biāo)準(zhǔn)離散化連續(xù)的特征數(shù)據(jù)

在選擇特征是標(biāo)準(zhǔn)從“最大信息增益”改為“最大信息增益率”

通過加入正則項系數(shù)對決策樹進(jìn)行剪枝

對缺失值的處理體現(xiàn)在兩個方面:特征選擇和生成決策樹。初始條件下對每個樣本的權(quán)重置為1。

特征選擇:在選取最優(yōu)特征時,計算出每個特征的信息增益后,需要乘以一個**“非缺失值樣本權(quán)重占總樣本權(quán)重的比例”**作為系數(shù)來對比每個特征信息增益的大小

生成決策樹:在生成決策樹時,對于缺失的樣本我們按照一定比例把它歸屬到每個特征值中,比例為該特征每一個特征值占非缺失數(shù)據(jù)的比重

關(guān)于C4.5和CART回歸樹

作為ID3的改進(jìn)版本,C4.5克服了許多缺陷,但是它自身還是存在不少問題:

C4.5的熵運算中涉及了對數(shù)運算,在數(shù)據(jù)量大的時候效率非常低。

C4.5的剪枝過于簡單

C4.5只能用于分類運算不能用于回歸

當(dāng)特征有多個特征值是C4.5生成多叉樹會使樹的深度加深

————————————————

版權(quán)聲明:本文為CSDN博主「Sarah Huang」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:

機器學(xué)習(xí)中的損失函數(shù)

機器學(xué)習(xí)中的損失函數(shù)

損失函數(shù)(loss function)是用來估量你模型的預(yù)測值f(x)與真實值Y的不一致程度,它是一個非負(fù)實值函數(shù),通常使用L(Y, f(x))來表示,損失函數(shù)越小,模型的魯棒性就越好。損失函數(shù)是經(jīng)驗風(fēng)險函數(shù)的核心部分,也是結(jié)構(gòu)風(fēng)險函數(shù)重要組成部分。模型的結(jié)構(gòu)風(fēng)險函數(shù)包括了經(jīng)驗風(fēng)險項和正則項,通??梢员硎境扇缦率阶樱?/p>

其中,前面的均值函數(shù)表示的是經(jīng)驗風(fēng)險函數(shù),L代表的是損失函數(shù),后面的是正則化項(regularizer)或者叫懲罰項(penalty term),它可以是L1,也可以是L2,或者其他的正則函數(shù)。整個式子表示的意思是找到使目標(biāo)函數(shù)最小時的值。下面主要列出幾種常見的損失函數(shù)。

一、log對數(shù)損失函數(shù)(邏輯回歸)

有些人可能覺得邏輯回歸的損失函數(shù)就是平方損失,其實并不是。平方損失函數(shù)可以通過線性回歸在假設(shè)樣本是高斯分布的條件下推導(dǎo)得到,而邏輯回歸得到的并不是平方損失。在邏輯回歸的推導(dǎo)中,它假設(shè)樣本服從伯努利分布(0-1分布),然后求得滿足該分布的似然函數(shù),接著取對數(shù)求極值等等。而邏輯回歸并沒有求似然函數(shù)的極值,而是把極大化當(dāng)做是一種思想,進(jìn)而推導(dǎo)出它的經(jīng)驗風(fēng)險函數(shù)為:最小化負(fù)的似然函數(shù)(即max F(y, f(x)) —- min -F(y, f(x)))。從損失函數(shù)的視角來看,它就成了log損失函數(shù)了。

log損失函數(shù)的標(biāo)準(zhǔn)形式:

L(Y,P(Y|X))=?logP(Y|X)L(Y,P(Y|X))=?log?P(Y|X)剛剛說到,取對數(shù)是為了方便計算極大似然估計,因為在MLE中,直接求導(dǎo)比較困難,所以通常都是先取對數(shù)再求導(dǎo)找極值點。損失函數(shù)L(Y, P(Y|X))表達(dá)的是樣本X在分類Y的情況下,使概率P(Y|X)達(dá)到最大值(換言之,就是利用已知的樣本分布,找到最有可能(即最大概率)導(dǎo)致這種分布的參數(shù)值;或者說什么樣的參數(shù)才能使我們觀測到目前這組數(shù)據(jù)的概率最大)。因為log函數(shù)是單調(diào)遞增的,所以logP(Y|X)也會達(dá)到最大值,因此在前面加上負(fù)號之后,最大化P(Y|X)就等價于最小化L了。

邏輯回歸的P(Y=y|x)表達(dá)式如下:P(Y=y|x)=11+exp(?yf(x))P(Y=y|x)=11+exp(?yf(x))

將它帶入到上式,通過推導(dǎo)可以得到logistic的損失函數(shù)表達(dá)式,如下:

L(y,P(Y=y|x))=log(1+exp(?yf(x)))L(y,P(Y=y|x))=log?(1+exp(?yf(x)))

邏輯回歸最后得到的目標(biāo)式子如下:

如果是二分類的話,則m值等于2,如果是多分類,m就是相應(yīng)的類別總個數(shù)。這里需要解釋一下:之所以有人認(rèn)為邏輯回歸是平方損失,是因為在使用梯度下降來求最優(yōu)解的時候,它的迭代式子與平方損失求導(dǎo)后的式子非常相似,從而給人一種直觀上的錯覺。

這里有個PDF可以參考一下:Lecture 6: logistic regression.pdf.

二、平方損失函數(shù)(最小二乘法, Ordinary Least Squares )

最小二乘法是線性回歸的一種,OLS將問題轉(zhuǎn)化成了一個凸優(yōu)化問題。在線性回歸中,它假設(shè)樣本和噪聲都服從高斯分布(為什么假設(shè)成高斯分布呢?其實這里隱藏了一個小知識點,就是中心極限定理,可以參考【central limit theorem】),最后通過極大似然估計(MLE)可以推導(dǎo)出最小二乘式子。最小二乘的基本原則是:最優(yōu)擬合直線應(yīng)該是使各點到回歸直線的距離和最小的直線,即平方和最小。換言之,OLS是基于距離的,而這個距離就是我們用的最多的歐幾里得距離。為什么它會選擇使用歐式距離作為誤差度量呢(即Mean squared error, MSE),主要有以下幾個原因:

簡單,計算方便;

歐氏距離是一種很好的相似性度量標(biāo)準(zhǔn);

在不同的表示域變換后特征性質(zhì)不變。

平方損失(Square loss)的標(biāo)準(zhǔn)形式如下:

(Y,f(X))=(Y?f(X))2L(Y,f(X))=(Y?f(X))2

當(dāng)樣本個數(shù)為n時,此時的損失函數(shù)變?yōu)椋?/p>

Y-f(X)表示的是殘差,整個式子表示的是殘差的平方和,而我們的目的就是最小化這個目標(biāo)函數(shù)值(注:該式子未加入正則項),也就是最小化殘差的平方和(residual sum of squares,RSS)。

而在實際應(yīng)用中,通常會使用均方差(MSE)作為一項衡量指標(biāo),公式如下:

MSE=1n∑i=1n(Yi~?Yi)2MSE=1n∑i=1n(Yi~?Yi)2

上面提到了線性回歸,這里額外補充一句,我們通常說的線性有兩種情況,一種是因變量y是自變量x的線性函數(shù),一種是因變量y是參數(shù)的線性函數(shù)。在機器學(xué)習(xí)中,通常指的都是后一種情況。

三、指數(shù)損失函數(shù)(Adaboost)

學(xué)過Adaboost算法的人都知道,它是前向分步加法算法的特例,是一個加和模型,損失函數(shù)就是指數(shù)函數(shù)。在Adaboost中,經(jīng)過m此迭代之后,可以得到:

Adaboost每次迭代時的目的是為了找到最小化下列式子時的參數(shù) 和G:

而指數(shù)損失函數(shù)(exp-loss)的標(biāo)準(zhǔn)形式如下

可以看出,Adaboost的目標(biāo)式子就是指數(shù)損失,在給定n個樣本的情況下,Adaboost的損失函數(shù)為:

關(guān)于Adaboost的推導(dǎo),可以參考Wikipedia:AdaBoost或者《統(tǒng)計學(xué)習(xí)方法》P145.

四、Hinge損失函數(shù)(SVM)

在機器學(xué)習(xí)算法中,hinge損失函數(shù)和SVM是息息相關(guān)的。在線性支持向量機中,最優(yōu)化問題可以等價于下列式子:

下面來對式子做個變形,令:

于是,原式就變成了:

如若取,式子就可以表示成:

可以看出,該式子與下式非常相似:

前半部分中的就是hinge損失函數(shù),而后面相當(dāng)于L2正則項。

Hinge 損失函數(shù)的標(biāo)準(zhǔn)形式

可以看出,當(dāng)|y|=1時,L(y)=0。

更多內(nèi)容,參考Hinge-loss。

補充一下:在libsvm中一共有4中核函數(shù)可以選擇,對應(yīng)的是-t參數(shù)分別是:

0-線性核;

1-多項式核;

2-RBF核;

3-sigmoid核。

五、其它損失函數(shù)

除了以上這幾種損失函數(shù),常用的還有:

0-1損失函數(shù)

絕對值損失函數(shù)

下面來看看幾種損失函數(shù)的可視化圖像,對著圖看看橫坐標(biāo),看看縱坐標(biāo),再看看每條線都表示什么損失函數(shù),多看幾次好好消化消化。

OK,暫時先寫到這里,休息下。最后,需要記住的是:參數(shù)越多,模型越復(fù)雜,而越復(fù)雜的模型越容易過擬合。過擬合就是說模型在訓(xùn)練數(shù)據(jù)上的效果遠(yuǎn)遠(yuǎn)好于在測試集上的性能。此時可以考慮正則化,通過設(shè)置正則項前面的hyper parameter,來權(quán)衡損失函數(shù)和正則項,減小參數(shù)規(guī)模,達(dá)到模型簡化的目的,從而使模型具有更好的泛化能力。

交叉熵?fù)p失函數(shù)是什么?

平滑函數(shù)。

交叉熵?fù)p失函數(shù),也稱為對數(shù)損失或者logistic損失。當(dāng)模型產(chǎn)生了預(yù)測值之后,將對類別的預(yù)測概率與真實值(由0或1組成)進(jìn)行不比較,計算所產(chǎn)生的損失,然后基于此損失設(shè)置對數(shù)形式的懲罰項。

在神經(jīng)網(wǎng)絡(luò)中,所使用的Softmax函數(shù)是連續(xù)可導(dǎo)函數(shù),這使得可以計算出損失函數(shù)相對于神經(jīng)網(wǎng)絡(luò)中每個權(quán)重的導(dǎo)數(shù)(在《機器學(xué)習(xí)數(shù)學(xué)基礎(chǔ)》中有對此的完整推導(dǎo)過程和案例,這樣就可以相應(yīng)地調(diào)整模型的權(quán)重以最小化損失函數(shù)。

擴展資料:

注意事項:

當(dāng)預(yù)測類別為二分類時,交叉熵?fù)p失函數(shù)的計算公式如下圖,其中y是真實類別(值為0或1),p是預(yù)測類別的概率(值為0~1之間的小數(shù))。

計算二分類的交叉熵?fù)p失函數(shù)的python代碼如下圖,其中esp是一個極小值,第五行代碼clip的目的是保證預(yù)測概率的值在0~1之間,輸出的損失值數(shù)組求和后,就是損失函數(shù)最后的返回值。

參考資料來源:百度百科-交叉熵

參考資料來源:百度百科-損失函數(shù)

常見的損失函數(shù)

MSE也稱為L2 loss:

隨著預(yù)測與真實值的絕對誤差的增加,均方差損失呈二次方增加。

Huber Loss將L1和L2結(jié)合起來,也被稱做smoothed L1 Loss。增加了一個需要額外設(shè)置的超參數(shù) ,來控制L2和L1的連接位置。 在誤差接近0的時候使用L2,使損失函數(shù)可導(dǎo),梯度更加穩(wěn)定;誤差較大的時候用L1,可以降低outlier帶來的巨大誤差的影響。

二分類中,通常使用Sigmoid函數(shù)將模型的輸出壓縮到(0, 1)區(qū)間。給定輸入 ,模型判斷為正類/負(fù)類的概率:

合并成一個:

取對數(shù)加負(fù)號之后,得到:

N是所有樣本的數(shù)量。

圖中曲線可以看出,當(dāng)預(yù)測值越接近目標(biāo)值損失越小,隨著誤差變差,損失呈現(xiàn)指數(shù)增長。

真實值 現(xiàn)在是一個One-hot向量,Sigmoid換成了Softmax來把輸出值壓縮到(0, 1)之間,所有維度的輸出和為1.

Softmax公式:

表示K個類別中的一個,k只在對應(yīng)的類別上是1,其他時候是0。

于是上式可以改寫成:

是樣本 的目標(biāo)類。

分類問題中為什么不用MSE? 因為MSE假設(shè)了誤差服從高斯分布,在分類任務(wù)下這個假設(shè)無法滿足,因此效果會很差。

第二個論點是從信息論的角度來分析的,是關(guān)于由KL散度的角度來推導(dǎo)Cross Entropy的過程( 原文 )

是另一種二分類損失函數(shù),適用于Maximum-margin的分類,SVM的損失函數(shù)就是hinge loss + L2正則化

下圖為,當(dāng)y為正類的時候( ),不同的輸出 對應(yīng)的loss圖

當(dāng)y為正類時,模型輸出負(fù)值會有很大的懲罰。即使輸出為正值在(0, 1)區(qū)間,也還是會有一個較小的懲罰。也就是只有置信度高的才會有零損失。使用hinge loss直覺上的理解是要找到一個決策邊界,使得素有數(shù)據(jù)點被這個邊界正確地,高置信度地被分類。

同時hinge loss也反應(yīng)了一點,對于那些已經(jīng)可以被很好分類的樣本,它不再對loss產(chǎn)生貢獻(xiàn),可以讓模型花更多的energy去學(xué)習(xí)難以分類的樣本。

當(dāng)前題目:常見損失函數(shù)python的簡單介紹
URL網(wǎng)址:http://aaarwkj.com/article20/dooosjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、靜態(tài)網(wǎng)站、外貿(mào)建站、App開發(fā)Google、動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
91天美精东果冻麻豆| 国语自产拍在线观看不卡| 国产三级av高清一区二区| 丝袜美腿一区二区三区| 亚洲一二三区精品与老人| 日韩精品一二三区乱码| 亚洲天堂欧美天堂淫人天堂| 国产精品一区二区三区专区| 久久久亚洲成人国产av| 国产999精品在线观看| 日韩夫妻精品熟妇人妻一区| 国产精品成人大片在线播放| 欧美日韩国产成人激情| 日本中文字幕乱码一区| 精品国产一区二区三区卡| 伊人久久九九精品综合| 亚洲激情自拍偷拍视频| 国产高清不卡av在线| 偷拍大神女厕偷拍作品| 日韩精品国产专区一区| 欧美性大片免费在线观看| 蜜桃午夜精品一区二区三区| 亚洲一二三无人区是什么| 久久国产精品一区免费观看| 亚洲精品一区二区播放| 国产黄a三级三级三级老师绑| 亚洲国产日韩欧美视频| 把熟睡的少妇弄到高潮| 欧美日韩另类国产综合| 日韩欧美国产成人在线观看 | 视频一区二区三区拍拍| 四虎精品视频在线免费| 在线观看免费完整观看一区二区 | 四虎在线免费视频播放| 国产三级在线播放完整| 国产精品欧美色区福利在线| 国产亚洲精品久久久闺蜜| 成年人的黄色大片网站| 亚洲欧美日韩一区91| 麻豆成人三级电影在线| 日本91一区二区不卡|