回歸:連續值預測
邏輯回歸:分類算法。–邏輯回歸是干什么?
定義:對定性變量的回歸分析;
定性:
定量:
之前的回歸模型,處理的是因變量是數值型區間(負無窮到正無窮)變量,建立的模型描述的是因變量Y與自變量(X)之間的線性關系。
期望=期望參數與自變量的分別乘積和;
邏輯變換的公式:要記住
注:結果是對稱的,一般情況是0.5;如果結果不是對稱的,一般情況不是0.5
使用最小二乘法求:上面的函數服從正態分布,然后倒過來推。
對數似然函數為:
lnL=****
他是一個凸函數(相當於四個角的吊床)
g()是1/(1 + e^(-z))
第一個是批量;第二個是隨機。----接下來寫程序。
作業:
DOU是每個客戶月均流量消費額,單位MB
MOU(minutes of usage)。平均每戶每月通話時間(average communication time per one month per one user) 電信行業的一個衡量指標,單位:分鍾
代碼:
import numpy as np def sigmoid(x): return 1/(1+np.exp(-x)) def weights(x_train, y_train): # 獲取權重
# 初始化參數
theta = np.random.rand(3) # 生成n個隨機數
# 學習率
alpha = 0.001
# 迭代次數
cnt = 0 # 最大迭代次數
max_cnt = 50000
# 誤差
# error0=error1=1
# 指定一個閾值,用於檢查兩次誤差的差,以便停止迭代
threshold = 0.01 m,n = x_train.shape while cnt <= max_cnt: cnt += 1 diff = np.full(n, 0) # 梯度的初始值三個零
for i in range(m): # diff=(y_train-1/(1+np.exp(-theta.T@x_train.T)))@x_train).T #@是矩陣點乘,批量梯度下降
diff = ((y_train[i]-sigmoid(theta.T@x_train[i])) * x_train[i]).T # 外面的.T是表示所有的梯度去求解
print(diff) theta = theta+alpha*diff if (abs(diff) < threshold).all(): break
return theta def predict(x_test,weights): if sigmoid(weights.T@x_test)>0.5: return 1
else: return 0 if __name__ == "__main__": x_train = np.array([[1, 2.697, 6.254], [1, 1.872, 2.014], [1, 2.312, 0.812], [1, 1.983, 4.990], [1, 0.932, 3.920], [1, 1.321, 5.583], [1, 2.215, 1.560], [1, 1.659, 2.932], [1, 0.865, 7.316], [1, 1.685, 4.763], [1, 1.786, 2.523]]) y_train = np.array([1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1]) weights=weights(x_train, y_train) print(predict([1, 1.786, 2.523],weights)) ························································· 輸出: [0.0003332 0.00089864 0.00208383] [0.00033319 0.00089862 0.00208379] 1
最大迭代次數為5000的時候,預測結果為0,結果不理想:可能有幾種情況。
1)weihts權重沒有迭代到最理想的狀態;
2)數據異常(收斂異常)
3)激活函數選取不理想(收斂不理想)
sklearn中也提供了這個包,如何使用?
# -*- coding: utf-8 -*-
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split import numpy as np dataset=np.loadtxt("C:/Users/yanruyu/Documents/code/python/GA/dataset.txt",delimiter=',') x_train,x_test,y_train,y_test=train_test_split(dataset[:,0:-1],dataset[:,-1],test_size=0.3) model=LogisticRegression(penalty="l2") #加入正則化參數,效率會提高很多。
model.fit(x_train,y_train) print(y_test==model.predict(x_text)) 輸出: [False True True True]
可以用線性模型中SGD分類模型試一下,不過要調參。
回歸:連續值預測
邏輯回歸:分類算法。–邏輯回歸是干什么?
定義:對定性變量的回歸分析;
定性:
定量:
之前的回歸模型,處理的是因變量是數值型區間(負無窮到正無窮)變量,建立的模型描述的是因變量Y與自變量(X)之間的線性關系。