寫程式學ML:Logistic迴歸演算法原理及實現(三)
2.2 利用Logistic演算法預測病馬死亡率
由於採集資料是諸多原因,採集的資料有可能不完整。但有時候資料相當昂貴,扔掉和重新獲取都是不可取的,所以必須採用一些方法來解決這個問題。
處理資料中缺失值的做法:
1> 使用可用特徵的均值來填補缺失值;
2> 使用特殊值來填補缺失值;
3> 忽略有缺失值的樣本;
4> 使用相似樣本的均值添補缺失值;
5> 使用另外的機器學習演算法預測缺失值;
對於採集到的資料進行預處理,可以使其順利地使用分類演算法。在預處理階段做兩件事:
第一,所有的缺失值必須用一個實數值來替換,因為我們使用的NumPy資料型別不允許包含缺失值。這裡選擇實數0來替換所有缺失值,恰好能適用於Logistic迴歸。這樣做的直覺在於,我們需要的是一個在更新時不會影響係數的值。迴歸係數的更新公式如下:
weights =weights + alpha * error * dataMatrix[randIndex]
如果dataMatrix的某特徵對應值為0,那麼該特徵的係數將不做更新,即:
weights =weights
另外,由於sigmoid(0) = 0.5,即它對結果的預測不具有任何傾向性,因此上述做法也不會對誤差造成任何影響。基於上述原因,將缺失值用0代替既可以保留現有資料,也不需要對優化演算法進行修改。此外,該資料集中的特徵取值一般不為0,因此在某種意義上說它也滿足“特徵值”這個要求。
第二件事:如果在測試資料集中發現了一條資料的類別標籤已經缺失,那麼我們的簡單做法是將該條資料丟棄。這是因為類別標籤與特徵不同,很難確定採用某個合適的值來替換。採用Logistic迴歸進行分類時這種做法是合理的,而如果採用類似kNN的方法就可能不太可行。
使用Logistic迴歸方法進行分類並不需要做很多工作,所需做的只是把測試集上每個特徵向量乘以最優化方法得來的迴歸係數,再將該乘積結果求和,最後輸入到sigmoid函式中即可。如果對應sigmoid值大於0.5就預測類別標籤為1,否則為0。
對於病馬死亡率的判斷,可以使用前面實現的Logistic迴歸演算法。
首先從訓練樣本檔案中讀取訓練樣本,解析出特徵值和分類情況。
呼叫改進的隨機梯度上升演算法函式stocGradAscent1()產生迴歸係數。
然後從測試樣本檔案中讀取測試樣本,解析出特徵值和分類情況。
呼叫分類函式classifyVector()對測試樣本進行分類,判斷該分類正確情況。
最後返回分類錯誤率。程式中對測試樣本進行了10次測試,求得了平均錯誤率。
程式的具體實現如下:
#使用改進的隨機梯度上升演算法,通過訓練樣本產生迴歸係數;
#利用迴歸係數對測試樣本進行分類,統計分類錯誤率
def colicTest():
frTrain = open('horseColicTraining.txt') #開啟訓練樣本集
frTest = open('horseColicTest.txt') #開啟測試樣本集
trainingSet = [] #儲存所有樣本的特徵值的列表變數
trainingLabels = [] #儲存所有樣本分類資訊的列表變數
#每個樣本中有21個特徵值,儲存在變數trainingSet中;每個樣本的分類資訊儲存在變數trainingLabels中
for line in frTrain.readlines(): #從訓練樣本檔案中逐個取出樣本
currLine = line.strip().split('\t') #去掉行首行末的空格,並用空格分隔,即將22個數值取出存到變數中
lineArr = []
for i in range(21): #將21個特徵值從列表變數currLine中讀取出來,儲存到列表變數lineArr中
lineArr.append(float(currLine[i]))
trainingSet.append(lineArr) #將當前樣本20個特徵值新增到列表trainingSet中
trainingLabels.append(float(currLine[21])) #將當前樣本分類資訊新增到列表trainingLabels中
#呼叫改進的隨機梯度上升演算法對訓練樣本進行500次迭代訓練,產生迴歸係數
trainWeights = Logistic.stocGradAscent1(array(trainingSet), trainingLabels, 500)
errorCount = 0
numTestVec = 0
#使用獲取的迴歸係數,對測試樣本進行分類,判斷分類正確情況
for line in frTest.readlines():
numTestVec += 1.0 #統計測試樣本個數
currLine = line.strip().split('\t') #去掉行首行末的空格,並用空格分隔,即將22個數值取出存到變數中
lineArr = []
for i in range(21): #將21個特徵值從列表變數currLine中讀取出來,儲存到列表變數lineArr中
lineArr.append(float(currLine[i]))
#判斷當前測試樣本的分類情況是否與真實分類一致;如果不一致,錯誤次數加1
if int(Logistic.classifyVector(array(lineArr), trainWeights)) != int(currLine[21]):
errorCount += 1
errorRate = (float(errorCount) / numTestVec) #計算錯誤率
print "the error rate of this test is : %f" % errorRate
return errorRate #返回錯誤率
#多次測試
def multiTest():
numTests = 10
errorSum = 1.0
for k in range(numTests): #統計10次測試的錯誤率,並累加
errorSum += colicTest()
print "after %d iterations the average error rate is: %f" % \
(numTests, errorSum / float(numTests)) #打印出10次平均錯誤率
3、小結
Logistic迴歸的目的是尋找一個非線性函式sigmoid的最佳擬合引數,求解過程可以由最優化演算法來完成。在最優化演算法中,最常用的就是梯度上升演算法,而梯度上升演算法又可以簡化為隨機梯度上升演算法。
隨機梯度上升演算法與梯度上升演算法的效果相當,但佔用更少的計算資源。此外,隨機梯度上升是一個線上演算法,它可以在新資料到來時就完成引數更新,而不需要更新讀取整個資料集來進行批處理運算。
機器學習的一個重要問題是如何處理缺失資料。這個問題沒有標準答案,取決於實際應用中的需求。現有一些解決方案,每種方案都各有優缺點。
本文中涉及的所有code可以訪問如下目錄獲取:
(全文完)相關推薦
寫程式學ML:Logistic迴歸演算法原理及實現(三)
2.2 利用Logistic演算法預測病馬死亡率 由於採集資料是諸多原因,採集的資料有可能不完整。但有時候資料相當昂貴,扔掉和重新獲取都是不可取的,所以必須採用一些方法來解決這個問題。 處理資料中缺失值的做法: 1> 使用可用特徵的均值來填補缺失值; 2&g
寫程式學ML:Logistic迴歸演算法原理及實現(一)
[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 1、Logistic迴歸演算法的原理 假設現在有一些資料點,我們用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個
寫程式學ML:Logistic迴歸演算法原理及實現(二)
2、Logistic迴歸演算法的實現 2.1 Logistic演算法的實現 首先,我們實現梯度上升演算法。 Sigmoid函式的定義如下: #sigmoid函式的實現 def sigmoid(inX): return 1.0 / (1 + exp(-inX))
寫程式學ML:決策樹演算法原理及實現(四)
[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 2.3 決策樹的測試 書中使用隱形眼鏡資料集對決策樹進行了測試。 建立測試檔案contactLenses4Deci
寫程式學ML:樸素貝葉斯演算法原理及實現(一)
[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 1、樸素貝葉斯演算法的原理 樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法。 和決策樹模型相比,樸素貝葉斯
寫程式學ML:樸素貝葉斯演算法原理及實現(二)
[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 2、樸素貝葉斯演算法的實現 2.1 樸素貝葉斯演算法的實現 按照樸素貝葉斯演算法的原理,我們需要實現一個樸素貝葉
機器學習系列(2):logistic迴歸,貝葉斯(bayes)方法
前言:這章主要介紹logistic迴歸和bayes法。兩者都屬分類,前者引入了logistic函式,後者引入了貝葉斯定理,都是比較基礎的數學知識。 但是logistic無需先驗的訓練樣本,後者需要。 貝葉斯法很強大,很多郵件
logistic迴歸演算法原理及python實現
1 logistic迴歸與sigmoid函式 考慮如下線性函式: y=wwTxx+b(1) 輸出y為連續的實值,如何讓輸出成為二值來完成二分類任務?即y∈{0,1},最理想的是單位階躍函式即: y=⎧⎩⎨⎪⎪0,z<00.5,z=01,z>0
Java常用的八種排序演算法與程式碼實現(三):桶排序、計數排序、基數排序
三種線性排序演算法:桶排序、計數排序、基數排序 線性排序演算法(Linear Sort):這些排序演算法的時間複雜度是線性的O(n),是非比較的排序演算法 桶排序(Bucket Sort) 將要排序的資料分到幾個有序的桶裡,每個桶裡的資料再單獨進行排序,桶內排完序之後,再把桶裡的
logistic regression演算法原理及實現
邏輯迴歸所要學習的函式模型為y(x),由x->y,x為樣本,y為目標類別,即總體思想是任意給出一個樣本輸入,模型均能將其正確分類。實際運用中比如有郵箱郵件分類,對於任意一封郵件,經過模型後可將其判別為是否是垃圾郵件。 假如我們知道某類資料的條件概率分佈函
象棋人工智慧演算法的C++實現(三)——注重功能分割槽!!!
前言:上一期部落格我們介紹了相對簡單的士、兵、相、馬的走棋演算法,本期部落格將重點介紹比較複雜的車和炮的走棋演算法。 1.車的走棋演算法 車的走棋規則:沿直線行走。 上canMoveCHE函式的原始碼: bool Board::canMoveCHE(int movei
氣泡排序演算法原理及實現(超詳細)
氣泡排序(Bubble Sort)是排序演算法裡面比較簡單的一個排序。它重複地走訪要排序的數列,一次比較兩個資料元素,如果順序不對則進行交換,並一直重複這樣的走訪操作,直到沒有要交換的資料元素為止。 氣泡排序的原理 為了更深入地理解氣泡排序的操作步驟,我們現在看一下氣泡排序的原理。 首先我們肯定有一個數組
快速排序演算法原理及實現(單軸快速排序、三向切分快速排序、雙軸快速排序)
歡迎探討,如有錯誤敬請指正 1. 單軸快速排序的基本原理 快速排序的基本思想就是從一個數組中任意挑選一個元素(通常來說會選擇最左邊的元素)作為中軸元素,將剩下的元素以中軸元素作為比較的標準,將小於等於中軸元素的放到中軸元素的左邊,將大於中軸元素的放到中軸元素的右邊,然後以當前中軸元素的位置為界,將左半部分子
K近鄰演算法理解及實現(python)
KNN的工作原理:給定一個已知標籤類別的訓練資料集,輸入沒有標籤的新資料後,在訓練資料集中找到與新資料最鄰 近的k個例項,如果這k個例項的多數屬於某個類別,那麼新資料就屬於這個類別。可以簡單理解為:由那些離X最 近的k個點來投票決定X歸為哪一類。 在二維平面下:  
用C++實現連連看程式碼原理及解析(三)——消除演算法
C++連連看消除程式碼的實現,過程比較複雜。 【加入我們的學習群(C/C++群:892643663;Java群:957907127),大牛線上為您提供服務,還有免費編譯大禮包和視訊教程贈送哦】 以下是程式碼: #include<iostream> #include&l
knn演算法原理與實現(1)
一、演算法原理與模型 knn演算法即最近鄰演算法,其原理非常簡單即根據給定的資料集,計算資料集中點的特徵到待分類資料的歐氏距離,然後選擇距離最近的k個作為判斷依據,這k個數據中出現類別最多的作為新輸入資料的label。模型用公式表示如下: 二、python程式碼實現
機器學習演算法原理與實踐(三)、卡爾曼濾波器演算法淺析及matlab實戰
卡爾曼濾波器是一種利用線性系統狀態方程,通過系統輸入輸出觀測資料,對系統狀態進行最優估計的演算法。而且由於觀測包含系統的噪聲和干擾的影響,所以最優估計也可看做是濾波過程。 卡爾曼濾波器的核心
Apriori演算法簡介及實現(python)
Apriori這個詞的意思是“先驗的”,從priori這個詞根可以猜出來~;) 。該演算法用於從資料中挖掘頻繁項資料集以及關聯規則。其核心原理是基於這樣一類“先驗知識”: 如果一個數據項在資料庫中是頻繁出現的,那麼該資料項的子集在資料庫中也應該是頻繁出現的(命題1)
機器學習之logistic迴歸演算法與程式碼實現
Logistic迴歸演算法與程式
機器學習演算法的Python實現 (1):logistics迴歸 與 線性判別分析(LDA)
本文為筆者在學習周志華老師的機器學習教材後,寫的課後習題的的程式設計題。之前放在答案的博文中,現在重新進行整理,將需要實現程式碼的部分單獨拿出來,慢慢積累。希望能寫一個機器學習演算法實現的系列。 本文主要包括: 1、logistics迴歸 2、線性判別分析(LDA) 使