Python訓練打卡Day23

機器學習管道 pipeline

基礎概念

????????pipeline在機器學習領域可以翻譯為“管道”,也可以翻譯為“流水線”,是機器學習中一個重要的概念。

????????在機器學習中,通常會按照一定的順序對數據進行預處理、特征提取、模型訓練和模型評估等步驟,以實現機器學習模型的訓練和評估。為了方便管理這些步驟,我們可以使用pipeline來構建一個完整的機器學習流水線。

????????pipeline是一個用于組合多個估計器(estimator)的 estimator,它實現了一個流水線,其中每個估計器都按照一定的順序執行。在pipeline中,每個估計器都實現了fit和transform方法,fit方法用于訓練模型,transform方法用于對數據進行預處理和特征提取。

????????在此之前我們先介紹下 轉換器(transformer)和估計器(estimator)的概念。

轉換器(transformer)

????????轉換器(transformer)是一個用于對數據進行預處理和特征提取的 estimator,它實現一個 transform 方法,用于對數據進行預處理和特征提取。轉換器通常用于對數據進行預處理,例如對數據進行歸一化、標準化、缺失值填充等。轉換器也可以用于對數據進行特征提取,例如對數據進行特征選擇、特征組合等。轉換器的特點是無狀態的,即它們不會存儲任何關于數據的狀態信息(指的是不存儲內參)。轉換器僅根據輸入數據學習轉換規則(比如函數規律、外參),并將其應用于新的數據。因此,轉換器可以在訓練集上學習轉換規則,并在訓練集之外的新數據上應用這些規則。

????????常見的轉換器包括數據縮放器(如StandardScaler、MinMaxScaler)、特征選擇器(如SelectKBest、PCA)、特征提取器(如CountVectorizer、TF-IDFVectorizer)等。

????????之前都是說對xxxx類進行實例化,現在可以換一個更加準確的說法,如下:

# 導入StandardScaler轉換器
from sklearn.preprocessing import StandardScaler# 初始化轉換器
scaler = StandardScaler()# 1. 學習訓練數據的縮放規則(計算均值和標準差),本身不存儲數據
scaler.fit(X_train)# 2. 應用規則到訓練數據和測試數據
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)# 也可以使用fit_transform一步完成
# X_train_scaled = scaler.fit_transform(X_train)
估計器(estimator)

????????估計器(Estimator)是實現機器學習算法的對象或類。它用于擬合(fit)數據并進行預測(predict)。估計器是機器學習模型的基本組成部分,用于從數據中學習模式、進行預測和進行模型評估。

????????估計器的主要方法是fit和predict。fit方法用于根據輸入數據學習模型的參數和規律,而predict方法用于對新的未標記樣本進行預測。估計器的特點是有狀態的,即它們在訓練過程中存儲了關于數據的狀態信息,以便在預測階段使用。估計器通過學習訓練數據中的模式和規律來進行預測。因此,估計器需要在訓練集上進行訓練,并使用訓練得到的模型參數對新數據進行預測。

????????常見的估計器包括分類器(classifier)、回歸器(regresser)、聚類器(clusterer)。

from sklearn.linear_model import LinearRegression
# 創建一個回歸器
model = LinearRegression()
# 在訓練集上訓練模型
model.fit(X_train_scaled, y_train)
# 對測試集進行預測
y_pred = model.predict(X_test_scaled)

管道(pipeline)

????????了解了分類器和估計器,所以可以理解為在機器學習是由轉換器(Transformer)和估計器(Estimator)按照一定順序組合在一起的來完成了整個流程。

????????機器學習的管道(Pipeline)機制通過將多個轉換器和估計器按順序連接在一起,可以構建一個完整的數據處理和模型訓練流程。在管道機制中,可以使用Pipeline類來組織和連接不同的轉換器和估計器。Pipeline類提供了一種簡單的方式來定義和管理機器學習任務的流程。

????????管道機制是按照封裝順序依次執行的一種機制,在機器學習算法中得以應用的根源在于,參數集在新數據集(比如測試集)上的重復使用。且代碼看上去更加簡潔明確。這也意味著,很多個不同的數據集,只要處理成管道的輸入形式,后續的代碼就可以復用。(這里為我們未來的python文件拆分做鋪墊),也就是把很多個類和函數操作寫進一個新的pipeline中。

????????這符合編程中的一個非常經典的思想:don't repeat yourself。(dry原則),也叫做封裝思想,我們之前提到過類似的思想的應用: 函數、類,現在我們來說管道。

????????Pipeline最大的價值和核心應用場景之一,就是與交叉驗證和網格搜索等結合使用,來:

????????1. 防止數據泄露: 這是在使用交叉驗證時,Pipeline自動完成預處理并在每個折疊內獨立fit/transform的關鍵優勢。

????????2. 簡化超參數調優: 可以方便地同時調優預處理步驟和模型的參數。

????????下面我們將對我們的信貸數據集進行管道工程,重構整個代碼。之所以提到管道,是因為后續你在閱讀一些經典的代碼的時候,尤其是官方文檔,非常喜歡用管道來構建代碼,甚至深度學習中也有類似的代碼,初學者往往看起來很吃力。

pipeline代碼示例:
導入庫和數據加載
# 導入基礎庫
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import time # 導入 time 庫
import warnings# 忽略警告
warnings.filterwarnings("ignore")# 設置中文字體和負號正常顯示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 導入 Pipeline 和相關預處理工具
from sklearn.pipeline import Pipeline # 用于創建機器學習工作流
from sklearn.compose import ColumnTransformer # 用于將不同的預處理應用于不同的列
from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder, StandardScaler # 用于數據預處理(有序編碼、獨熱編碼、標準化)
from sklearn.impute import SimpleImputer # 用于處理缺失值# 導入機器學習模型和評估工具
from sklearn.ensemble import RandomForestClassifier # 隨機森林分類器
from sklearn.metrics import classification_report, confusion_matrix # 用于評估分類器性能
from sklearn.model_selection import train_test_split # 用于劃分訓練集和測試集# --- 加載原始數據 ---
# 我們加載原始數據,不對其進行任何手動預處理
data = pd.read_csv('data.csv')print("原始數據加載完成,形狀為:", data.shape)
# print(data.head()) # 可以打印前幾行看看原始數據

原始數據加載完成,形狀為: (7500, 18)

分離特征和標簽,劃分數據集
# --- 分離特征和標簽 (使用原始數據) ---
y = data['Credit Default'] # 標簽
X = data.drop(['Credit Default'], axis=1) # 特征 (axis=1 表示按列刪除)print("\n特征和標簽分離完成。")
print("特征 X 的形狀:", X.shape)
print("標簽 y 的形狀:", y.shape)# --- 劃分訓練集和測試集 (在任何預處理之前劃分) ---
# 按照8:2劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 80%訓練集,20%測試集print("\n數據集劃分完成 (預處理之前)。")
print("X_train 形狀:", X_train.shape)
print("X_test 形狀:", X_test.shape)
print("y_train 形狀:", y_train.shape)
print("y_test 形狀:", y_test.shape)特征和標簽分離完成。
特征 X 的形狀: (7500, 17)
標簽 y 的形狀: (7500,)數據集劃分完成 (預處理之前)。
X_train 形狀: (6000, 17)
X_test 形狀: (1500, 17)
y_train 形狀: (6000,)
y_test 形狀: (1500,)
定義預處理步驟
# --- 定義不同列的類型和它們對應的預處理步驟 ---
# 這些定義是基于原始數據 X 的列類型來確定的# 識別原始的 object 列 (對應你原代碼中的 discrete_features 在預處理前)
object_cols = X.select_dtypes(include=['object']).columns.tolist()
# 識別原始的非 object 列 (通常是數值列)
numeric_cols = X.select_dtypes(exclude=['object']).columns.tolist()# 有序分類特征 (對應你之前的標簽編碼)
# 注意:OrdinalEncoder默認編碼為0, 1, 2... 對應你之前的1, 2, 3...需要在模型解釋時注意
# 這里的類別順序需要和你之前映射的順序一致
ordinal_features = ['Home Ownership', 'Years in current job', 'Term']
# 定義每個有序特征的類別順序,這個順序決定了編碼后的數值大小
ordinal_categories = [['Own Home', 'Rent', 'Have Mortgage', 'Home Mortgage'], # Home Ownership 的順序 (對應1, 2, 3, 4)['< 1 year', '1 year', '2 years', '3 years', '4 years', '5 years', '6 years', '7 years', '8 years', '9 years', '10+ years'], # Years in current job 的順序 (對應1-11)['Short Term', 'Long Term'] # Term 的順序 (對應0, 1)
]
# 構建處理有序特征的 Pipeline: 先填充缺失值,再進行有序編碼
ordinal_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')), # 用眾數填充分類特征的缺失值('encoder', OrdinalEncoder(categories=ordinal_categories, handle_unknown='use_encoded_value', unknown_value=-1)) # 進行有序編碼
])
print("有序特征處理 Pipeline 定義完成。")# 標稱分類特征 (對應你之前的獨熱編碼)
nominal_features = ['Purpose'] # 使用原始列名
# 構建處理標稱特征的 Pipeline: 先填充缺失值,再進行獨熱編碼
nominal_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')), # 用眾數填充分類特征的缺失值('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False)) # 進行獨熱編碼, sparse_output=False 使輸出為密集數組
])
print("標稱特征處理 Pipeline 定義完成。")# 連續特征 (對應你之前的眾數填充 + 添加標準化)
# 從所有列中排除掉分類特征,得到連續特征列表
# continuous_features = X.columns.difference(object_cols).tolist() # 原始X中非object類型的列
# 也可以直接從所有列中排除已知的有序和標稱特征
continuous_features = [f for f in X.columns if f not in ordinal_features + nominal_features]# 構建處理連續特征的 Pipeline: 先填充缺失值,再進行標準化
continuous_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')), # 用眾數填充缺失值 (復現你的原始邏輯)('scaler', StandardScaler()) # 標準化,一個好的實踐 (如果你嚴格復刻原代碼,可以移除這步)
])
print("連續特征處理 Pipeline 定義完成。")
# --- 構建 ColumnTransformer ---
# 將不同的預處理應用于不同的列子集,構造一個完備的轉化器
# ColumnTransformer 接收一個 transformers 列表,每個元素是 (名稱, 轉換器對象, 列名列表)
preprocessor = ColumnTransformer(transformers=[('ordinal', ordinal_transformer, ordinal_features), # 對 ordinal_features 列應用 ordinal_transformer('nominal', nominal_transformer, nominal_features), # 對 nominal_features 列應用 nominal_transformer('continuous', continuous_transformer, continuous_features) # 對 continuous_features 列應用 continuous_transformer],remainder='passthrough' # 如何處理沒有在上面列表中指定的列。# 'passthrough' 表示保留這些列,不做任何處理。# 'drop' 表示丟棄這些列。
)print("\nColumnTransformer (預處理器) 定義完成。")
# print(preprocessor) # 可以打印 preprocessor 對象看看它的結構
構建完整pipeline
# --- 構建完整的 Pipeline ---
# 將預處理器和模型串聯起來
# 使用你原代碼中 RandomForestClassifier 的默認參數和 random_state
pipeline = Pipeline(steps=[('preprocessor', preprocessor), # 第一步:應用所有的預處理 (我們剛剛定義的 ColumnTransformer 對象)('classifier', RandomForestClassifier(random_state=42)) # 第二步:隨機森林分類器 (使用默認參數和指定的 random_state)
])print("\n完整的 Pipeline 定義完成。")
# print(pipeline) # 可以打印 pipeline 對象看看它的結構
使用 Pipeline 進行訓練和評估
# --- 1. 使用 Pipeline 在劃分好的訓練集和測試集上評估 ---
# 完全模仿你原代碼的第一個評估步驟print("\n--- 1. 默認參數隨機森林 (訓練集 -> 測試集) ---") # 使用你原代碼的輸出文本
# import time # 引入 time 庫 (已在文件頂部引入)start_time = time.time() # 記錄開始時間# 在原始的 X_train, y_train 上擬合整個Pipeline
# Pipeline會自動按順序執行 preprocessor 的 fit_transform(X_train),
# 然后用處理后的數據和 y_train 擬合 classifier
pipeline.fit(X_train, y_train)# 在原始的 X_test 上進行預測
# Pipeline會自動按順序執行 preprocessor 的 transform(X_test),
# 然后用處理后的數據進行 classifier 的 predict
pipeline_pred = pipeline.predict(X_test)end_time = time.time() # 記錄結束時間print(f"訓練與預測耗時: {end_time - start_time:.4f} 秒") # 使用你原代碼的輸出格式print("\n默認隨機森林 在測試集上的分類報告:") # 使用你原代碼的輸出文本
print(classification_report(y_test, pipeline_pred))
print("默認隨機森林 在測試集上的混淆矩陣:") # 使用你原代碼的輸出文本
print(confusion_matrix(y_test, pipeline_pred))

@浙大疏錦行

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

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

相關文章

GPU SIMT架構的極限壓榨:PTX匯編指令級并行優化實踐

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生專屬優惠。 一、SIMT架構的調度哲學與寄存器平衡藝術 1.1 Warp Scheduler的調度策略解構 在NVIDIA GPU…

HarmonyOS 【詩韻悠然】AI古詩詞賞析APP開發實戰從零到一系列(二、項目準備與后臺服務搭建)

在開發一款面向HarmonyOS平臺的應用程序——【詩韻悠然】AI古詩詞賞析APP時&#xff0c;選擇了流行Go語言作為后端開發語言&#xff0c;并使用了go-zero微服務框架來搭建服務接口。本文將詳細介紹項目準備和后臺服務搭建的過程&#xff0c;幫助大家更好地理解和掌握go-zero框架…

QT5.14安裝以及新建基礎項目

進入qt中文網站&#xff1a;Qt | 軟件開發全周期的各階段工具 額&#xff0c;考慮新手可能還是找不到&#xff0c;我就分享一下我下載的的吧 通過網盤分享的文件&#xff1a;qt-opensource-windows-x86-5.14.2.exe 鏈接:https://pan.baidu.com/s/1yQTRp-b_ISje5B3UWb7Apw?pw…

深入解析 I/O 模型:原理、區別與 Java 實踐

一、I/O 模型的核心概念 I/O 操作的本質是數據在用戶空間&#xff08;應用程序內存&#xff09;和內核空間&#xff08;操作系統內核內存&#xff09;之間的傳輸。根據數據準備與拷貝階段的處理方式不同&#xff0c;I/O 模型可分為以下五類&#xff1a; 阻塞 I/O&#xff08;…

EMQX v5.0通過連接器和規則同步數據

1 概述 EMQX數據集成功能&#xff0c;幫助用戶將所有的業務數據無需額外編寫代碼即可快速完成處理與分發。 數據集成能力由連接器和規則兩部分組成&#xff0c;用戶可以使用數據橋接或 MQTT 主題來接入數據&#xff0c;使用規則處理數據后&#xff0c;再通過數據橋接將數據發…

重構門店網絡:從“打補丁“到“造地基“的跨越

您是否遇到過這樣的窘境&#xff1f; 新店開張要等一周&#xff0c;就為裝根網線&#xff1b; 偏遠地區門店三天兩頭斷網&#xff0c;顧客排長隊卻結不了賬&#xff1b; 總部想看實時數據&#xff0c;結果收到一堆亂碼報錯&#xff1b; 總部ERP系統升級&#xff0c;2000家門…

PH熱榜 | 2025-05-13

1. FirstQuadrant 標語&#xff1a;通過以人為本的人工智能來最大化B2B銷售 介紹&#xff1a;銷售人工智能&#xff0c;幫助創始人和收益團隊提高效率&#xff0c;保持組織有序&#xff0c;并促成更多交易。它通過簡化銷售幕后工作&#xff0c;確保每個細節都不會遺漏。 產品…

【即插即用漲點模塊】【上采樣】CARAFE內容感知特征重組:語義信息與高效計算兩不誤【附源碼】

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

esp32硬件支持AT指令

步驟1&#xff1a;下載AT固件 從樂鑫官網或Git鑫GitHub倉庫&#xff08;https://github.com/espressif/esp-at&#xff09;獲取對應ESP32型號的AT固件&#xff08;如ESP32-AT.bin&#xff09;。 步驟2&#xff1a;安裝燒錄工具 使用 esptool.py&#xff08;命令行工具&#…

【神經網絡與深度學習】局部最小值和全局最小值

引言 在機器學習和優化問題中&#xff0c;目標函數的優化通常是核心任務。優化過程可能會產生局部最小值或全局最小值&#xff0c;而如何區分它們并選擇合適的優化策略&#xff0c;將直接影響模型的性能和穩定性。 在深度學習等復雜優化問題中&#xff0c;尋找全局最小值往往…

鏈表的面試題4之合并有序鏈表

這篇文章我們繼續來講鏈表中很經典的面試題&#xff1a;合并有序鏈表。 目錄 迭代 遞歸 我們首先來看一下這張圖片里面的要求&#xff0c;給你兩個鏈表&#xff0c;要求把他們按照從小到大的方式排列。 這里涉及到幾個問題&#xff0c;首先&#xff0c;我們的頭節點是不是要…

flea-cache使用之Redis哨兵模式接入

Redis哨兵模式接入 1. 參考2. 依賴3. 基礎接入3.1 定義Flea緩存接口3.2 定義抽象Flea緩存類3.3 定義Redis客戶端接口類3.4 定義Redis客戶端命令行3.5 定義哨兵模式Redis客戶端實現類3.6 定義Redis哨兵連接池3.7 定義Redis哨兵配置文件3.8 定義Redis Flea緩存類3.9 定義抽象Flea…

OpenAI for Countries:全球AI基礎設施的“技術基建革命”

2025年5月7日&#xff0c;OpenAI宣布啟動“OpenAI for Countries”計劃&#xff0c;目標是為全球各國構建本土化的AI基礎設施&#xff0c;提供定制化服務。這一計劃被視為其“星際之門”項目的全球化延伸&#xff0c;以技術合作為核心&#xff0c;覆蓋數據中心建設、模型適配與…

Linux精確列出非法 UTF-8 字符的路徑或文件名

Docker構建的時候報錯:failed to solve: Internal: rpc error: code = Internal desc = grpc: error while marshaling: string field contains invalid UTF-8 1、創建一個test.sh文件 find . -print0 | while IFS= read -r -d file;

FFmpeg在Android開發中的核心價值是什么?

FFmpeg 在 Android 開發中的核心價值主要體現在其強大的多媒體處理能力和靈活性上&#xff0c;尤其在音視頻編解碼、流媒體處理及跨平臺兼容性方面具有不可替代的作用。以下是具體分析&#xff1a; --- 1. 強大的音視頻編解碼能力 - 支持廣泛格式&#xff1a;FFmpeg 支持幾乎所…

自我獎勵語言模型:突破人類反饋瓶頸

核心思想 自我獎勵語言模型提出了一種全新的語言模型對齊范式。傳統方法如RLHF或DPO依賴人類反饋數據訓練固定的獎勵模型&#xff0c;這使模型的能力受限于人類標注數據的質量和數量。論文作者認為&#xff0c;要實現超人類能力的AI代理&#xff0c;未來的模型需要突破人類反饋…

5. 動畫/過渡模塊 - 交互式儀表盤

5. 動畫/過渡模塊 - 交互式儀表盤 案例&#xff1a;數據分析儀表盤 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">.dashboard {font-family: Arial…

【前端三劍客】Ajax技術實現前端開發

目錄 一、原生AJAX 1.1AJAX 簡介 1.2XML 簡介 1.3AJAX 的特點 1.3.1AJAX 的優點 1.3.2AJAX 的缺點 1.4AJAX 的使用 1.4.1核心對象 1.4.2使用步驟 1.4.3解決IE 緩存問題 1.4.4AJAX 請求狀態 二、jQuery 中的AJAX 2.1 get 請求 2.2 post 請求 三、跨域 3.1同源策略…

SQL 索引優化指南:原理、知識點與實踐案例

SQL 索引優化指南&#xff1a;原理、知識點與實踐案例 索引的基本原理 索引是數據庫中用于加速數據檢索的數據結構&#xff0c;類似于書籍的目錄。它通過創建額外的數據結構來存儲部分數據&#xff0c;使得查詢可以快速定位到所需數據而不必掃描整個表。 索引的工作原理 B-…

typedef unsigned short uint16_t; typedef unsigned int uint32_t;

你提到的這兩行是 C/C 中的類型別名定義&#xff1a; typedef unsigned short uint16_t; typedef unsigned int uint32_t;它們的目的是讓代碼更具可讀性和可移植性&#xff0c;尤其在處理精確位數的整數時非常有用。 ? 含義解釋 typedef unsigned short uint16_t;…