本文目錄一覽:
- 1、在邏輯回歸中,odds ratio怎麼用python計算?
- 2、python邏輯回歸結果怎麼看
- 3、怎麼看python中邏輯回歸輸出的解釋
- 4、python做邏輯回歸 怎麼把導入的數據分成x,y
- 5、Logistic函數(sigmoid函數)
- 6、python 訓練完邏輯回歸模型後如何看權重
在邏輯回歸中,odds ratio怎麼用python計算?
實際上完成邏輯回歸是相當簡單的,首先指定要預測變量的列,接着指定模型用於做預測的列,剩下的就由算法包去完成了。
本例中要預測的是admin列,使用到gre、gpa和虛擬變量prestige_2、prestige_3、prestige_4。prestige_1作為基準,所以排除掉,以防止多元共線性(multicollinearity)和引入分類變量的所有虛擬變量值所導致的陷阱(dummy variable trap)。
程序縮進如圖所示
python邏輯回歸結果怎麼看
假設預測目標為0和1 數據中1的個數為a,預測1的次數為b,預測1命中的次數為c 準確率 precision = c / b 召回率 recall = c / a f1_score = 2 * precision * recall / (precision + recall)
怎麼看python中邏輯回歸輸出的解釋
以下為python代碼,由於訓練數據比較少,這邊使用了批處理梯度下降法,沒有使用增量梯度下降法。
##author:lijiayan##data:2016/10/27
##name:logReg.pyfrom numpy import *import matplotlib.pyplot as pltdef loadData(filename):
data = loadtxt(filename)
m,n = data.shape print ‘the number of examples:’,m print ‘the number of features:’,n-1 x = data[:,0:n-1]
y = data[:,n-1:n] return x,y#the sigmoid functiondef sigmoid(z): return 1.0 / (1 + exp(-z))#the cost functiondef costfunction(y,h):
y = array(y)
h = array(h)
J = sum(y*log(h))+sum((1-y)*log(1-h)) return J# the batch gradient descent algrithmdef gradescent(x,y):
m,n = shape(x) #m: number of training example; n: number of features x = c_[ones(m),x] #add x0 x = mat(x) # to matrix y = mat(y)
a = 0.0000025 # learning rate maxcycle = 4000 theta = zeros((n+1,1)) #initial theta J = [] for i in range(maxcycle):
h = sigmoid(x*theta)
theta = theta + a * (x.T)*(y-h)
cost = costfunction(y,h)
J.append(cost)
plt.plot(J)
plt.show() return theta,cost#the stochastic gradient descent (m should be large,if you want the result is good)def stocGraddescent(x,y):
m,n = shape(x) #m: number of training example; n: number of features x = c_[ones(m),x] #add x0 x = mat(x) # to matrix y = mat(y)
a = 0.01 # learning rate theta = ones((n+1,1)) #initial theta J = [] for i in range(m):
h = sigmoid(x[i]*theta)
theta = theta + a * x[i].transpose()*(y[i]-h)
cost = costfunction(y,h)
J.append(cost)
plt.plot(J)
plt.show() return theta,cost#plot the decision boundarydef plotbestfit(x,y,theta):
plt.plot(x[:,0:1][where(y==1)],x[:,1:2][where(y==1)],’ro’)
plt.plot(x[:,0:1][where(y!=1)],x[:,1:2][where(y!=1)],’bx’)
x1= arange(-4,4,0.1)
x2 =(-float(theta[0])-float(theta[1])*x1) /float(theta[2])
plt.plot(x1,x2)
plt.xlabel(‘x1’)
plt.ylabel((‘x2’))
plt.show()def classifyVector(inX,theta):
prob = sigmoid((inX*theta).sum(1)) return where(prob = 0.5, 1, 0)def accuracy(x, y, theta):
m = shape(y)[0]
x = c_[ones(m),x]
y_p = classifyVector(x,theta)
accuracy = sum(y_p==y)/float(m) return accuracy
調用上面代碼:
from logReg import *
x,y = loadData(“horseColicTraining.txt”)
theta,cost = gradescent(x,y)print ‘J:’,cost
ac_train = accuracy(x, y, theta)print ‘accuracy of the training examples:’, ac_train
x_test,y_test = loadData(‘horseColicTest.txt’)
ac_test = accuracy(x_test, y_test, theta)print ‘accuracy of the test examples:’, ac_test
學習速率=0.0000025,迭代次數=4000時的結果:
似然函數走勢(J = sum(y*log(h))+sum((1-y)*log(1-h))),似然函數是求最大值,一般是要穩定了才算最好。
下圖為計算結果,可以看到訓練集的準確率為73%,測試集的準確率為78%。
這個時候,我去看了一下數據集,發現沒個特徵的數量級不一致,於是我想到要進行歸一化處理:
歸一化處理句修改列loadData(filename)函數:
def loadData(filename):
data = loadtxt(filename)
m,n = data.shape print ‘the number of examples:’,m print ‘the number of features:’,n-1 x = data[:,0:n-1]
max = x.max(0)
min = x.min(0)
x = (x – min)/((max-min)*1.0) #scaling y = data[:,n-1:n] return x,y
在沒有歸一化的時候,我的學習速率取了0.0000025(加大就會震蕩,因為有些特徵的值很大,學習速率取的稍大,波動就很大),由於學習速率小,迭代了4000次也沒有完全穩定。現在當把特徵歸一化後(所有特徵的值都在0~1之間),這樣學習速率可以加大,迭代次數就可以大大減少,以下是學習速率=0.005,迭代次數=500的結果:
此時的訓練集的準確率為72%,測試集的準確率為73%
從上面這個例子,我們可以看到對特徵進行歸一化操作的重要性。
python做邏輯回歸 怎麼把導入的數據分成x,y
簡介
本例子是通過對一組邏輯回歸映射進行輸出,使得網絡的權重和偏置達到最理想狀態,最後再進行預測。其中,使用GD算法對參數進行更新,損耗函數採取交叉商來表示,一共訓練10000次。
2.python代碼
#!/usr/bin/python
import numpy
import theano
import theano.tensor as T
rng=numpy.random
N=400
feats=784
# D[0]:generate rand numbers of size N,element between (0,1)
# D[1]:generate rand int number of size N,0 or 1
D=(rng.randn(N,feats),rng.randint(size=N,low=0,high=2))
training_steps=10000
# declare symbolic variables
x=T.matrix(‘x’)
y=T.vector(‘y’)
w=theano.shared(rng.randn(feats),name=’w’) # w is shared for every input
b=theano.shared(0.,name=’b’) # b is shared too.
print(‘Initial model:’)
print(w.get_value())
print(b.get_value())
# construct theano expressions,symbolic
p_1=1/(1+T.exp(-T.dot(x,w)-b)) # sigmoid function,probability of target being 1
prediction=p_10.5
xent=-y*T.log(p_1)-(1-y)*T.log(1-p_1) # cross entropy
cost=xent.mean()+0.01*(w**2).sum() # cost function to update parameters
gw,gb=T.grad(cost,[w,b]) # stochastic gradient descending algorithm
#compile
train=theano.function(inputs=[x,y],outputs=[prediction,xent],updates=((w,w-0.1*gw),(b,b-0.1*gb)))
predict=theano.function(inputs=[x],outputs=prediction)
# train
for i in range(training_steps):
pred,err=train(D[0],D[1])
print(‘Final model:’)
print(w.get_value())
print(b.get_value())
print(‘target values for D:’)
print(D[1])
print(‘prediction on D:’)
print(predict(D[0]))
print(‘newly generated data for test:’)
test_input=rng.randn(30,feats)
print(‘result:’)
print(predict(test_input))
3.程序解讀
如上面所示,首先導入所需的庫,theano是一個用於科學計算的庫。然後這裡我們隨機產生一個輸入矩陣,大小為400*784的隨機數,隨機產生一個輸出向量大小為400,輸出向量為二值的。因此,稱為邏輯回歸。
然後初始化權重和偏置,它們均為共享變量(shared),其中權重初始化為較小的數,偏置初始化為0,並且打印它們。
這裡我們只構建一層網絡結構,使用的激活函數為logistic sigmoid function,對輸入量乘以權重並考慮偏置以後就可以算出輸入的激活值,該值在(0,1)之間,以0.5為界限進行二值化,然後算出交叉商和損耗函數,其中交叉商是代表了我們的激活值與實際理論值的偏離程度。接着我們使用cost分別對w,b進行求解偏導,以上均為符號表達式運算。
接着我們使用theano.function進行編譯優化,提高計算效率。得到train函數和predict函數,分別進行訓練和預測。
接着,我們對數據進行10000次的訓練,每次訓練都會按照GD算法進行更新參數,最後我們得到了想要的模型,產生一組新的輸入,即可進行預測。
Logistic函數(sigmoid函數)
Logistic函數的表示形式如下:
它的函數圖像如下,由於函數圖像很像一個“S”型,所以該函數又叫 sigmoid 函數。
滿足的性質:
1.對稱性,關於(0,0.5)中心對稱
2.邏輯斯諦方程即微分方程
最早logistic函數是皮埃爾·弗朗索瓦·韋呂勒在1844或1845年在研究它與人口增長的關係時命名的。廣義Logistic曲線可以模仿一些情況人口增長( P )的 S 形曲線。起初階段大致是 指數增長 ;然後隨着開始變得飽和,增加變慢;最後,達到成熟時增加停止。
當一個物種遷入到一個新生態系統中後,其數量會發生變化。假設該物種的起始數量小於環境的最大容納量,則數量會增長。該物種在此生態系統中有天敵、食物、空間等資源也不足(非理想環境),則增長函數滿足邏輯斯諦方程,圖像呈S形,此方程是描述在資源有限的條件下種群增長規律的一個最佳數學模型。在以下內容中將具體介紹邏輯斯諦方程的原理、生態學意義及其應用。
Logistic regression (邏輯回歸)是當前業界比較常用的機器學習方法,用於估計某種事物的可能性。之前在經典之作《數學之美》中也看到了它用於廣告預測,也就是根據某廣告被用戶點擊的可能性,把最可能被用戶點擊的廣告擺在用戶能看到的地方,然後叫他“你點我啊!”用戶點了,你就有錢收了。這就是為什麼我們的電腦現在廣告泛濫的原因了。
還有類似的某用戶購買某商品的可能性,某病人患有某種疾病的可能性啊等等。這個世界是隨機的(當然了,人為的確定性系統除外,但也有可能有噪聲或產生錯誤的結果,只是這個錯誤發生的可能性太小了,小到千萬年不遇,小到忽略不計而已),所以萬物的發生都可以用可能性或者幾率(Odds)來表達。“幾率”指的是某事物發生的可能性與不發生的可能性的比值。
Logistic regression可以用來回歸,也可以用來分類,主要是二分類。它不像SVM直接給出一個分類的結果,Logistic Regression給出的是這個樣本屬於正類或者負類的可能性是多少,當然在多分類的系統中給出的是屬於不同類別的可能性,進而通過可能性來分類。
假設我們的樣本是{ x , y},y是0或者1,表示正類或者負類, x 是我們的m維的樣本特徵向量。那麼這個樣本 x 屬於正類,也就是y=1的“概率”可以通過下面的邏輯函數來表示:
這裡的 θ 是模型參數,也就是回歸係數,σ是sigmoid函數。這樣y=0的“概率”就是:
考查邏輯斯蒂回歸模型的特點,一個事件的幾率(oods)是指這件事發生的概率與不發生概率的比值,如果事件發生的概率是p,那麼該事件的幾率是p/(1-p),該事件的對數幾率(log odds)或者logit函數是
對於邏輯斯蒂回歸而言,可以得到如下的對數幾率
這就是說,在邏輯斯蒂回歸模型中,輸出y=1的對數幾率是輸入x的線性函數,或者說,輸出y=1的對數幾率是由輸入x的線性函數表示的模型,即邏輯斯蒂回歸模型。換句話說,y就是我們的關係變量,例如她喜不喜歡你,與多個因素有關,比如你的人品,你的長相,你是否有錢等。我們把這些因素表示成變量x 1 , x 2 ,…, x m ,那麼這個女生是怎麼考慮這些因素的呢,每個人心理其實都有一桿秤,例如有人比較看重你的人品,人品的權重是0.8,;也有人比較看重你有錢,有錢的權重設置成0.7等等。我們把這些對應於x 1 , x 2 ,…, x m 的權值叫做回歸係數,表達為θ 1 , θ 2 ,…, θ m 。他們的加權和就是你在心目中的得分。
在參數學習時,可以用極大似然估計方法求解。假設我們有n個獨立的訓練樣本{( x 1 , y 1 ) ,( x 2 , y 2 ),…, ( x n , y n )},y={0, 1}。那每一個觀察到的樣本( x i , y i )出現的概率是
對於整個樣本集,每個樣本的出現都是獨立的,n個樣本出現的似然函數為(n個樣本的出現概率是他們各自的概率乘積)
那麼上述的似然函數就是模型的代價函數(cost function),我們要求的參數就是θ*。我們稍微對上式進行轉換
對L(θ)的極大值,得到θ的估計值。問題變成了以對數似然函數為木匾函數的最優化問題。用L(θ)對θ求導,得到
無法解析求解的,所以一般使用迭代的方法求解,通常採用梯度下降法和擬牛頓法。
上面介紹的是兒分類的模型,用於二類分類。可以將其推廣為多項邏輯斯蒂回歸模型(multi-nominal regression model),用於多分類,假設離散隨機變量Y的取值是{1,2,3,…,K}那麼多項邏輯斯蒂回歸的模型是
同理,二項邏輯斯蒂回歸的參數估計的方法也可以推廣到多項邏輯斯蒂回歸。
[1]. 機器學習算法與Python實踐之(七)邏輯回歸(Logistic Regression)
[2].《統計學習方法》 李航 著
python 訓練完邏輯回歸模型後如何看權重
用的什麼包,sklearn嗎?如果是sklearn的話,邏輯回歸的estimator自帶coef_屬性查看權重
from sklearn.linear_model import LogisticRegression
# 其他準備工作
def train():
lr = LogisticRegression()
lr.fit(x_train, y_train)
print(“得出來的權重:”, lr.coef_)
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/154396.html