邏輯回歸(二):從原理到實戰 - 訓練、評估與應用指南

引言:

上期我們講了什么是邏輯回歸,了解了它如何利用Sigmoid函數將線性回歸的輸出轉化為概率,并通過最大似然估計來尋找最佳參數。今天,我們將繼續這段旅程,學習如何訓練這個

模型、如何評估它的表現,以及如何在真實世界中應用它。

回顧第一篇結尾,我們得到了(對數)似然函數,目標是找到使其最大化的參數θ。但如何找到呢—— 梯度下降,如果模型訓練好了,如何衡量它的好壞?—— 評估指標,在本篇文章當中我們用鳶尾花分類這個經典案例講解如何運用我們之前所學的知識,構建一個預測模型。

(找到使其最大化的參數θ所用到的梯度下降在這篇文章【機器學習十大算法】線性回歸(二)中有詳細的理論解釋。)

Step1:下載數據集
鏈接: https://pan.baidu.com/s/1yIMbV6xO_P_3TdTNLGs4NQ?pwd=732q提取碼: 732q?

先簡單觀察一下這個數據集

特征說明:

列名含義數據類型說明
S_L花萼長度數值型Sepal Length
S_W花萼寬度數值型Sepal Width
P_L花瓣長度數值型Petal Length
P_W花瓣寬度數值型Petal Width
response鳶尾花種類文本型分類標簽

?類別分布:

數據集中包含三種鳶尾花:

類別樣本數量
山鳶尾50
雜色鳶尾50
維吉尼亞鳶尾50

(這給數據集只是方便教學使用,在實際開發當中我們并不總能找到這么完美的數據集)

Step2:導入必要的庫(我用的軟件是pycharm,用conda管理環境,具體可參考這篇Conda 環境管理與 PyCharm 集成實戰:從創建到包安裝的全方位指南)

pip install pandas numpy matplotlib seaborn scikit-learn openpyxl

或者激活conda環境后:

conda install pandas numpy matplotlib seaborn scikit-learn openpyxl

分析一下這些庫:

  • pandas: 數據分析和處理的“瑞士軍刀”,提供 DataFrame 來輕松處理表格數據。
  • numpy: 用于高效數值計算的底層庫,核心是多維數組 (ndarray)。
  • matplotlib: Python 中最基礎、最通用的數據可視化庫,用于創建各種圖表。
  • seaborn: 基于 Matplotlib,提供更美觀、更強大的統計圖表,尤其適合探索性數據分析。
  • scikit-learn: 機器學習的標準庫,提供易于使用的算法和工具,用于模型訓練和評估。
  • openpyxl: 用于讀取和寫入?.xlsx?格式 Excel 文件的庫。

Step3:數據加載和探索

這步主要是讓你清楚數據集的結構等等,在數據集較為龐大的時候尤為重要

# -*- coding: gbk -*- #編碼聲明,防止非 UTF-8 報錯
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report# 設置中文字體支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號# 加載數據(記得將數據集導入pycharm項目,最簡單的方法就是拖進去)
df = pd.read_excel('Data1-train.xlsx', sheet_name='Sheet1')# 數據探索
print("數據集形狀:", df.shape)
print("\n前5行數據:")
print(df.head())
print("\n數據基本信息:")
print(df.info())
print("\n描述性統計:")
print(df.describe())
print("\n類別分布:")
print(df['response'].value_counts())

結果:

數據集形狀: (154, 5)前5行數據:S_L  S_W  P_L  P_W response
0  5.1  3.5  1.4  0.2      山鳶尾
1  4.9    3  1.4  0.2      山鳶尾
2  4.7  3.2  1.3  0.2      山鳶尾
3  4.6  3.1  1.5  0.2      山鳶尾
4    5  3.6  1.4  0.2      山鳶尾數據基本信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 154 entries, 0 to 153
Data columns (total 5 columns):#   Column    Non-Null Count  Dtype 
---  ------    --------------  ----- 0   S_L       151 non-null    object1   S_W       151 non-null    object2   P_L       151 non-null    object3   P_W       151 non-null    object4   response  151 non-null    object
dtypes: object(5)
memory usage: 6.1+ KB
None描述性統計:S_L  S_W    P_L    P_W response
count   151  151  151.0  151.0      151
unique   36   24   44.0   23.0        4
top       5    3    1.5    0.2      山鳶尾
freq     10   26   14.0   28.0       50類別分布:
response
山鳶尾         50
雜色鳶尾        50
維吉尼亞鳶尾      50
response     1
Name: count, dtype: int64Process finished with exit code 0

這樣我們不僅對數據集有個大概的了解還能及時發現異常,看完之后我們就可以將數據探索這部分的代碼注釋掉了,結果會決定我們后面對數據進行預處理的方法(前面我們提到,數據集不總是完美的,可能會有數據缺失,類別不平衡的問題,這個時候我們就可以根據需要選擇重采樣等方法去進行數據預處理)

觀察后我們發現了異常,類別分布中顯示將response錯誤認為是一種類別并且顯示數量為1,在Step4我們做些處理刪掉這一行。

Step4:數據預處理

#刪除異常值
df_0 = df[df['response'] != 'response']
# 刪除空行,刪除缺失值
df_0 = df_0.dropna()# 確認數據清理后的形狀
print("清理后數據集形狀:", df_0.shape)# 分離特征和目標變量
X = df_0.iloc[:, :-1].values  # 所有行,除最后一列外的所有列
y = df_0.iloc[:, -1].values   # 所有行,只取最后一列# 將類別標簽轉換為數值
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)# 查看編碼映射
print("類別編碼:", list(le.classes_))
print("編碼對應:", dict(zip(le.classes_, le.transform(le.classes_))))# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)print(f"訓練集大小: {X_train.shape}") # (樣本數, 特征數)
print(f"測試集大小: {X_test.shape}")# 特征標準化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

結果如下:

代碼解析:

# 分離特征和目標變量:

x = df_0.iloc[:, :-1].values

?iloc 是基于整數位置的索引。 : 表示選擇所有行。 :-1 表示選擇從第一列到倒數第二列(不包含最后一列)。.values 將選取的 DataFrame 部分轉換為 NumPy 數組。(這部分代碼用于提取所有特征列,并將它們存儲在 NumPy 數組? x?中)

y = df_0.iloc[:, -1].values ?

其他同上,.values?將選取的 最后一列轉換為 NumPy 數組。(這部分代碼用于提取目標變量列(通常是分類標簽),并存儲在 NumPy 數組? y 中。)

簡單來說就是這么選的:

# 將類別標簽轉換為數值:

from sklearn.preprocessing import Label

le = LabelEncoder( )

(LabelEncoder 的作用是將分類的文本標簽(如 '山鳶尾', '雜色鳶尾')轉換為機器可以理解的數字格式(如 0, 1, 2)。)?

y = le.fit_transform(y)

le.fit(y) :LabelEncoder會掃描? y??數組,找出所有唯一的類別標簽,并學習它們之間的映射關系。 le.transform(y) :根據學習到的映射關系,將? y 數組中的每個文本標簽替換為對應的數字。 fit_transform(y)?結合了上述兩個步驟,一步完成學習和轉換。 轉換后的數值型 y 已經被重新賦值,供后續模型使用。

# 查看并打印編碼映射:

list(le.classes_)

le.classes_ 是? LabelEncoder? 在? fit??過程中學習到的所有唯一類別標簽(按字母順序排序)。這里將其轉換為列表,方便查看。

dict(zip(le.classes_, le.transform(le.classes_)))

le.transform(le.classes_) : 將所有唯一的類別標簽再次進行轉換,得到它們對應的數字編碼。? zip(le.classes_, le.transform(le.classes_)) : 將原始類別標簽和它們的數字編碼一 一配對。? dict(...): 將這些配對轉換成一個字典,例如 `{'山鳶尾': 0, '雜色鳶尾': 1, '維吉尼亞鳶尾': 2}`。 ( 這段代碼的作用是清晰地展示原始文本標簽和它們被轉換后的數字標簽之間的對應關系。)

#劃分訓練集和測試集

from sklearn.model_selection import train_test_split : 導入用于劃分數據集的函數。

?X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y)?:?

test_size=0.2 : 指定將 20% 的數據用作測試集,剩下的 80% 用作訓練集。

?random_state=42 : 這是一個種子值,用于確保每次運行代碼時,數據集的劃分都是相同的,這有助于復現實驗結果。如果省略,每次劃分都會不同。

stratify = y: 這是非常重要的一點。它表示在劃分訓練集和測試集時,保持原始? y??數組中各類別的比例分布。 (例如,如果原始數據中有 50% 的 '山鳶尾',那么訓練集和測試集中的 '山鳶尾' 比例也應該大致是 50%。 這樣做對于處理類別不平衡的數據集非常重要,可以確保模型的訓練和評估在各個類別上都盡可能公平。)

# 特征標準化

scaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)

scaler = StandardScaler(): 創建一個標準化工具,準備好進行標準化的“算法”。

scaler.fit_transform(X_train):

學習 (fit)?訓練集?X_train?的每個特征的均值和標準差。

應用 (transform)?學習到的均值和標準差,將?X_train?的數值標準化。

scaler.transform(X_test):

應用 (transform)?之前從?X_train?中學習到的相同的均值和標準差,將測試集?X_test?的數值標準化。

最終的效果:
X_train?和?X_test?中的所有數值都被縮放到一個共同的尺度(均值為 0,標準差為 1)。這樣,在后續的機器學習模型訓練和預測中,各個特征之間的數值差異就不會因為其原始的量級不同而造成不公平的影響,模型可以更有效地學習。

本文總結

在本篇文章中,我們以一個經典的鳶尾花分類數據集為例,完整地演示了構建一個機器學習預測模型的第一步和第二步:

  1. 數據加載與探索 (Data Loading & Exploration)

    • 使用?pandas?庫讀取 Excel 格式的數據集。

    • 通過?.shape,?.head(),?.info(),?.describe(),?.value_counts()?等方法快速了解數據集的全貌,包括數據規模、特征類型、缺失值、統計信息和類別分布。

    • 關鍵發現:在探索過程中,我們敏銳地發現了數據中的異常行(‘response‘?被錯誤地當作了一個類別標簽)和數據缺失問題。

  2. 數據預處理 (Data Preprocessing)

    • 數據清洗 (Data Cleaning):果斷地刪除了包含異常值和缺失值的行,保證了數據質量。

    • 特征與標簽分離 (Feature/Target Split):使用?.iloc?將數據明確劃分為特征矩陣?X?和目標變量?y

    • 標簽編碼 (Label Encoding):利用?LabelEncoder?將文本形式的花卉種類標簽(如‘山鳶尾’)轉換為數值形式(如 0, 1, 2),這是模型能夠處理的前提。

    • 數據集劃分 (Train-Test Split):使用?train_test_split?方法將數據劃分為訓練集和測試集,并設置了?stratify?參數以確保訓練集和測試集中各類別的比例一致,這對于獲得可靠的模型評估結果至關重要。

    • 特征標準化 (Feature Standardization):使用?StandardScaler?對特征數據進行標準化處理,將不同尺度的特征縮放到同一標準正態分布下,從而大幅提升許多機器學習模型(如邏輯回歸、SVM)的性能和訓練速度。

至此,我們已經擁有了一個干凈、規整、且經過預處理的訓練集 (X_train,?y_train) 和測試集 (X_test,?y_test),為下一步的模型訓練做好了萬全準備。


下一步預告:數據準備就緒后,我們將進入下一個環節——數據可視化。在下一篇文章中,我們將:

  • 使用預處理好的數據集進行可視化。

  • 詳細分析可視化圖標所蘊含的信息

  • 詳細分析每一條代碼的含義一步步敲出數據可視化

  • 深入講解并運用三種可視化圖標來全面觀察數據集,對比分析不同模型反映出什么樣的數據信息。

敬請期待:邏輯回歸(三):從原理到實戰 - 訓練、評估與應用指南??(鏈接將在文章發布后更新)

作者本人水平有限,非常歡迎任何反饋和指正,請隨時指出我可能存在的誤解、遺漏或表述不當之處。

我將繼續深入學習機器學習和統計學領域,并持續更新我的理解和最佳實踐。我愿意虛心接受反饋,不斷打磨和完善我的內容,以便為讀者提供更可靠、更有價值的信息。

感謝您提供的建議,它們對我至關重要!

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

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

相關文章

9.8C++作業

思維導圖#include <iostream> #include <vector> #include <fstream> using namespace std;class Stu {friend ofstream &operator<<(ofstream &ofs,const Stu &stu); private:string name;string id;int age;double score; public:Stu(){…

Linux內存管理章節十六:非均勻的內存訪問:深入Linux NUMA架構內存管理

引言 在傳統的SMP&#xff08;對稱多處理&#xff09;系統中&#xff0c;所有CPU核心通過一條共享總線訪問同一塊內存&#xff0c;所有內存訪問延遲是均勻的&#xff08;UMA&#xff09;。然而&#xff0c;隨著CPU核心數量的增加&#xff0c;共享總線成為了巨大的性能和 scalab…

【論文翻譯】Seg-Zero: Reasoning-Chain Guided Segmentation via Cognitive Reinforcement

0. 摘要Traditional methods for reasoning segmentation rely on supervised fine-tuning with categorical labels and simple descriptions, limiting its out-of-domain generalization and lacking explicit reasoning processes. To address these limitations, we propo…

Playwright MCP瀏覽器自動化教程

你是否曾厭倦在編程軟件和瀏覽器之間反復切換&#xff0c;只為了檢查AI生成的代碼能否正常運行&#xff1f;現在&#xff0c;有了Playwright MCP&#xff08;Model Context Protocol&#xff09;&#xff0c;你可以直接讓AI自己操作瀏覽器&#xff0c;查看自己寫的代碼運行效果…

矩陣中遍歷某個點周圍的九個點

又是學習新知識的一天,以下為Java版本部分關鍵代碼int[] neighbors {0, 1, -1};int rows board.length;int cols board[0].length;int[][] copyBoard new int[rows][cols];for (int row 0; row < rows; row) {for (int col 0; col < cols; col) {int liveNeighbors…

單例模式:只有一個對象

目錄 什么是單例模式 能解決什么問題 使用場景 如何實現 __new__ 方法&#xff1a;經典又直接 裝飾器&#xff1a;不改類本身&#xff0c;也能單例 模塊本身就是單例 注意事項 總結 你有沒有過這樣的困擾&#xff1a; “為什么我明明只創建了一次數據庫連接&#xff0…

AI大模型學習(6)Yolo V8神經網絡的基礎應用

Yolo V8神經網絡的基礎應用2024-2025年最火的目標檢測神器&#xff0c;一篇文章讓你徹底搞懂&#xff01;&#x1f929;大家好呀&#xff01;今天我們要聊一聊計算機視覺領域的「明星模型」——YOLO神經網絡&#xff01;&#x1f3af; 如果你對「目標檢測」這個詞還比較陌生&am…

C++:imagehlp庫

imagehlp庫1. 簡介2. 主要函數與用途2.1PE 文件解析相關2.2 符號處理相關2.3 崩潰轉儲相關2.4 版本資源相關3. 使用示例3.1 解析內存地址對應的函數名和行號3.2 創建目錄使用示例1. 簡介 imagehlp 是 Windows 系統提供的一個圖像處理與調試輔助 API 庫&#xff08;Image Helpe…

如何在Anaconda中配置你的CUDA Pytorch cuNN環境(2025最新教程)

目錄 一、簡介 二、下載CUDA 三、下載Pytorch-GPU版本 四、下載CUDNN 五、總結 六、測試代碼 一、簡介 啥是Anaconda?啥是CUDA?啥是CUDNN&#xff1f;它們和Pytorch、GPU之間有啥關系? 怎么通俗解釋它們三者的用途和關系&#xff1f; 1.GPU(圖形處理單元&#xff09…

算法面試(1)-----目標檢測和圖像分類、語義分割的區別

操作系統&#xff1a;ubuntu22.04 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 目標檢測&#xff08;Object Detection&#xff09;、圖像分類&#xff08;Image Classification&#xff09;、語義分割&#xff08;Semantic Segmentation&#xff09; 是計算機視…

電腦散熱風扇有噪音怎么解決

一、初步檢查與清理斷電并拆機關閉電腦并拔掉電源&#xff0c;打開機箱側板&#xff08;筆記本需先拆除后蓋螺絲&#xff09;。操作前建議佩戴防靜電手環&#xff0c;避免靜電損壞硬件。清理風扇及散熱片灰塵使用壓縮空氣罐從風扇進風口吹走灰塵&#xff0c;或用軟毛刷輕輕刷去…

SeaweedFS深度解析(九):k8s環境使用helm部署Seaweedfs集群

上一篇&#xff1a;《SeaweedFS深度解析&#xff08;八&#xff09;&#xff1a;k8s環境使用Operator部署Seaweedfs集群》 鏈接: link #作者&#xff1a;閆乾苓 文章目錄k8s環境使用helm部署Seaweedfs集群準備鏡像seaweed-master-localpv-storageclass.yamlseaweed-volume-lo…

MATLAB繪制一個新穎的混沌圖像(新四翼混沌系統)

新四翼混沌系統:dx/dt a(y - x) yz dy/dt cx - y - xz dz/dt -bz xyMATLAB代碼:function plot_novel_chaotic_system() % 參數設置 a 10; b 8/3; c 28;% 初始條件 x0 [1, 1, 1];% 時間范圍 tspan [0 100];% 求解微分方程 [t, x] ode45((t, x) chaotic_system(t, x, …

金融數據---獲取股票日線數據

獲取股票日線的數據方式有很多&#xff0c;包括東方財富&#xff0c;同花順&#xff0c;tushare&#xff0c;這里我們就利用東方財富的數據&#xff0c;是免費的開源獲取&#xff0c;第一步先安裝akshare&#xff0c;pip安裝就可以py -m pip install akshareAkshare 股票數據獲…

Mac 真正多顯示器支持:TESmart USB-C KVM(搭載 DisplayLink 技術)如何實現

多顯示器已經不再是奢侈品&#xff0c;而是專業人士提升生產力的必需工具。無論是創意設計師、股票交易員還是軟件開發人員&#xff0c;多屏幕都能讓工作流程更高效、更有條理。 然而&#xff0c;Mac 用戶長期以來面臨一個主要障礙&#xff1a;macOS 原生不支持多流傳輸&#x…

【實時Linux實戰系列】靜態鏈接與libc選擇:musl vs glibc的時延權衡

背景與重要性 在實時系統開發中&#xff0c;選擇合適的C標準庫&#xff08;libc&#xff09;和鏈接方式對系統的啟動時間、線程性能和內存分配效率有著顯著影響。glibc和musl是兩種流行的C標準庫實現&#xff0c;它們在設計目標和性能表現上存在差異。通過對比這兩種libc在啟動…

Altium Designer(AD24)的三種文件組織形式,工程文件,自由文件與存盤文件

??《專欄目錄》 目錄 1,概述 2,工程文件 3,自由文件 4,存盤文件 5,文件轉換 5.1,工程文件于自由文件互轉換 5.2,工程文件于存盤文件互轉換 6,注意事項 1,概述 本文介紹Altium Designer 24軟件(后文簡稱AD24或軟件)的三種文件組織形式,工程文件,自由文件和存盤文…

Python+Selenium實現自動化測試

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快安裝selenium打開命令控制符輸入&#xff1a;pip install -U selenium火狐瀏覽器安裝firebug&#xff1a;www.firebug.com&#xff0c;調試所有網站語言&#xff0…

2024年CSP-X初賽真題及答案解析(6-10)

2024年CSP-X初賽真題及答案解析(6-10) 字符串abcabcabc有多少不同的非空子串?( )。 A. 24 B. 36 C. 45 D. 46 答案:A 解析: 長度 1: 3 個(a, b, c) 長度 2: 3 個(ab, bc, ca) 長度 3: 3 個(abc, bca, cab) 長度 4: 3 個(abca, bcab, cabc) 長度 5: 3 個(a…

緩存與數據庫一致性的4大坑及終極解決方案

緩存雪崩、擊穿、穿透全中招&#xff1f;別讓緩存與數據庫的“愛恨情仇”毀了你的系統&#xff01; 你有沒有經歷過這樣的深夜告警&#xff1a;Redis 響應延遲飆升&#xff0c;數據庫 CPU 直沖 100%&#xff0c;接口大面積超時&#xff1f;一查日志&#xff0c;發現大量請求繞過…