LightGBM的python實現及參數優化

文章目錄

  • 1. LightGBM模型參數介紹
  • 2. 核心優勢
  • 3. python實現LightGBM
    • 3.1 基礎實現
      • 3.1.1 Scikit-learn接口示例
      • 3.1.2 Python API示例
    • 3.2 模型調優
      • 3.2.1 GridSearchCV簡介
      • 3.2.2 LightGBM超參調優
      • 3.2.3 GridSearchCV尋優結果

在之前的文章 Boosting算法【AdaBoost、GBDT 、XGBoost 、LightGBM】理論介紹及python代碼實現 中重點介紹了AdaBoost算法的理論及實現,今天對LightGBM 如何實現以及如何調參,著重分析一下。

LightGBM是基于決策樹算法的分布式梯度提升框架,屬于GBDT(Gradient Boosting Decision Tree)家族,與XGBoost、CatBoost并稱為三大主流GBDT工具。

1. LightGBM模型參數介紹

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

2. 核心優勢

在這里插入圖片描述
與XGBoost相比較
在這里插入圖片描述

3. python實現LightGBM

3.1 基礎實現

3.1.1 Scikit-learn接口示例

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import lightgbm as lgb
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix,mean_squared_error
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號#導入數據
data = load_breast_cancer()
X = data.data
y = data.target# 分割數據集,80%作為訓練集,20%作為測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)# 創建Dataset
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)# 設置參數
params = {'objective': 'binary', #目標函數,決定了任務的類型(二分類  regression 回歸)'metric': 'binary_logloss',   #二分類對數損失(Binary Logarithmic Loss)'num_leaves': 31,'learning_rate': 0.05,'feature_fraction': 0.9
}# 訓練模型
gbm = lgb.train(params,train_data,num_boost_round=100,valid_sets=[test_data],early_stopping_rounds=10)# 預測
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)# 評估
rmse = mean_squared_error(y_test, y_pred)
print(f'Test RMSE: {rmse}')

在這里插入圖片描述

3.1.2 Python API示例

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import lightgbm as lgb
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix,mean_squared_error
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號#導入數據
data = load_breast_cancer()
X = data.data
y = data.target# 分割數據集,80%作為訓練集,20%作為測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)model = LGBMClassifier(num_leaves=31,learning_rate=0.1,n_estimators=100
)model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")

在這里插入圖片描述

3.2 模型調優

模型調優也參考之前自己寫過的文檔
Python模型優化超參尋優過程
GridSearchCV是scikit-learn庫中用于超參數調優的重要工具,它通過網格搜索和交叉驗證的方式尋找最優的模型參數組合,下面介紹使用GridSearchCV對LGBM參數調優。

3.2.1 GridSearchCV簡介

關于GridSearchCV簡單再介紹一下
在這里插入圖片描述
在這里插入圖片描述
機器學習-GridSearchCV scoring 參數設置!

3.2.2 LightGBM超參調優

(三)提升樹模型:Lightgbm原理深入探究 這篇文章里的關于Lightgbm優化比較深入,感興趣的可以仔細閱讀。

本部分的實現即對LightGBM介紹的參數使用GridSearchCV進行調優,python代碼見下

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score
from sklearn.datasets import load_breast_cancer
import lightgbm as lgb
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix,mean_squared_error
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號#導入數據
breast_cancer = load_breast_cancer()
breast_cancer_df = pd.DataFrame(breast_cancer.data, columns=breast_cancer.feature_names)
breast_cancer_df['target'] = breast_cancer.targetdaoshu = 20
X = breast_cancer_df.iloc[:,:-1]
y = breast_cancer_df.iloc[:,-1]
XGB_X = X[:-daoshu]
XGB_y = y[:-daoshu]
# 分割數據集,80%作為訓練集,20%作為測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)lgb_class = lgb.LGBMClassifier()
# GridSearchCV 參數網格-----------------------------------------------------------
param_grid = {'max_depth': [5,7],'learning_rate': [0.1, 0.5],'n_estimators': [100, 500],'num_leaves':[31,51],'reg_alpha':[0.5,0.8,1],'reg_lambda':[0.5,1]
}grid_search = GridSearchCV(estimator=lgb_class, param_grid=param_grid, scoring='neg_mean_squared_error', cv=2, verbose=2)
grid_search.fit(X_train, y_train)
#網格查找每個參數時的-MSE
par =[]
par_mses = []
for i, par_mse in zip(grid_search.cv_results_['params'],grid_search.cv_results_['mean_test_score']):# print(i, par_mse)par.append(i)par_data = pd.DataFrame(par) par_mses.append(par_mse)par_rmsedata = pd.DataFrame(par_mses) 
search_data = pd.concat([par_data,par_rmsedata],axis=1)
search_data = search_data.rename(columns={0:"neg_mean_squared_error"})
# 輸出最優參數信息
best_params = grid_search.best_params_
print('best_score:',grid_search.best_score_)
print(f"best_params: {best_params}")
print('best_index:',grid_search.best_index_)
print('best_estimator:',grid_search.best_estimator_)# 使用最優參數訓練模型
lgb_class_optimized = lgb.LGBMClassifier(**best_params)
lgb_class_optimized.fit(XGB_X, XGB_y)  
# 預測
y_pred_optimized = lgb_class_optimized.predict(X)
rmse_optimized = np.sqrt(mean_squared_error(y, y_pred_optimized))
print(f"Optimized RMSE: {rmse_optimized:.4f}")   #最終預測結果的 RMSE #可視化展示
pre_target = pd.DataFrame(y_pred_optimized)
predata= pd.concat([breast_cancer_df,pre_target],axis=1)
plt.figure(figsize=(6,3))
plt.plot(range(len(predata['target'])),predata['target'],c='blue')
plt.scatter(range(len(predata['target'])),predata.iloc[:,-1:],ls=':',c='red',lw=3)
plt.title('預測值與真實值對比', size= 20)
plt.legend(['真實目標值','預測值'])
plt.show()predata.tail()

部分結果展示
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
紅色框為最優組合。
在這里插入圖片描述

3.2.3 GridSearchCV尋優結果

在這里插入圖片描述

# 最佳參數組合的詳細信息
best_idx = grid_search.best_index_  # 即search_data表里的索引為 3
print(f"最佳參數組合: {grid_search.cv_results_['params'][best_idx]}")
print(f"平均驗證分數: {grid_search.cv_results_['mean_test_score'][best_idx]:.4f}")
print(f"各折驗證分數: {grid_search.cv_results_['split0_test_score'][best_idx]:.4f}, "f"{grid_search.cv_results_['split1_test_score'][best_idx]:.4f}, ...")

在這里插入圖片描述

best_results = pd.DataFrame(grid_search.cv_results_).sort_values('rank_test_score')print("Top 5參數組合:")
print(best_results[['params', 'mean_test_score', 'std_test_score', 'rank_test_score']].head(5))print("\n訓練時間分析:")
print(f"平均總訓練時間: {best_results['mean_fit_time'].sum():.2f}秒")
print(f"最快組合訓練時間: {best_results['mean_fit_time'].min():.2f}秒")
print(f"最慢組合訓練時間: {best_results['mean_fit_time'].max():.2f}秒")
best_results.head(4)

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

Map集合(雙列集合)

Map結合也稱為“鍵值對集合”,格式:{key1value1,key2value2....} Map集合的特點: 鍵唯一:在Map集合中,鍵(key)是唯一的,不能有重復的鍵。如果嘗試插入一個已經存在的鍵…

springBoot項目測試時瀏覽器返回406問題解決方案

1. 如果基于最新版本的SpringBoot官方骨架創建的SpringBoot項目,在勾選了lombok的依賴之后,會在pom.xml中引入如下兩個插件: 2. 由于第一個插件 maven-compiler-plugin 的引入導致了這個問題,解決這個問題的方案呢,就是…

21.享元模式:思考與解讀

原文地址:享元模式:思考與解讀 更多內容請關注:深入思考與解讀設計模式 引言 在軟件開發中,特別是當你處理大量相似對象時,是否會遇到一個問題:大量的對象會占用大量的內存,而這些對象有許多相同的狀態&…

java方法重寫學習筆記

方法重寫介紹 子類和父類有兩個返回值,參數,名稱都一樣的方法, 子類的方法會覆蓋父類的方法。 調用 public class Overide01 {public static void main(String[] args) {Dog dog new Dog();dog.cry();} }Animal類 public class Animal {…

什么是ESLint?它有什么作用?

ESLint 是一個用于 靜態代碼分析 的工具,專門檢測 JavaScript/TypeScript 代碼中的潛在問題和風格違規。它通過預定義的規則集幫助開發者保持代碼的一致性和質量,是前端工程化的核心工具之一。 一、ESLint 的核心作用 1. 錯誤檢查(Error Detection) 識別語法錯誤、未定義變…

Docker的網絡介紹

網絡簡單介紹 在介紹 Docker 的網絡模式之前,先簡單說下我們在使用 Vmware 虛擬機中的網絡模式,形成對比,更好理解。 1、Vmware 中的網絡模式 1.1、VMnet0(橋接模式) 虛擬機通過宿主機的物理網卡直接連接到外部網絡…

Netty學習專欄(六):深度解析Netty核心參數——從參數配置到生產級優化

文章目錄 前言一、核心參數全景解析1.1 基礎網絡層參數1.2 內存管理參數1.3 水位線控制1.4 高級參數與系統級優化 二、生產級優化策略2.1 高并發場景優化2.2 低延遲場景優化 總結 前言 在分布式系統和高并發場景中,Netty作為高性能網絡通信框架的核心地位無可替代。…

計算機網絡學習(六)——UDP

一、UDP UDP(User Datagram Protocol,用戶數據報協議)是傳輸層的一種協議,和 TCP 并列。與 TCP 不同,UDP 是無連接、不可靠、面向報文的協議,它的設計目標是追求更快的數據傳輸速度和更小的開銷。 UDP 為…

vue3文本超出三行顯示省略號,點擊查看更多顯示全部文本

只有一行時&#xff08;不顯示展開按鈕&#xff09;&#xff1a; 話不多說&#xff0c;上碼 ~template <el-col :span"24"><el-form-item :label"$t(warningOrgNames_)"><div class"content-box" ref"contanierRef"…

手寫Tomcat(一)

一、Tomcat簡介 Tomcat 服務器是一個免費的開放源代碼的Web應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試JSP 程序的首選。 1.1 Tomcat基本架構 Servlet接口文件中定義的方法有以下…

第三節_PySide6中Qt Designer 的基礎使用_上篇

文章目錄 前言一、Qt Designer簡介1.什么是 Qt Designer&#xff1f;2.核心功能3.核心優勢 二、Qt Designer界面介紹1.主窗口的創建2.窗口五大區域的簡單介紹 三、界面布局 Layout1.窗口布局方式介紹2.UI布局技巧概述3.UI布局實戰應用 總結 前言 第二節_PySide6項目創建流程介…

行列式的線性性質(僅限于單一行的加法拆分)

當然可以&#xff0c;以下是經過排版優化后的內容&#xff0c;保持了原始內容不變&#xff0c;僅調整了格式以提升可讀性&#xff1a; 行列式的線性性質&#xff08;加法拆分&#xff09; 這個性質說的是&#xff1a;如果行列式的某一行&#xff08;或某一列&#xff09;的所有…

Git使用說明

配置Git 確定已經安裝了Git, 通過以下的命令配置全局的郵箱和用戶名 git config --global user.email "your@xx.com" git config --global user.name "yourname" 初始化本地倉庫 首先,打開終端并切換到存放你代碼的項目目錄。接著執行以下命令,將該…

【后端高階面經:緩存篇】36、如何保證Redis分布式鎖的高可用和高性能?

一、分布式鎖核心挑戰:從單機到分布式的跨越 (一)分布式鎖的本質需求 互斥性:同一時刻僅一個客戶端持有鎖容錯性:節點故障時鎖仍有效(避免單點)原子性:加鎖/釋放鎖操作原子完成可重入性:支持同一客戶端多次獲取同一把鎖(二)Redis天然優勢 單線程模型保證操作原子性…

【后端高階面經:MongoDB篇】40、怎么優化MongoDB的查詢性能?

一、索引優化&#xff1a;構建高效查詢的基石 &#xff08;一&#xff09;索引類型與適用場景 1. 五大核心索引類型 索引類型適用場景示例代碼性能影響單字段索引單條件查詢&#xff08;如用戶ID、狀態字段&#xff09;db.users.createIndex({ user_id: 1 })低復合索引多條件…

Linux wget 常用命令詳解

目錄 1.1 工具定位 基礎下載示例 二、高效下載參數詳解 2.1 下載控制類 2.2 文件管理類 2.3 網絡優化類 三、高級應用場景 3.1 遞歸下載與整站鏡像 3.2 自動化下載實踐 3.3 安全下載配置 四、參數速查手冊 4.1 常用參數匯總 1.1 工具定位 基礎下載語法 wget [選項…

Pytorch中文文本分類

本文為&#x1f517;365天深度學習訓練營內部文章 原作者&#xff1a;K同學啊 將對中文文本進行分類&#xff0c;示例如下&#xff1a; 文本分類流程圖 1.加載數據 import time import pandas as pd import torch from torch.utils.data import DataLoader, random_split impo…

13.「極簡」扣子(coze)教程 | 小程序UI設計進階(三)讓界面動起來,實操講透“聚焦”事件

前一期大師兄介紹了扣子平臺組件的兩種狀態“禁用”和“加載”。這兩種方法使控件可以通過簡單設置表示出更多的運行狀態。今天大師兄將詳細介紹控件的一種事件“聚焦”。 扣子&#xff08;coze&#xff09;編程 「極簡」扣子(coze)教程 | 小程序UI設計進階 II&#xff01;讓…

劍指offer11_矩陣中的路徑

矩陣中的路徑 請設計一個函數&#xff0c;用來判斷在一個矩陣中是否存在一條路徑包含的字符按訪問順序連在一起恰好為給定字符串。 路徑可以從矩陣中的任意一個格子開始&#xff0c;每一步可以在矩陣中向左&#xff0c;向右&#xff0c;向上&#xff0c;向下移動一個格子。 如…

騰訊2025年校招筆試真題手撕(三)

一、題目 今天正在進行賽車車隊選拔&#xff0c;每一輛賽車都有一個不可以改變的速度。現在需要選取速度差距在10以內的車隊&#xff08;車隊中速度的最大值減去最小值不大于10&#xff09;&#xff0c;用于迎賓。車隊的選拔按照的是人越多越好的原則&#xff0c;給出n輛車的速…