成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

包含python計(jì)算損失函數(shù)的詞條

從零開始用Python構(gòu)建神經(jīng)網(wǎng)絡(luò)

從零開始用Python構(gòu)建神經(jīng)網(wǎng)絡(luò)

創(chuàng)新互聯(lián)專注于喀喇沁企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城開發(fā)??呔W(wǎng)站建設(shè)公司,為喀喇沁等地區(qū)提供建站服務(wù)。全流程按需求定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

動機(jī):為了更加深入的理解深度學(xué)習(xí),我們將使用 python 語言從頭搭建一個(gè)神經(jīng)網(wǎng)絡(luò),而不是使用像 Tensorflow 那樣的封裝好的框架。我認(rèn)為理解神經(jīng)網(wǎng)絡(luò)的內(nèi)部工作原理,對數(shù)據(jù)科學(xué)家來說至關(guān)重要。

這篇文章的內(nèi)容是我的所學(xué),希望也能對你有所幫助。

神經(jīng)網(wǎng)絡(luò)是什么?

介紹神經(jīng)網(wǎng)絡(luò)的文章大多數(shù)都會將它和大腦進(jìn)行類比。如果你沒有深入研究過大腦與神經(jīng)網(wǎng)絡(luò)的類比,那么將神經(jīng)網(wǎng)絡(luò)解釋為一種將給定輸入映射為期望輸出的數(shù)學(xué)關(guān)系會更容易理解。

神經(jīng)網(wǎng)絡(luò)包括以下組成部分

? 一個(gè)輸入層,x

? 任意數(shù)量的隱藏層

? 一個(gè)輸出層,?

? 每層之間有一組權(quán)值和偏置,W and b

? 為隱藏層選擇一種激活函數(shù),σ。在教程中我們使用 Sigmoid 激活函數(shù)

下圖展示了 2 層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)(注意:我們在計(jì)算網(wǎng)絡(luò)層數(shù)時(shí)通常排除輸入層)

2 層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)

用 Python 可以很容易的構(gòu)建神經(jīng)網(wǎng)絡(luò)類

訓(xùn)練神經(jīng)網(wǎng)絡(luò)

這個(gè)網(wǎng)絡(luò)的輸出 ? 為:

你可能會注意到,在上面的等式中,輸出 ? 是 W 和 b 函數(shù)。

因此 W 和 b 的值影響預(yù)測的準(zhǔn)確率. 所以根據(jù)輸入數(shù)據(jù)對 W 和 b 調(diào)優(yōu)的過程就被成為訓(xùn)練神經(jīng)網(wǎng)絡(luò)。

每步訓(xùn)練迭代包含以下兩個(gè)部分:

? 計(jì)算預(yù)測結(jié)果 ?,這一步稱為前向傳播

? 更新 W 和 b,,這一步成為反向傳播

下面的順序圖展示了這個(gè)過程:

前向傳播

正如我們在上圖中看到的,前向傳播只是簡單的計(jì)算。對于一個(gè)基本的 2 層網(wǎng)絡(luò)來說,它的輸出是這樣的:

我們在 NeuralNetwork 類中增加一個(gè)計(jì)算前向傳播的函數(shù)。為了簡單起見我們假設(shè)偏置 b 為0:

但是我們還需要一個(gè)方法來評估預(yù)測結(jié)果的好壞(即預(yù)測值和真實(shí)值的誤差)。這就要用到損失函數(shù)。

損失函數(shù)

常用的損失函數(shù)有很多種,根據(jù)模型的需求來選擇。在本教程中,我們使用誤差平方和作為損失函數(shù)。

誤差平方和是求每個(gè)預(yù)測值和真實(shí)值之間的誤差再求和,這個(gè)誤差是他們的差值求平方以便我們觀察誤差的絕對值。

訓(xùn)練的目標(biāo)是找到一組 W 和 b,使得損失函數(shù)最好小,也即預(yù)測值和真實(shí)值之間的距離最小。

反向傳播

我們已經(jīng)度量出了預(yù)測的誤差(損失),現(xiàn)在需要找到一種方法來傳播誤差,并以此更新權(quán)值和偏置。

為了知道如何適當(dāng)?shù)恼{(diào)整權(quán)值和偏置,我們需要知道損失函數(shù)對權(quán)值 W 和偏置 b 的導(dǎo)數(shù)。

回想微積分中的概念,函數(shù)的導(dǎo)數(shù)就是函數(shù)的斜率。

梯度下降法

如果我們已經(jīng)求出了導(dǎo)數(shù),我們就可以通過增加或減少導(dǎo)數(shù)值來更新權(quán)值 W 和偏置 b(參考上圖)。這種方式被稱為梯度下降法。

但是我們不能直接計(jì)算損失函數(shù)對權(quán)值和偏置的導(dǎo)數(shù),因?yàn)樵趽p失函數(shù)的等式中并沒有顯式的包含他們。因此,我們需要運(yùn)用鏈?zhǔn)角髮?dǎo)發(fā)在來幫助計(jì)算導(dǎo)數(shù)。

鏈?zhǔn)椒▌t用于計(jì)算損失函數(shù)對 W 和 b 的導(dǎo)數(shù)。注意,為了簡單起見。我們只展示了假設(shè)網(wǎng)絡(luò)只有 1 層的偏導(dǎo)數(shù)。

這雖然很簡陋,但是我們依然能得到想要的結(jié)果—損失函數(shù)對權(quán)值 W 的導(dǎo)數(shù)(斜率),因此我們可以相應(yīng)的調(diào)整權(quán)值。

現(xiàn)在我們將反向傳播算法的函數(shù)添加到 Python 代碼中

為了更深入的理解微積分原理和反向傳播中的鏈?zhǔn)角髮?dǎo)法則,我強(qiáng)烈推薦 3Blue1Brown 的如下教程:

Youtube:

整合并完成一個(gè)實(shí)例

既然我們已經(jīng)有了包括前向傳播和反向傳播的完整 Python 代碼,那么就將其應(yīng)用到一個(gè)例子上看看它是如何工作的吧。

神經(jīng)網(wǎng)絡(luò)可以通過學(xué)習(xí)得到函數(shù)的權(quán)重。而我們僅靠觀察是不太可能得到函數(shù)的權(quán)重的。

讓我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)進(jìn)行 1500 次迭代,看看會發(fā)生什么。 注意觀察下面每次迭代的損失函數(shù),我們可以清楚地看到損失函數(shù)單調(diào)遞減到最小值。這與我們之前介紹的梯度下降法一致。

讓我們看看經(jīng)過 1500 次迭代后的神經(jīng)網(wǎng)絡(luò)的最終預(yù)測結(jié)果:

經(jīng)過 1500 次迭代訓(xùn)練后的預(yù)測結(jié)果

我們成功了!我們應(yīng)用前向和方向傳播算法成功的訓(xùn)練了神經(jīng)網(wǎng)絡(luò)并且預(yù)測結(jié)果收斂于真實(shí)值。

注意預(yù)測值和真實(shí)值之間存在細(xì)微的誤差是允許的。這樣可以防止模型過擬合并且使得神經(jīng)網(wǎng)絡(luò)對于未知數(shù)據(jù)有著更強(qiáng)的泛化能力。

下一步是什么?

幸運(yùn)的是我們的學(xué)習(xí)之旅還沒有結(jié)束,仍然有很多關(guān)于神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)的內(nèi)容需要學(xué)習(xí)。例如:

? 除了 Sigmoid 以外,還可以用哪些激活函數(shù)

? 在訓(xùn)練網(wǎng)絡(luò)的時(shí)候應(yīng)用學(xué)習(xí)率

? 在面對圖像分類任務(wù)的時(shí)候使用卷積神經(jīng)網(wǎng)絡(luò)

我很快會寫更多關(guān)于這個(gè)主題的內(nèi)容,敬請期待!

最后的想法

我自己也從零開始寫了很多神經(jīng)網(wǎng)絡(luò)的代碼

雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學(xué)習(xí)框架方便的搭建深層網(wǎng)絡(luò)而不需要完全理解其內(nèi)部工作原理。但是我覺得對于有追求的數(shù)據(jù)科學(xué)家來說,理解內(nèi)部原理是非常有益的。

這種練習(xí)對我自己來說已成成為重要的時(shí)間投入,希望也能對你有所幫助

python邏輯回歸怎么求正系數(shù)

Python 邏輯回歸求正系數(shù)的方法可以分為兩種:

1. 使用線性模型的求解方法:可以使用sklearn中的LogisticRegression類來求解正系數(shù),調(diào)用其中的fit()方法就可以求解出正系數(shù)。

2. 使用梯度下降法:可以自己實(shí)現(xiàn)梯度下降法,通過不斷迭代更新正系數(shù),最終獲得最優(yōu)的正系數(shù)。

用python實(shí)現(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個(gè)取值,則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

條件熵:指已知某個(gè)隨機(jī)變量的情況下,信息集合的信息熵。

設(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

組成的隨機(jī)變量集合Y,則隨機(jī)變量(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

)

可以化簡條件熵的計(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

)

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

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代碼實(shí)現(xiàn)

import numpy as np

import math

def calShannonEnt(dataSet):

""" 計(jì)算信息熵 """

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):

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

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: #計(jì)算條件熵

subDataSet = filterSubDataSet(dataSet, i, v)

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

condition_entropy += p * calShannonEnt(subDataSet)

infoGain = entropy - condition_entropy #計(jì)算信息增益

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: # 只有一個(gè)類別

return classList[0]

if dataSet.shape[1] == 1: #當(dāng)所有特征屬性都利用完仍然無法判斷樣本屬于哪一類,此時(shí)歸為該數(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é)點(diǎn)仍是樹,則遞歸查找

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í),還需要對數(shù)據(jù)進(jìn)行離散化,離散化的方法稍后說明,此處為了簡化,先使用每一種特征所有連續(xù)性數(shù)值的中值作為分界點(diǎn),小于中值的標(biāo)記為1,大于中值的標(biāo)記為0。訓(xùn)練1000次,統(tǒng)計(jì)準(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)練集每個(gè)特征,以中值為分界點(diǎ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ù)離散化

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

具體步驟如下:

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

對相鄰兩個(gè)特征值取均值,這些均值就是待選的劃分點(diǎn)

用每一個(gè)待選點(diǎn)把該特征的特征值劃分成兩類,小于該特征點(diǎn)置為1, 大于該特征點(diǎn)置為0,計(jì)算此時(shí)的條件熵,并計(jì)算出信息增益

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

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

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

""" 用于把每個(gè)特征的連續(xù)值按照區(qū)分點(diǎn)分成兩類,加入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ù)每個(gè)特征的數(shù)值型特征值進(jìn)行離散化 """

featureNum = dataSet.shape[1] - 1

entropy = calShannonEnt(dataSet)

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

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

meanPoint = []

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

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

bestInfoGain = 0.0

bestMeanPoint = -1

for mp in meanPoint: #對于每個(gè)劃分點(diǎn)

subEntropy = 0.0 #計(jì)算該劃分點(diǎn)的信息熵

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

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

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

subEntropy += p * calShannonEnt(subDataSet)

## 計(jì)算信息增益

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次,同時(shí)用sklearn中的DecisionTreeClassifier對相同數(shù)據(jù)進(jìn)行分類,分別統(tǒng)計(jì)平均準(zhǔn)確率。運(yù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ū)分點(diǎn)離散化訓(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é)點(diǎn)t的熵值,T表示決策樹的深度。前項(xiàng)∑ 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)驗(yàn)損失函數(shù)當(dāng)隨著T的增加,該節(jié)點(diǎn)被不停的劃分的時(shí)候,熵值可以達(dá)到最小,然而T的增加會使后項(xiàng)的值增大。決策樹損失函數(shù)要做的就是在兩者之間進(jìn)行平衡,使得該值最小。

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

C4.5算法

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

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

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í)分類回歸決策樹算法時(shí),看了不少的資料和博客。關(guān)于這兩個(gè)算法,ID3算法是最早的分類算法,這個(gè)算法剛出生的時(shí)候其實(shí)帶有很多缺陷:

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

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

沒有解決過擬合的問題

沒有解決缺失值的問題

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

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

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

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

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

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

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

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

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

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

C4.5的剪枝過于簡單

C4.5只能用于分類運(yùn)算不能用于回歸

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

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

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

原文鏈接:

正則化項(xiàng)L1和L2的直觀理解及L1不可導(dǎo)處理

正則化(Regularization)

機(jī)器學(xué)習(xí)中幾乎都可以看到損失函數(shù)后面會添加一個(gè)額外項(xiàng),常用的額外項(xiàng)一般有兩種,一般英文稱作 ?1-norm 和 ?2-norm ,中文稱作 L1正則化 和 L2正則化 ,或者 L1范數(shù) 和 L2范數(shù) 。

L1正則化和L2正則化可以看做是損失函數(shù)的懲罰項(xiàng)。所謂『懲罰』是指對損失函數(shù)中的某些參數(shù)做一些限制。對于線性回歸模型,使用L1正則化的模型建叫做Lasso回歸,使用L2正則化的模型叫做Ridge回歸(嶺回歸)。下圖是Python中Lasso回歸的損失函數(shù),式中加號后面一項(xiàng)α||w||1即為L1正則化項(xiàng)。

下圖是Python中Ridge回歸的損失函數(shù),式中加號后面一項(xiàng)α||w||22即為L2正則化項(xiàng)。

一般回歸分析中回歸w表示特征的系數(shù),從上式可以看到正則化項(xiàng)是對系數(shù)做了處理(限制)。 L1正則化和L2正則化的說明如下:

L1正則化是指權(quán)值向量w中各個(gè)元素的 絕對值之和 ,通常表示為||w||1

L2正則化是指權(quán)值向量w中各個(gè)元素的 平方和然后再求平方根 (可以看到Ridge回歸的L2正則化項(xiàng)有平方符號),通常表示為||w||2

一般都會在正則化項(xiàng)之前添加一個(gè)系數(shù),Python中用α表示,一些文章也用λ表示。這個(gè)系數(shù)需要用戶指定。

那添加L1和L2正則化有什么用? 下面是L1正則化和L2正則化的作用 ,這些表述可以在很多文章中找到。

L1正則化可以產(chǎn)生稀疏權(quán)值矩陣,即產(chǎn)生一個(gè)稀疏模型,可以用于特征選擇

L2正則化可以防止模型過擬合(overfitting);一定程度上,L1也可以防止過擬合

稀疏模型與特征選擇

上面提到L1正則化有助于生成一個(gè)稀疏權(quán)值矩陣,進(jìn)而可以用于特征選擇。為什么要生成一個(gè)稀疏矩陣?

稀疏矩陣指的是很多元素為0,只有少數(shù)元素是非零值的矩陣,即得到的線性回歸模型的大部分系數(shù)都是0.

通常機(jī)器學(xué)習(xí)中特征數(shù)量很多,例如文本處理時(shí),如果將一個(gè)詞組(term)作為一個(gè)特征,那么特征數(shù)量會達(dá)到上萬個(gè)(bigram)。在預(yù)測或分類時(shí),那么多特征顯然難以選擇,但是如果代入這些特征得到的模型是一個(gè)稀疏模型,表示只有少數(shù)特征對這個(gè)模型有貢獻(xiàn),絕大部分特征是沒有貢獻(xiàn)的,或者貢獻(xiàn)微?。ㄒ?yàn)樗鼈兦懊娴南禂?shù)是0或者是很小的值,即使去掉對模型也沒有什么影響),此時(shí)我們就可以只關(guān)注系數(shù)是非零值的特征。這就是稀疏模型與特征選擇的關(guān)系。

L1和L2正則化的直觀理解

這部分內(nèi)容將解釋 為什么L1正則化可以產(chǎn)生稀疏模型(L1是怎么讓系數(shù)等于零的) ,以及 為什么L2正則化可以防止過擬合 。

L1正則化和特征選擇

假設(shè)有如下帶L1正則化的損失函數(shù):

J=J0+α∑w|w|(1)

其中J0是原始的損失函數(shù),加號后面的一項(xiàng)是L1正則化項(xiàng),α是正則化系數(shù)。注意到L1正則化是權(quán)值的 絕對值之和 ,J是帶有絕對值符號的函數(shù),因此J是不完全可微的。機(jī)器學(xué)習(xí)的任務(wù)就是要通過一些方法(比如梯度下降)求出損失函數(shù)的最小值。當(dāng)我們在原始損失函數(shù)J0后添加L1正則化項(xiàng)時(shí),相當(dāng)于對J0做了一個(gè)約束。令L=α∑w|w|,則J=J0+L,此時(shí)我們的任務(wù)變成 在L約束下求出J0取最小值的解 ??紤]二維的情況,即只有兩個(gè)權(quán)值w1和w2,此時(shí)L=|w1|+|w2|對于梯度下降法,求解J0的過程可以畫出等值線,同時(shí)L1正則化的函數(shù)L也可以在w1w2的二維平面上畫出來。如下圖:

圖1? L1正則化

圖中等值線是J0的等值線,黑色方形是L函數(shù)的圖形。在圖中,當(dāng)J0等值線與L圖形首次相交的地方就是最優(yōu)解。上圖中J0與L在L的一個(gè)頂點(diǎn)處相交,這個(gè)頂點(diǎn)就是最優(yōu)解。注意到這個(gè)頂點(diǎn)的值是(w1,w2)=(0,w)。可以直觀想象,因?yàn)長函數(shù)有很多『突出的角』(二維情況下四個(gè),多維情況下更多),J0與這些角接觸的機(jī)率會遠(yuǎn)大于與L其它部位接觸的機(jī)率,而在這些角上,會有很多權(quán)值等于0,這就是為什么L1正則化可以產(chǎn)生稀疏模型,進(jìn)而可以用于特征選擇。

而正則化前面的系數(shù)α,可以控制L圖形的大小。α越小,L的圖形越大(上圖中的黑色方框);α越大,L的圖形就越小,可以小到黑色方框只超出原點(diǎn)范圍一點(diǎn)點(diǎn),這是最優(yōu)點(diǎn)的值(w1,w2)=(0,w)中的w可以取到很小的值。

類似,假設(shè)有如下帶L2正則化的損失函數(shù):

J=J0+α∑ww2(2)

同樣可以畫出他們在二維平面上的圖形,如下:

圖2? L2正則化

二維平面下L2正則化的函數(shù)圖形是個(gè)圓,與方形相比,被磨去了棱角。因此J0與L相交時(shí)使得w1或w2等于零的機(jī)率小了許多,這就是為什么L2正則化不具有稀疏性的原因。

L2正則化和過擬合

擬合過程中通常都傾向于讓權(quán)值盡可能小,最后構(gòu)造一個(gè)所有參數(shù)都比較小的模型。因?yàn)橐话阏J(rèn)為參數(shù)值小的模型比較簡單,能適應(yīng)不同的數(shù)據(jù)集,也在一定程度上避免了過擬合現(xiàn)象??梢栽O(shè)想一下對于一個(gè)線性回歸方程,若參數(shù)很大,那么只要數(shù)據(jù)偏移一點(diǎn)點(diǎn),就會對結(jié)果造成很大的影響;但如果參數(shù)足夠小,數(shù)據(jù)偏移得多一點(diǎn)也不會對結(jié)果造成什么影響,專業(yè)一點(diǎn)的說法是『抗擾動能力強(qiáng)』。

那為什么L2正則化可以獲得值很小的參數(shù)?

以線性回歸中的梯度下降法為例。假設(shè)要求的參數(shù)為θ,hθ(x)是我們的假設(shè)函數(shù),那么線性回歸的代價(jià)函數(shù)如下:

J(θ)=12m∑i=1m(hθ(x(i))?y(i))(3)

那么在梯度下降法中,最終用于迭代計(jì)算參數(shù)θ的迭代式為:

θj:=θj?α1m∑i=1m(hθ(x(i))?y(i))x(i)j(4)

其中α是learning rate. 上式是沒有添加L2正則化項(xiàng)的迭代公式,如果在原始代價(jià)函數(shù)之后添加L2正則化,則迭代公式會變成下面的樣子:

θj:=θj(1?αλm)?α1m∑i=1m(hθ(x(i))?y(i))x(i)j(5)

其中 λ就是正則化參數(shù) 。從上式可以看到,與未添加L2正則化的迭代公式相比,每一次迭代,θj都要先乘以一個(gè)小于1的因子,從而使得θj不斷減小,因此總得來看,θ是不斷減小的。

最開始也提到L1正則化一定程度上也可以防止過擬合。之前做了解釋,當(dāng)L1的正則化系數(shù)很小時(shí),得到的最優(yōu)解會很小,可以達(dá)到和L2正則化類似的效果。

正則化參數(shù)的選擇

L1正則化參數(shù)

通常越大的λ可以讓代價(jià)函數(shù)在參數(shù)為0時(shí)取到最小值。下面是一個(gè)簡單的例子,這個(gè)例子來自 Quora上的問答 。為了方便敘述,一些符號跟這篇帖子的符號保持一致。

假設(shè)有如下帶L1正則化項(xiàng)的代價(jià)函數(shù):

F(x)=f(x)+λ||x||1

其中x是要估計(jì)的參數(shù),相當(dāng)于上文中提到的w以及θ. 注意到L1正則化在某些位置是不可導(dǎo)的,當(dāng)λ足夠大時(shí)可以使得F(x)在x=0時(shí)取到最小值。如下圖:

圖3 L1正則化參數(shù)的選擇

分別取λ=0.5和λ=2,可以看到越大的λ越容易使F(x)在x=0時(shí)取到最小值。

L2正則化參數(shù)

從公式5可以看到,λ越大,θj衰減得越快。另一個(gè)理解可以參考圖2,λ越大,L2圓的半徑越小,最后求得代價(jià)函數(shù)最值時(shí)各參數(shù)也會變得很小。

Reference

過擬合的解釋:

正則化的解釋:

正則化的解釋:

正則化的數(shù)學(xué)解釋(一些圖來源于這里):

原文參考:blog.csdn.net/jinping_shi/article/details/52433975

怎樣用python構(gòu)建一個(gè)卷積神經(jīng)網(wǎng)絡(luò)?

用keras框架較為方便

首先安裝anaconda,然后通過pip安裝keras

1、#導(dǎo)入各種用到的模塊組件

from __future__ import absolute_import

from __future__ import print_function

from keras.preprocessing.image import ImageDataGenerator

from keras.models import Sequential

from keras.layers.core import Dense, Dropout, Activation, Flatten

from keras.layers.advanced_activations import PReLU

from keras.layers.convolutional import Convolution2D, MaxPooling2D

from keras.optimizers import SGD, Adadelta, Adagrad

from keras.utils import np_utils, generic_utils

from six.moves import range

from data import load_data

import random

import numpy as np

np.random.seed(1024) ?# for reproducibility

2、。#打亂數(shù)據(jù)

index = [i for i in range(len(data))]

random.shuffle(index)

data = data[index]

label = label[index]

print(data.shape[0], ' samples')

#label為0~9共10個(gè)類別,keras要求格式為binary class matrices,轉(zhuǎn)化一下,直接調(diào)用keras提供的這個(gè)函數(shù)

label = np_utils.to_categorical(label, 10)

###############

#開始建立CNN模型

###############

#生成一個(gè)model

model = Sequential()

3、#第一個(gè)卷積層,4個(gè)卷積核,每個(gè)卷積核大小5*5。1表示輸入的圖片的通道,灰度圖為1通道。

#border_mode可以是valid或者full,具體看這里說明:

#激活函數(shù)用tanh

#你還可以在model.add(Activation('tanh'))后加上dropout的技巧: model.add(Dropout(0.5))

model.add(Convolution2D(4, 5, 5, border_mode='valid',input_shape=(1,28,28)))

model.add(Activation('tanh'))

#第二個(gè)卷積層,8個(gè)卷積核,每個(gè)卷積核大小3*3。4表示輸入的特征圖個(gè)數(shù),等于上一層的卷積核個(gè)數(shù)

4、全連接層,先將前一層輸出的二維特征圖flatten為一維的。

#Dense就是隱藏層。16就是上一層輸出的特征圖個(gè)數(shù)。4是根據(jù)每個(gè)卷積層計(jì)算出來的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4

#全連接有128個(gè)神經(jīng)元節(jié)點(diǎn),初始化方式為normal

model.add(Flatten())

model.add(Dense(128, init='normal'))

model.add(Activation('tanh'))

#Softmax分類,輸出是10類別

model.add(Dense(10, init='normal'))

model.add(Activation('softmax'))

#############

#開始訓(xùn)練模型

##############

#使用SGD + momentum

#model.compile里的參數(shù)loss就是損失函數(shù)(目標(biāo)函數(shù))

sgd = SGD(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)

model.compile(loss='categorical_crossentropy', optimizer=sgd,metrics=["accuracy"])

#調(diào)用fit方法,就是一個(gè)訓(xùn)練過程. 訓(xùn)練的epoch數(shù)設(shè)為10,batch_size為100.

#數(shù)據(jù)經(jīng)過隨機(jī)打亂shuffle=True。verbose=1,訓(xùn)練過程中輸出的信息,0、1、2三種方式都可以,無關(guān)緊要。show_accuracy=True,訓(xùn)練時(shí)每一個(gè)epoch都輸出accuracy。

#validation_split=0.2,將20%的數(shù)據(jù)作為驗(yàn)證集。

model.fit(data, label, batch_size=100, nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)

"""

#使用data augmentation的方法

#一些參數(shù)和調(diào)用的方法,請看文檔

datagen = ImageDataGenerator(

featurewise_center=True, # set input mean to 0 over the dataset

samplewise_center=False, # set each sample mean to 0

featurewise_std_normalization=True, # divide inputs by std of the dataset

samplewise_std_normalization=False, # divide each input by its std

zca_whitening=False, # apply ZCA whitening

rotation_range=20, # randomly rotate images in the range (degrees, 0 to 180)

width_shift_range=0.2, # randomly shift images horizontally (fraction of total width)

height_shift_range=0.2, # randomly shift images vertically (fraction of total height)

horizontal_flip=True, # randomly flip images

vertical_flip=False) # randomly flip images

# compute quantities required for featurewise normalization

# (std, mean, and principal components if ZCA whitening is applied)

datagen.fit(data)

for e in range(nb_epoch):

print('-'*40)

print('Epoch', e)

print('-'*40)

print("Training...")

# batch train with realtime data augmentation

progbar = generic_utils.Progbar(data.shape[0])

for X_batch, Y_batch in datagen.flow(data, label):

loss,accuracy = model.train(X_batch, Y_batch,accuracy=True)

progbar.add(X_batch.shape[0], values=[("train loss", loss),("accuracy:", accuracy)] )

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

平滑函數(shù)。

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

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

擴(kuò)展資料:

注意事項(xiàng):

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

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

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

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

網(wǎng)頁標(biāo)題:包含python計(jì)算損失函數(shù)的詞條
網(wǎng)頁路徑:http://jinyejixie.com/article42/dodocec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)靜態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)微信小程序、定制網(wǎng)站、用戶體驗(yàn)

廣告

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

成都網(wǎng)頁設(shè)計(jì)公司
兴城市| 崇文区| 九龙县| 绥化市| 福安市| 云南省| 会宁县| 石屏县| 乐都县| 敦煌市| 阳东县| 九龙城区| 宜春市| 永和县| 永仁县| 龙海市| 南汇区| 汉阴县| 明水县| 宜丰县| 江华| 海伦市| 蒙阴县| 资阳市| 阜城县| 神农架林区| 淮滨县| 嘉峪关市| 宣城市| 长寿区| 龙里县| 临夏市| 怀来县| 正定县| 同仁县| 曲沃县| 凤庆县| 南和县| 凤台县| 阿拉善盟| 兰西县|