摘要:根據(jù)錯(cuò)誤率決定是否回退到訓(xùn)練階段,通過改變迭代的次數(shù)和步長(zhǎng)等參數(shù)來得到更好的回歸系數(shù)。使用回歸方法進(jìn)行分類所需做的是把測(cè)試集上每個(gè)特征向量乘以最優(yōu)化方法得來的回歸系數(shù),再將該乘積結(jié)果求和,最后輸入到函數(shù)即可。
本篇內(nèi)容為《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》第 5 章 Logistic 回歸程序清單。
書中所用代碼為 python2,下面給出的程序清單是在 python3 中實(shí)踐改過的代碼,希望對(duì)你有幫助。
梯度上升法的偽代碼如下:
每個(gè)回歸系數(shù)初始化為 1
重復(fù) R 次:
————計(jì)算整個(gè)數(shù)據(jù)集的梯度
————使用 alpha $ imes$ gradient 更新回歸系數(shù)的向量
返回回歸系數(shù)
# 打開文本文件 testSet.txt 并逐行讀取 def loadDataSet(): dataMat = []; lableMat = [] fr = open("testSet.txt") for line in fr.readlines(): lineArr = line.strip().split() # 為計(jì)算方便,將 X0 的值設(shè)為 1.0 dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) lableMat.append(int(lineArr[2])) return dataMat, lableMat def sigmoid(intX): return 1.0/(1+exp(-intX)) # 參數(shù) dataMatIn 是一個(gè) 2 維 numpy 數(shù)組,存放的是一個(gè) 100*3 的矩陣 # 每列分別代表每個(gè)不同的特征,每行代表每個(gè)訓(xùn)練樣本 def gradAscent(dataMatIn, classLabels): # 轉(zhuǎn)換為 numpy 矩陣的數(shù)據(jù)類型 dataMatrix = mat(dataMatIn) # classLabels 類別標(biāo)簽 labelMat = mat(classLabels).transpose() # 得到矩陣大小 m,n = shape(dataMatrix) # 設(shè)置梯度上升法所需參數(shù) # alpha 步長(zhǎng),maxCycles 迭代次數(shù) alpha = 0.001 maxCycles = 500 weights = ones((n,1)) for k in range(maxCycles): h = sigmoid(dataMatrix * weights) # 計(jì)算真實(shí)類別與預(yù)測(cè)類的差值,然后按照該差值的方向調(diào)整回歸系數(shù) error = (labelMat - h) weights = weights + alpha * dataMatrix.transpose() * error # 返回訓(xùn)練好的回歸系數(shù) return weights
在 python 提示符下,執(zhí)行代碼并得到結(jié)果:
>>> import logRegres >>> dataArr, labelMat=logRegres.loadDataSet() >>> logRegres.gradAscent(dataArr, labelMat) matrix([[ 4.12414349], [ 0.48007329], [-0.6168482 ]])分析數(shù)據(jù):畫出決策邊界 程序清單 5-2:畫出數(shù)據(jù)集和 Logistic 回歸最佳擬合直線的函數(shù)
# 畫出數(shù)據(jù)集和logistic回歸最佳擬合直線的函數(shù) def plotBestFit(weights): import matplotlib.pyplot as plt dataMat, labelMat = loadDataSet() dataArr = array(dataMat) n = shape(dataArr)[0] xcord1 = [] ycord1 = [] xcord2 = [] ycord2 = [] for i in range(n): if int(labelMat[i]) == 1: xcord1.append(dataArr[i,1]) ycord1.append(dataArr[i,2]) else: xcord2.append(dataArr[i,1]) ycord2.append(dataArr[i,2]) fig = plt.figure() ax = fig.add_subplot(111) # 形狀參數(shù) marker "s":正方形,參數(shù) s:點(diǎn)的大小 ax.scatter(xcord1, ycord1, s=30, c="red", marker="s") ax.scatter(xcord2, ycord2, s=30, c="green") # arange(start, end, step),返回一個(gè)array對(duì)象 x = arange(-3.0, 3.0, 0.1) # 設(shè)置 sigmoid 函數(shù)為0 y = (-weights[0]-weights[1]*x)/weights[2] ax.plot(x, y) plt.xlabel("X1") plt.ylabel("X2") plt.show()
在 python 提示符下,執(zhí)行代碼并得到結(jié)果:
>>> import importlib >>> importlib.reload(logRegres)訓(xùn)練算法:隨機(jī)梯度上升>>> weights = logRegres.gradAscent(dataArr, labelMat) >>> logRegres.plotBestFit(weights.getA())
隨機(jī)梯度上升算法的偽代碼如下:
所有回歸系數(shù)初始化為 1
對(duì)數(shù)據(jù)集中每個(gè)樣本
————計(jì)算該樣本的梯度
————使用 alpha $ imes$ gradient 更新回歸系數(shù)值
返回回歸系數(shù)值
# 隨機(jī)梯度上升算法 def stocGradAscent0(dataMatrix, classLabels): m,n = shape(dataMatrix) alpha = 0.01 weights = ones(n) for i in range(m): # 變量 h 和誤差 error 都是向量 h = sigmoid(sum(dataMatrix[i]*weights)) error = classLabels[i] - h weights = weights + alpha * error * dataMatrix[i] return weights
在 python 提示符下,執(zhí)行代碼并得到結(jié)果:
>>> from numpy import * >>> importlib.reload(logRegres)程序清單 5-4:改進(jìn)的隨機(jī)梯度上升算法>>> dataArr, labelMat=logRegres.loadDataSet() >>> weights = logRegres.stocGradAscent0(array(dataArr), labelMat) >>> logRegres.plotBestFit(weights)
# 改進(jìn)的隨機(jī)梯度上升算法 def stocGradAscent1(dataMatrix, classLabels, numIter=150): m,n = shape(dataMatrix) weights = ones(n) for j in range(numIter): dataIndex = list(range(m)) for i in range(m): alpha = 4/(1.0+j+i)+0.01 # uniform() 方法將隨機(jī)生成下一個(gè)實(shí)數(shù) randIndex = int(random.uniform(0, len(dataIndex))) h = sigmoid(sum(dataMatrix[randIndex]*weights)) error = classLabels[randIndex] - h weights = weights + alpha * error * dataMatrix[randIndex] del(dataIndex[randIndex]) return weights
在 python 提示符下,執(zhí)行代碼并得到結(jié)果:
>>> importlib.reload(logRegres)示例:從疝氣病癥預(yù)測(cè)病馬的死亡率>>> dataArr, labelMat=logRegres.loadDataSet() >>> weights = logRegres.stocGradAscent1(array(dataArr), labelMat) >>> logRegres.plotBestFit(weights)
使用 Logistic 回歸估計(jì)馬疝病的死亡率
收集數(shù)據(jù):給定數(shù)據(jù)文件。
準(zhǔn)備數(shù)據(jù):用 Python 解析文本文件并填充缺失值。
分析數(shù)據(jù):可視化并觀察數(shù)據(jù)。
訓(xùn)練算法:使用優(yōu)化算法,找到最佳的系數(shù)。
測(cè)試算法:為了量化回歸的效果,需要觀察錯(cuò)誤率。根據(jù)錯(cuò)誤率決定是否回退到訓(xùn)練階段,通過改變迭代的次數(shù)和步長(zhǎng)等參數(shù)來得到更好的回歸系數(shù)。
使用算法:實(shí)現(xiàn)一個(gè)簡(jiǎn)單的命令行程序來收集馬的癥狀并輸出預(yù)測(cè)結(jié)果。
使用 Logistic 回歸方法進(jìn)行分類所需做的是把測(cè)試集上每個(gè)特征向量乘以最優(yōu)化方法得來的回歸系數(shù),再將該乘積結(jié)果求和,最后輸入到 sigmoid 函數(shù)即可。如果對(duì)應(yīng)的 sigmoid 值大于 0.5 就預(yù)測(cè)類別標(biāo)簽為 1,否則為 0。程序清單 5-5:Logistic 回歸分類函數(shù)
# 以回歸系數(shù)和特征向量作為輸入來計(jì)算對(duì)應(yīng)的 sigmoid 值 def classifyVector(inX, weights): prob = sigmoid(sum(inX*weights)) if prob > 0.5: return 1.0 else: return 0.0 # 打開測(cè)試集和訓(xùn)練集,并對(duì)數(shù)據(jù)進(jìn)行格式化處理 def colicTest(): frTrain = open("horseColicTraining.txt") frTest = open("horseColicTest.txt") trainingSet = [] trainingLabels = [] for line in frTrain.readlines(): currLine = line.strip().split(" ") lineArr = [] for i in range(21): lineArr.append(float(currLine[i])) trainingSet.append(lineArr) trainingLabels.append(float(currLine[21])) # 計(jì)算回歸系數(shù)向量 trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 500) errorCount = 0 numTestVec = 0.0 # 導(dǎo)入測(cè)試集并計(jì)算分類錯(cuò)誤率 for line in frTest.readlines(): numTestVec += 1.0 currLine = line.strip().split(" ") lineArr = [] for i in range(21): lineArr.append(float(currLine[i])) if int(classifyVector(array(lineArr), trainWeights)) !=int(currLine[21]): errorCount += 1 errorRate = (float(errorCount) / numTestVec) print("這個(gè)測(cè)試集的錯(cuò)誤率是:%f" % errorRate) return errorRate def multiTest(): numTests = 10 errorSum = 0.0 for k in range(numTests): errorSum += colicTest() print("經(jīng)過 %d 次迭代后平均錯(cuò)誤率是:%f" % (numTests, errorSum/float(numTests)))
在 python 提示符下,執(zhí)行代碼并得到結(jié)果:
>>> importlib.reload(logRegres)>>> logRegres.multiTest() 這個(gè)測(cè)試集的錯(cuò)誤率是:0.358209 這個(gè)測(cè)試集的錯(cuò)誤率是:0.373134 這個(gè)測(cè)試集的錯(cuò)誤率是:0.253731 這個(gè)測(cè)試集的錯(cuò)誤率是:0.402985 這個(gè)測(cè)試集的錯(cuò)誤率是:0.358209 這個(gè)測(cè)試集的錯(cuò)誤率是:0.298507 這個(gè)測(cè)試集的錯(cuò)誤率是:0.343284 這個(gè)測(cè)試集的錯(cuò)誤率是:0.298507 這個(gè)測(cè)試集的錯(cuò)誤率是:0.402985 這個(gè)測(cè)試集的錯(cuò)誤率是:0.417910 經(jīng)過 10 次迭代后平均錯(cuò)誤率是:0.350746
Logistic 回歸的目的是尋找一個(gè)非線性函數(shù) sigmoid 的最佳擬合參數(shù),求解過程可以由最優(yōu)化算法來完成。
不足之處,歡迎指正。
$$$$
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42338.html
摘要:本篇內(nèi)容為機(jī)器學(xué)習(xí)實(shí)戰(zhàn)第章支持向量機(jī)部分程序清單。支持向量機(jī)優(yōu)點(diǎn)泛化錯(cuò)誤率低,計(jì)算開銷不大,結(jié)果易解釋。注以上給出的僅是簡(jiǎn)化版算法的實(shí)現(xiàn),關(guān)于完整的算法加速優(yōu)化并應(yīng)用核函數(shù),請(qǐng)參照機(jī)器學(xué)習(xí)實(shí)戰(zhàn)第頁(yè)。 本篇內(nèi)容為《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》第 6 章 支持向量機(jī)部分程序清單。所用代碼為 python3。 支持向量機(jī)優(yōu)點(diǎn):泛化錯(cuò)誤率低,計(jì)算開銷不大,結(jié)果易解釋。 缺點(diǎn):對(duì)參數(shù)調(diào)節(jié)和核函數(shù)的選擇敏感,...
摘要:本篇內(nèi)容為機(jī)器學(xué)習(xí)實(shí)戰(zhàn)第章決策樹部分程序清單。適用數(shù)據(jù)類型數(shù)值型和標(biāo)稱型在構(gòu)造決策樹時(shí),我們需要解決的第一個(gè)問題就是,當(dāng)前數(shù)據(jù)集上哪個(gè)特征在劃分?jǐn)?shù)據(jù)分類時(shí)起決定性作用。下面我們會(huì)介紹如何將上述實(shí)現(xiàn)的函數(shù)功能放在一起,構(gòu)建決策樹。 本篇內(nèi)容為《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》第 3 章決策樹部分程序清單。所用代碼為 python3。 決策樹優(yōu)點(diǎn):計(jì)算復(fù)雜度不高,輸出結(jié)果易于理解,對(duì)中間值的缺失不敏感,可...
閱讀 2010·2021-11-22 14:45
閱讀 2640·2021-10-12 10:11
閱讀 791·2021-09-22 10:02
閱讀 1292·2019-08-30 15:55
閱讀 1178·2019-08-30 15:54
閱讀 3288·2019-08-30 15:54
閱讀 1223·2019-08-29 17:16
閱讀 3113·2019-08-28 17:55