2.系統學習-邏輯回歸

邏輯回歸

  • 前言
  • 最大似然估計
    • 概率
    • 似然函數(likelihood function)
    • 最大似然估計
  • 邏輯回歸
    • 邏輯回歸的似然函數與梯度
  • 分類問題常用評價指標
  • 項目案例
  • 拓展內容
  • 作業

前言

邏輯回歸與線性回歸均屬于廣義線性模型,區別在于線性回歸用于解決回歸問題,例如身高、銷量等連續變量預測,邏輯回歸用于二分類問題,例如判斷是否為垃圾郵件,客戶是否會點擊廣告。本章我們將首先了解最大似然估計,一步步推導出邏輯回歸模型,最大似然估計廣泛用于各類機?學習、深度學習,需要認真理解。接著會以實際案例,講解非結構化數據處理的基礎方法,分類問題建模流程。
學習目標:

  • List item
  • 最大似然估計
  • 邏輯回歸模型
  • 常用的分類問題評價指標
  • 基礎數據處理&分類問題建模
  • 獨自完成?aggle Titanic競賽首次提交,得分需要高于0.75鏈接: Titanic Machine Learning from Disaster

最大似然估計

概率

硬幣有正反兩面,如果硬幣正反兩面是均勻的,即每次拋擲后硬幣為正的概率是0.5。使用這個硬幣,很可能拋10次,有5次是正面。但是假如有人對硬幣做了手腳,比如提前對硬幣做了修改,硬幣正面朝上概率大幅度提升了,你拿到硬幣在嘗試拋了10次,結果8次都是正面,如何估算下次硬幣為正的概率呢?
P ( 8 正 2 反 ∣ θ ) = C 10 2 ( 1 ? θ ) 2 ? θ 8 P(8正2反|\theta) = C_{10}^2(1 - \theta)^2 \cdot \theta^8 P(82θ)=C102?(1?θ)2?θ8

import numpy as np 
print(f"theta = 0.6,  概率為{10*9/2 * np.power(10.6, 2) * np.power(0.6, 8):.3}") 
print(f"theta = 0.7,  概率為{10*9/2 * np.power(10.7, 2) * np.power(0.7, 8):.3}") 
print(f"theta = 0.8,  概率為{10*9/2 * np.power(10.8, 2) * np.power(0.8, 8):.3}") 

theta = 0.6, 概率為0.121
theta = 0.7, 概率為0.233
theta = 0.8, 概率為0.302
可以看出,我們假設硬幣朝正面參數為0.8的時候,出現8正2反情況的概率最大。我們有理由相信,0.8是候選的3個參數中的最接近真實概率的選項。

似然函數(likelihood function)

在上面的嘗試中,0.8似乎是一個不錯的猜測沒,,但是否可能是0.81或者0.79呢,我們當然可以按照上面的方法再次計算概率,但是問題是我們無法遍歷整個空間。因此我們需要定義一個函數來表示不同的參數 下,表示多個獨立事件θ (x1, x2,…,xn)發生的整體概率,這個函數我們叫它似然函數( likelihood function, 通常用L表),其中組合數部分是常數,我們可以直接忽略。 L ( x 1 , x 2 , … , x n ∣ θ ) = ∏ i = 1 n p ( x i ∣ θ ) L(x_1, x_2, \dots, x_n|\theta) = \prod_{i=1}^{n} p(x_i|\theta) L(x1?,x2?,,xn?θ)=i=1n?p(xi?θ)
似然函數通常用L表示,觀察到拋硬幣“8正2反”的事實,硬幣參數 取不同值時,似然函數表示為: L ( 8 正 2 反 ∣ θ ) = ( 1 ? θ ) 2 ? θ 8 L(8正2反|\theta) = (1 - \theta)^2 \cdot \theta^8 L(82θ)=(1?θ)2?θ8

通過似然函數,我們只要能找到使得似然函數最大(多個獨立事件發生的整體概率最大化),就可以完成對硬幣參數的估計了,這就是最大似然估計:
θ ^ = arg ? max ? θ ∏ i = 1 n p ( x i ∣ θ ) \hat{\theta} = \arg\max_{\theta} \prod_{i=1}^{n} p(x_i|\theta) θ^=argθmax?i=1n?p(xi?θ)

最大似然估計

通常,由于似然函數為連乘,會造成小數位過高,無法有效表示,我們采用對數似然函數進行表示,把連乘轉化為累加形式: l ( x 1 , x 2 , … , x n ∣ θ ) = ∑ i = 1 n log ? p ( x i ∣ θ ) l(x_1, x_2, \dots, x_n|\theta) = \sum_{i=1}^{n} \log p(x_i|\theta) l(x1?,x2?,,xn?θ)=i=1n?logp(xi?θ)
θ ^ = arg ? max ? θ ∑ i = 1 n log ? p ( x i ∣ θ ) \hat{\theta} = \arg\max_{\theta} \sum_{i=1}^{n} \log p(x_i|\theta) θ^=argθmax?i=1n?logp(xi?θ)

邏輯回歸

邏輯回歸是線性分類模型,說線性是因為其決策邊界是線性的(平面或超平面),模型輸出值域為(0,1),通常我們將輸出結果視為屬于正樣(y = 1)的概率。我們先來看一下邏輯回歸模型的數學表示: P ( x ) = σ ( w T x ) = 1 1 + exp ? ? w T x P(x) = \sigma(w^T x) = \frac{1}{1 + \exp^{-w^T x}} P(x)=σ(wTx)=1+exp?wTx1?
在這里插入圖片描述

import numpy as np 
import matplotlib.pyplot as plt 
%matplotlib inline 
def sigmoid(x): return 1 / (1 + np.exp(-x)) 
data = np.arange(-10, 10, 0.1) 
plt.plot(data, sigmoid(data)) 

在這里插入圖片描述

邏輯回歸的似然函數與梯度

tips: 本段包含了不少公式計算,但公式本身的推導細節并不是最重要的,最重要的是通過引入似然函數,我們構造了邏輯回歸的損失函數,且該損失函數可以利用梯度下降進行優化。
在這里插入圖片描述
p ( y = y i ∣ x i ) = p ( x i ) y i ( 1 ? p ( x i ) ) 1 ? y i p(y = y^i | x^i) = p(x^i)^{y^i}(1 - p(x^i))^{1-y^i} p(y=yixi)=p(xi)yi(1?p(xi))1?yi
在這里插入圖片描述
Likelihood = ∏ i p ( y = y i ∣ x i ) = ∏ i p ( x i ) y i ( 1 ? p ( x i ) ) 1 ? y i \text{Likelihood} = \prod_i p(y = y^i | x^i) = \prod_i p(x^i)^{y^i} (1 - p(x^i))^{1-y^i} Likelihood=i?p(y=yixi)=i?p(xi)yi(1?p(xi))1?yi
兩邊同時取對數,對數似然函數為:
loglikelihood = ∑ i [ y i log ? p ( x i ) + ( 1 ? y i ) log ? ( 1 ? p ( x i ) ) ] \text{loglikelihood} = \sum_i \left[y^i \log p(x^i) + (1 - y^i) \log (1 - p(x^i))\right] loglikelihood=i?[yilogp(xi)+(1?yi)log(1?p(xi))]
loglikelihood = ∑ i [ y i log ? p ( x i ) 1 ? p ( x i ) + log ? ( 1 ? p ( x i ) ) ] \text{loglikelihood} = \sum_i \left[y^i \log \frac{p(x^i)}{1 - p(x^i)} + \log (1 - p(x^i))\right] loglikelihood=i?[yilog1?p(xi)p(xi)?+log(1?p(xi))]
那么這個對數似然函數就是我們需要優化的目標的,其值越大越好,越大說明模型預測概率和真實發生概率一致性越高。由于梯度下降法是驗證最小化損失函數目標進行的,因此我們對對數似然函數乘以?1。
J ( w ) = ? ∑ i [ y i log ? p ( x i ) 1 ? p ( x i ) + log ? ( 1 ? p ( x i ) ) ] J(w) = -\sum_i \left[y^i \log \frac{p(x^i)}{1 - p(x^i)} + \log (1 - p(x^i))\right] J(w)=?i?[yilog1?p(xi)p(xi)?+log(1?p(xi))]
求關于參數的梯度,根據求導法則可得:
g = ? J ? w = ∑ i ( p ( x i ) ? y i ) ? x i g = \frac{\partial J}{\partial w} = \sum_i \left(p(x^i) - y^i\right) \cdot x^i g=?w?J?=i?(p(xi)?yi)?xi

有了梯度,根據上節課我們學習的梯度下降,就可以根據學習率α逐步迭代更新模型參數 w = w ? α ? g w = w - \alpha \cdot g w=w?α?g

分類問題常用評價指標

在二分類場景,模型所有的預測結果可以分為四類:

  1. TP(True positive),意思是模型預測為正樣本(Positive),預測是正確的(True)
  2. FP(False positive),意思是模型預測為正樣本(Positive),預測是錯誤的(False)
  3. TN(True negtive),意思是模型預測為負樣本(negtive),預測是正確的(True)
  4. FN(False negtive),意思是模型預測為負樣本(negtive),預測是錯誤的(False)
    基于以上四類預測結果,我們可以定義指標:
指標公式含義
準確率 Accuracy = # T P + # T N # A L L \text{Accuracy} = \frac{\#TP + \#TN}{\#ALL} Accuracy=#ALL#TP+#TN?所有預測結果中,預測正確的比例,值越大說明模型表現越好。
精準率 Precision = # T P # T P + # F P \text{Precision} = \frac{\#TP}{\#TP + \#FP} Precision=#TP+#FP#TP?所有預測的正樣本中,正確的比例,值越大說明模型表現越好。
召回率 Recall = # T P # T P + # F N \text{Recall} = \frac{\#TP}{\#TP + \#FN} Recall=#TP+#FN#TP?所有正樣本被正確預測的比例,值越大說明模型表現越好。
from sklearn.metrics import accuracy_score, precision_score, recall_score 
y_true = [1, 1, 0, 1, 0] 
y_pred = [0, 1, 0, 1, 0]
accuracy_score(y_true, y_pred)#0.8
precision_score(y_true, y_pred)#1.0
recall_score(y_true, y_pred)#0.6666666666666666

在一些極端場景下,準確率會失效,比如正負樣本及其不均勻的情況:

y_true = [1, 1, 1, 1, 1, 0] 
y_pred = [1, 1, 1, 1, 1, 1] 
accuracy_score(y_true, y_pred) #0.8333333333333334

不過什么輸入,模型都預測為正樣本,導致模型本質上沒有預測能力,但是依然能夠取得很高的Accuracy。為了避免評估指標失效,我們可以同時查看precision 和 recall指標

precision_score(y_true, y_pred) #0.8333333333333334
recall_score(y_true, y_pred) # 1.0

也可以應用一個由recall,precision 一起組成的復合指標 f1?score,該值越大,說明模型表現越好:
f 1 = 2 ? recall ? precision recall + precision f1 = \frac{2 \cdot \text{recall} \cdot \text{precision}}{\text{recall} + \text{precision}} f1=recall+precision2?recall?precision?

 from sklearn.metrics import f1_scoref1_score(y_true, y_pred) # 0.9090909090909091
p = precision_score(y_true, y_pred) 
r = recall_score(y_true, y_pred) 2 * p * r / (p + r) #0.9090909090909091

項目案例

鏈接: Titanic Machine Learning from Disaster

# 導入所需的庫
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import re 
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler, PolynomialFeatures, OneHotEncoder
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
%matplotlib inline # 讀取 Titanic 數據集
train = pd.read_csv("./titanic/train.csv")  # 訓練數據
test = pd.read_csv("./titanic/test.csv")    # 測試數據
submission = pd.read_csv("./titanic/gender_submission.csv")  # 示例提交文件# 數據概覽
print(train.head())  # 查看訓練數據的前幾行
print(test.head())   # 查看測試數據的前幾行
print(train.isnull().sum())  # 檢查訓練數據的缺失值# 填充缺失值
# 用中位數填充缺失的年齡數據
train['Age'] = train['Age'].fillna(train['Age'].median())
test['Age'] = test['Age'].fillna(test['Age'].median())# 用眾數填充缺失的登船港口數據
train['Embarked'] = train['Embarked'].fillna('S')
test['Embarked'] = test['Embarked'].fillna('S')# 用票價的中位數填充缺失的票價數據
test['Fare'] = test['Fare'].fillna(test['Fare'].median())# 數據預處理
# 將性別和登船港口轉換為數值類型
train = pd.get_dummies(train, columns=['Sex', 'Embarked'], drop_first=True)
test = pd.get_dummies(test, columns=['Sex', 'Embarked'], drop_first=True)# 刪除不需要的列
train.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)
test.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)# 提取目標變量和特征
train_target = train['Survived']  # 目標變量
train_features = train.drop(['Survived', 'PassengerId'], axis=1)  # 特征
test_features = test.drop(['PassengerId'], axis=1)  # 測試集特征# 標準化特征
scaler = StandardScaler()
train_features = scaler.fit_transform(train_features)
test_features = scaler.transform(test_features)# 邏輯回歸模型
model = LogisticRegression()  # 創建邏輯回歸模型
model.fit(train_features, train_target)  # 訓練模型# 模型評估
predictions = model.predict(train_features)  # 在訓練集上預測
print("Accuracy:", accuracy_score(train_target, predictions))  # 準確率
print("Precision:", precision_score(train_target, predictions))  # 精準率
print("Recall:", recall_score(train_target, predictions))  # 召回率
print("F1 Score:", f1_score(train_target, predictions))  # F1 分數# 在測試集上進行預測
test_predictions = model.predict(test_features)# 生成提交文件
submission['Survived'] = test_predictions
submission.to_csv("./submission.csv", index=False)  # 保存結果到 CSV 文件print("結果已保存至 submission.csv")

拓展內容

需要注意的是,邏輯回歸雖然存在sigmoid函數將輸出結果映射到0~1區間,但本質依然是一個線性模型,因為模型的分類決策邊界是一個平面,而不是曲面或其他,以下圖為例,中間的藍色直線就是我們的分類(超)平面,位于平面上方的點為正樣本,下方的點為負樣本,這個分類(超)平面可以用一個線性方程表示出來。
在這里插入圖片描述

作業

  1. 分類問題中,在正負樣本不均衡的情況下,我們如何評價模型?
  2. 在Titanic Machine Learning from Disaster比賽提交邏輯回歸建模預測結果,需要得分高于0.75

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65304.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65304.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記錄一次電腦被入侵用來挖礦的過程(Trojan、Miner、Hack、turminoob)

文章目錄 0、總結1、背景2、端倪3、有個微軟的系統更新,就想著更新看看(能否沖掉問題)4、更新沒成功,自動重啟電腦5、風險文件(好家伙命名還挺規范,一看名字就知道出問題了)6、開機有一些注冊表…

行為樹詳解(6)——黑板模式

【動作節點數據共享】 行為樹中需要的參數可以來自游戲中的各個模塊,如果僅需從多個模塊獲取少量參數,那么可以直接在代碼中調用其他模塊的單例繼而層層調用獲取數據。 如果獲取的參數量很大,從架構上看,我們需要通過加一個中間…

阿里云 人工智能與機器學習

阿里云的 人工智能(AI)與機器學習(ML) 服務為企業提供了全面的AI解決方案,幫助用戶在多個行業實現數據智能化,提升決策效率,推動業務創新。阿里云通過先進的技術和豐富的工具,支持用…

如果Adobe 退出中國后怎么辦

最近聽說Adobe要退出中國了?那咱們的設計師們可得好好想想怎么搞到正版軟件了。別急,今天教大家一個超酷的福利——Edu郵箱! Edu郵箱是什么?有什么好處? Edu郵箱就是學校給學生和老師們發的郵箱,一般結尾是.edu。有了…

Structured-Streaming集成Kafka

一、上下文 《Structured-Streaming初識》博客中已經初步認識了Structured-Streaming,Kafka作為目前最流行的一個分布式的實時流消息系統,是眾多實時流處理框架的最優數據源之一。下面我們就跟著官方例子來看看Structured-Streaming是如何集成Kafka的&a…

Spring Boot 項目中集成 Kafka-03

在 Spring Boot 項目中集成 Kafka 有多種方式,適應不同的應用場景和需求。以下將詳細介紹幾種常用的集成方法,包括: 使用 Spring Kafka (KafkaTemplate 和 KafkaListener)使用 Spring Cloud Stream 與 Kafka Binder使用 Spring for Apache K…

生物醫學信號處理--緒論

前言 參考書籍:劉海龍,生物醫學信號處理,化學工業出版社 生物醫學信號分類 1、由生理過程自發或者誘發產生的電生理信號和非電生理信號 ? 電生理信號:ECG/心電、EEG/腦電、EMG/肌電、 EGG/胃電、 EOG/眼電 ? 非電生理信號&am…

unity 播放 序列幀圖片 動畫

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、方法一:代碼控制播放序列幀1、設置圖片屬性2、創建Image組件3、簡單的代碼控制4、掛載代碼并賦值 二、方法二:直接使用1.Image上添加…

QT c++ 自定義按鈕類 加載圖片 美化按鈕

如果你有需要利用圖片美化按鈕的情況&#xff0c;本文能幫助你。 鼠標左鍵按下按鈕和松開&#xff0c;按鈕顯示不同的圖片。 1.按鈕類 //因為此類比較簡單&#xff0c;1個頭文件搞定&#xff0c;沒有cpp文件 #ifndef CUSTOMBUTTON_H #define CUSTOMBUTTON_H #include <Q…

web漏洞之文件包含漏洞

一、文件包含漏洞 1、把DVWA頁面改為low級別&#xff0c;然后點擊File Inclusion頁面 文件包含漏洞有四種include()/require()/include_once()/require_once() 常見的文件包含漏洞代碼如下 <?php$file$_GET[filename]; filename隨意定義include($file); ?> -----…

小程序與物聯網(IoT)融合:開啟智能生活新篇章

一、引言 隨著移動互聯網技術的飛速發展&#xff0c;小程序作為一種輕量級的應用形式&#xff0c;憑借其無需下載安裝、即用即走的特點&#xff0c;迅速滲透到人們生活的各個領域。與此同時&#xff0c;物聯網&#xff08;IoT&#xff09;技術也在不斷進步&#xff0c;將各種物…

Ubuntu無法創建python venv環境

排查步驟如下 1. python3 -m venv venv he virtual environment was not created successfully because ensurepip is not available. On Debian/Ubuntu systems, you need to install the python3-venv package using the following command.apt install python3.8-venvYou…

如何很快將文件轉換成另外一種編碼格式?編碼?按指定編碼格式編譯?如何檢測文件編碼格式?Java .class文件編碼和JVM運行期內存編碼?

如何很快將文件轉換成另外一種編碼格式? 利用VS Code右下角的"選擇編碼"功能&#xff0c;選擇"通過編碼保存"可以很方便將文件轉換成另外一種編碼格式。尤其&#xff0c;在測試w/ BOM或w/o BOM, 或者ANSI編碼和UTF編碼轉換&#xff0c;特別方便。VS文件另…

PCL點云庫入門——PCL庫點云特征之PFH點特征直方圖(Point Feature Histograms -PHF)

1、算法原理 PFH點&#xff08;Point Feature Histogram&#xff09;特征直方圖的原理涉及利用參數化查詢點與鄰域點之間的空間差異&#xff0c;并構建一個多維直方圖以捕捉點的k鄰域幾何屬性。這個高維超空間為特征表示提供了一個可度量的信息空間&#xff0c;對于點云對應曲面…

5. CSS引入方式

5.1 CSS的三種樣式 按照 CSS 樣式書寫的位置(或者引入的方式)&#xff0c;CSS樣式表可以分為三大類&#xff1a; 1.行內樣式表&#xff08;行內式&#xff09; 2.內部樣式表&#xff08;嵌入式&#xff09; 3. 外部樣式表&#xff08;鏈接式&#xff09; 5.2 內部樣式表 …

為什么ip屬地一會河南一會江蘇

在使用互聯網的過程中&#xff0c;許多用戶可能會遇到這樣一個問題&#xff1a;自己的IP屬地一會兒顯示為河南&#xff0c;一會兒又變成了江蘇。這種現象可能會讓人感到困惑&#xff0c;甚至產生疑慮&#xff0c;擔心自己的網絡活動是否受到了某種影響。為了解答這一疑問&#…

unity3d-搞個場景漫游如何實現Alpha

要處理兩個問題&#xff1a; 如何設置地面人不掉下去 方法一、 游戲物體加剛體&#xff0c;將游戲物體和地面加collider。如果是地形&#xff0c;可以使用 Terrain Collider&#xff1b;如果是簡單的平面&#xff0c;可以添加 Box Collider 或者 Mesh Collider&#xff08;如果…

git merge rebase

merge操作 Git自己分支合并dev分支 rebase 操作 git rebase

doris 2.1 temporay partition 測試及總結

測試步驟 創建表 drop table order_info_shuffle; CREATE TABLE order_info_shuffle ( order_id varchar(20), user_id varchar(20), goods_id