最優化方法Python計算:有約束優化應用——線性Lasso回歸分類器

利用線性Lasso模型類LineLassoModel類(見博文《最優化方法Python計算:有約束優化應用——線性Lasso回歸預測器》)及分類器類Classification(見博文《最優化方法Python計算:無約束優化應用——線性回歸分類器》),下列代碼實現線性Lasso分類器。

class LassoClassifier(Classification, LineLassoModel):		#線性Lasso分類器def __init__(self, alpha = 1.0):self.alpha = alphaself.tagVal = np.round

第1~4行用LineLassoModel和Classification類實現線性Lasso分類器類LassoClassifier。第2~4行的構造函數初始化正則化系數alpha,將標簽值函數tagVal設置為四舍五入函數numpy.round,以適于分類預測。
綜合案例
文件heart_failure_clinical_records_dataset.csv(來自UC Irvine Machine Learning Repository)記錄了299例心力衰竭病人的數據。

ageanaemia ? \cdots ?diabetes$cdots$ ? \cdots ?plateletssex ? \cdots ? ? \cdots ?smokingtimeDEATH_EVENT
750 ? \cdots ?0 ? \cdots ? ? \cdots ?2650001.9 ? \cdots ? ? \cdots ?041
? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ?
700 ? \cdots ?0 ? \cdots ? ? \cdots ?2440001.2 ? \cdots ? ? \cdots ?0661
? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ?
601 ? \cdots ?0 ? \cdots ? ? \cdots ?2100001.7 ? \cdots ? ? \cdots ?0821
? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ?
550 ? \cdots ?0 ? \cdots ? ? \cdots ?263358.03 ? \cdots ? ? \cdots ?112411
? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ? ? \cdots ?
500 ? \cdots ?0 ? \cdots ? ? \cdots ?3950001.6 ? \cdots ? ? \cdots ?12850

其中,

  • age - 患者的年齡(年)
  • anaemia - 患者是否貧血(布爾值)
  • creatinine phosphokinase(CPK) - 血液中CPK酶的水平(mcg/L)
  • diabetes - 患者是否患有糖尿病(布爾值)
  • ejection fraction - 每次收縮時離開心臟的血液百分比(百分比)
  • high blood pressure - 患者是否患有高血壓(布爾值)
  • platelets - 血液中的血小板(kiloplatelets/mL)
  • sex - 性別(二進制)
  • serum creatinine - 血液中的血清肌酐水平(毫克/分升)
  • serum sodium - 血液中的血清鈉水平(mEq/L)
  • smoking - 患者是否吸煙(布爾值)
  • time - 隨訪期(天數)
  • DEATH_EVENT - 患者是否在隨訪期間死亡(布爾值)
    將表示患者是否死亡的\texttt{DEATH_EVENT}作為標簽數據,其余12個數據項作為特征數據,則判斷患者是否會在就醫時死亡構成一個2-分類問題。下列代碼用這一數據集訓練測試一個線性分類LinearClassifier(見博文《最優化方法Python計算:無約束優化應用——線性回歸分類器》)模型。
import numpy as np										#導入numpy
LassoClassifier,LinearClassifier
np.set_printoptions(precision=4)
data = np.loadtxt('heart_failure_clinical_records_dataset.csv', delimiter=',', dtype=object, skiprows=1)	#讀取數據文件
X = np.array(data)										#轉換為數組
Y = X[:, 12].astype(int)								#讀取標簽數據
X = np.delete(X, [12], axis = 1).astype(float)			#特征數據
m, n = X.shape
print('共有%d個數據樣本'%m)
a=np.arange(m)											#樣本下標集
np.random.seed(1766)									#隨機種子
print('隨機抽取%d個樣本作為訓練數據。'%(m // 2))
train = np.random.choice(a, m // 2, replace = False)	#隨機取得一半作為訓練集下標
test = np.setdiff1d(a, train)							#測試集下標
print('LINE REGRESSION:')
heart_failure = LinearClassifier()						#構造線性回歸模型
heart_failure.fit(X[train], Y[train])					#訓練模型
coef, inte = heart_failure.coef_inte()					#模型的系數和截距
print('系數:', coef)
print('截距:%.4f'%inte)
acc = heart_failure.score(X[test], Y[test]) * 100		#測試模型
print('對其余%d個樣本數據測試,準確率:%.4f'%(m - m // 2, acc) + '%')

程序的第3~8行讀取文件數據并將其分離成樣本特征數據X和標簽數據Y。第11~14行在數據集中隨機選取一般作為訓練數據,下標為train,另一半作為測試數據,下標為test。第16行用LinearClassifier類創建一個線性分類模型heart_failure。第17行調用heart_failure的fit函數用X[train]和Y[train]訓練heart_failure。第18行調用heart_failure的coef_inte函數計算系數和截距。第21行調用heart_failure的score函數用X[test]和Y[test]測試heart_failure。運行程序,輸出

共有299個數據樣本
隨機抽取149個樣本作為訓練數據。
LINE REGRESSION:
訓練中...,稍候
17次迭代后完成訓練。
系數: [ 6.1401e-03 -2.1315e-02  4.1355e-05 -1.0871e-02 -9.2742e-03 -2.2379e-02-1.8753e-07  7.4815e-02 -9.0710e-03 -1.5951e-01  3.4964e-02 -2.5166e-03]
截距:1.9301
對其余150個樣本數據測試,準確率:90.6667%

即經17次迭代,用X[train]和Y[train]訓練了線性分類模型。用X[test]和Y[test]測試該模型得到90.667%的正確率。接下來我們分別用X[train]、Y[train]和X[test]、Y[test]訓練和測試一個線性Lasso分類器LassoClassifier模型。前一程序之后添加下列代碼

……
print('LASSO REGRESSION:')
heart_failure = LassoClassifier(alpha = 0.5)		#構造Lasso分類模型
heart_failure.fit(X[train], Y[train])				#訓練模型
coef, inte = heart_failure.coef_inte()
print('系數:',coef)
print('截距:%.4f'%inte)
acc = heart_failure.score(X[test], Y[test]) * 100	#測試模型
print('對其余%d個樣本數據測試,準確率:%.4f'%(m - m // 2, acc) + '%')

程序第1行的省略號表示前一程序的代碼。第3行將heart_failure聲明為LassoClassifier類對象,傳遞給構造函數的參數alpha為0.5。第4行用X[train]、Y[train]訓練heart_failure。第8行用X[test]、Y[test]測試heart_failure。運行程序,輸出

LASSO REGRESSION:
訓練中...,稍候
36次迭代后完成訓練。
系數: [ 3.3045e-01 -1.5398e-07  5.6651e-02  7.3073e-08 -4.6018e-01 -7.5823e-06-1.1760e-08  4.6328e-01 -9.9697e-02 -1.0726e-01  1.0053e-02 -6.2893e-017.8053e-01]
截距:0.7805
對其余150個樣本數據測試,準確率:90.6667%

經36次迭代,用X[train]、Y[train]訓練的Lasso分類模型,對X[test]、Y[test]測試的正確率為90.667%{}。觀察Lasso分類模型的系數,有一些元素的絕對值小于 1 0 ? 4 10^{-4} 10?4。這意味著這些系數對應的特征數據對標簽值的貢獻微弱。刪掉這些數據項對預測正確率的影響不大,且可提高訓練線性模型的效率。下列代碼作這樣的嘗試,追加在前兩個程序尾部。

……
a = np.where(np.abs(coef) < 1e - 4)[0]				#LASSO回歸絕對值小于1/10000的系數下標
print('LASSO回歸絕對值小于1/10000的系數下標:%s'%a)
X = np.delete(X, a, axis=1)							#刪掉這些系數對應的特征數據
print('LINE REGRESSION:')
heart_failure = LinearClassifier()					#構造線性回歸模型
heart_failure.fit(X[train], Y[train])				#訓練模型
coef, inte=heart_failure.coef_inte()
print('系數:', coef)
print('截距:%.4f'%inte)
acc = heart_failure.score(X[test], Y[test]) * 100	#測試模型
print('對其余%d個樣本數據測試,準確率:%.4f'%(m - m // 2, acc) + '%')

程序第1行的省略號表示程序8.6、8.7的代碼。第2行調用numpy的where函數計算LassoClassifier對象表示的Lasso分類模型的系數coef中絕對值小于 1 0 ? 4 10^{-4} 10?4的下標集a。第4行在X中刪除由a指示的數據列。第6行將heart_{}failure聲明為線性分類模型。第7行用X[train]、Y[train]訓練線性分類模型。第11行對X[test]、Y[test]測試該模型。運行程序,輸出

……
LASSO回歸絕對值小于1/10000的系數下標:[1 3 5 6]
LINE REGRESSION:
訓練中...,稍候
16次迭代后完成訓練。
系數: [ 6.1677e-03  4.5319e-05 -9.4294e-03  7.5720e-02 -9.3499e-03 -1.5180e-014.0119e-02 -2.4872e-03]
截距:1.8346
對其余150個樣本數據測試,準確率:90.6667%

即特征數據降維后,線性分類模型經16次迭代得到訓練,測試知正確率與降維前保持一致。

寫博不易,敬請支持:
如果閱讀本文于您有所獲,敬請點贊、評論、收藏,謝謝大家的支持!

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

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

相關文章

Python基礎學習-Day20

目錄 奇異值分解&#xff08;SVD&#xff09;的輸入和輸出奇異值的應用實際案例1. 問題分析2. 解決方案&#xff1a;對測試集應用相同的變換3. 為什么不能對測試集單獨做 SVD&#xff1f;4. 代碼示例&#xff1a;訓練集和測試集的 SVD 降維6. 實際操作中的注意事項 奇異值分解&…

2025年 全新 AI 編程工具 Cursor 安裝使用教程

一、Cursor 軟件下載 首選&#xff0c;登錄Cursor官網&#xff0c;進行軟件下載&#xff0c;官網下載地址如下&#xff1a; Cursor AI IDE 下載 二、Cursor軟件安裝配置 此處以Windows10系統安裝為例&#xff0c;下載完成之后&#xff0c;右鍵安裝包&#xff0c;以管理員身份…

[vue]error:0308010C:digital envelope routines::unsupported

npm run dev 報錯&#xff1a; \node_modules\webpack\hot\dev-server.jsnode:internal/crypto/hash:71 this[kHandle] new _Hash(algorithm, xofLen); Error: error:0308010C:digital envelope routines::unsupported opensslErrorStack: [ error:03000086:digital env…

開放的力量:新零售生態的共贏密碼

當某頭部生鮮平臺向供應商開放銷售預測系統后&#xff0c;合作伙伴的庫存周轉率竟提升12%——這個反常識的案例&#xff0c;正在重塑商業競爭的底層邏輯。 生態共建三板斧 ▌模塊化設計&#xff1a;像搭積木一樣開放 ? 樂高式API架構&#xff1a;30%接口支持自由組合&#xff…

深入理解Spring緩存注解:@Cacheable與@CacheEvict

在現代應用程序開發中&#xff0c;緩存是提升系統性能的重要手段。Spring框架提供了一套簡潔而強大的緩存抽象&#xff0c;其中Cacheable和CacheEvict是兩個最常用的注解。本文將深入探討這兩個注解的工作原理、使用場景以及最佳實踐。 1. Cacheable注解 基本概念 Cacheable…

[python] 函數3-python內置函數

一 內置函數 導入:import builtins 1.1 查看內置函數 大寫字母開頭的一般是內置變量小寫的一般是內置函數 import builtins print(dir(builtins)) 1.2 abs() 求絕對值 print(abs(-10)) 1.3 sum()求和 不能直接用純數字,因為不是可迭代對象 運算時只要一個是浮點數,結果就…

QT異步線程通信

在使用 QThreadPool 提交任務后&#xff0c;如果你需要知道任務何時完成&#xff0c;并且需要使用任務的執行結果&#xff0c;可以通過以下幾種方式來實現&#xff1a; 1. 使用信號和槽 QRunnable 提供了一個 finished() 信號&#xff0c;當任務執行完成后會發出。你可以在任…

利用并行處理提高LabVIEW程序執行速度

在 LabVIEW 編程中&#xff0c;提升程序執行速度是優化系統性能的關鍵&#xff0c;而并行處理技術則是實現這一目標的有力武器。通過合理運用并行處理&#xff0c;不僅能加快程序運行&#xff0c;還能增強系統的穩定性和響應能力。下面將結合實際案例&#xff0c;深入探討如何利…

機器學習第三講:監督學習 → 帶答案的學習冊,如預測房價時需要歷史價格數據

機器學習第三講&#xff1a;監督學習 → 帶答案的學習冊&#xff0c;如預測房價時需要歷史價格數據 資料取自《零基礎學機器學習》。 查看總目錄&#xff1a;學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章&#xff1a;DeepSeek R1本地與線上滿血版部署&#xff1…

Open CASCADE學習|實現裁剪操作

1. 引言 Open CASCADE (簡稱OCC) 是一個功能強大的開源幾何建模內核&#xff0c;廣泛應用于CAD/CAM/CAE領域。裁剪操作作為幾何建模中的基礎功能&#xff0c;在模型編輯、布爾運算、幾何分析等方面有著重要作用。本文將全面探討Open CASCADE中的裁剪操作實現原理、應用場景及具…

【redis】分片方案

Redis分片&#xff08;Sharding&#xff09;是解決單機性能瓶頸的核心技術&#xff0c;其本質是將數據分散存儲到多個Redis節點&#xff08;實例&#xff09;中&#xff0c;每個實例將只是所有鍵的一個子集&#xff0c;通過水平擴展提升系統容量和性能。 分片的核心價值 性能提…

RGB矩陣照明系統詳解及WS2812配置指南

RGB矩陣照明系統詳解及WS2812配置指南 一、RGB矩陣照明簡介 RGB矩陣照明是一種強大的功能&#xff0c;允許使用外部驅動器驅動的RGB LED矩陣為鍵盤增添絢麗的燈光效果。該系統與RGBLIGHT功能無縫集成&#xff0c;因此您可以使用與RGBLIGHT相同的鍵碼來控制它&#xff0c;操作…

[250509] x-cmd 發布 v0.5.11 beta:x ping 優化、AI 模型新增支持和語言變量調整

目錄 X-CMD 發布 v0.5.11 beta&#x1f4c3;Changelog&#x1f9e9; ping&#x1f9e9; openai&#x1f9e9; gemini&#x1f9e9; asdf&#x1f9e9; mac? 升級指南 X-CMD 發布 v0.5.11 beta &#x1f4c3;Changelog &#x1f9e9; ping 調整 x ping 默認參數為 bing.com&a…

嵌入式開發學習日志Day17

第十一章 結構體與共用體 一、結構體 1、結構體 一般形式 【struct 標識符】 結構體中的標識符一般首字母大寫&#xff1b; 【.】結構體成員運算符&#xff1b; 優先級 1 級 結合方向&#xff1a;從左至右&#xff1b; 【->】:指向結構體成員運算符&#x…

發那科機器人5(異常事件和程序備份加載+ROBOGUIDE離線仿真)

發那科機器人5(異常事件和程序備份加載+ROBOGUIDE離線仿真) 一,異常事件和程序備份加載1,常見異常事件2,零點復歸介紹3,程序備份-加載(未整理)二,`ROBOGUIDE`離線仿真1,仿真軟件簡介及安裝步驟(未整理)2,機器人==導入與工具==與==工件添加==2.1,機器人導入(未整…

青少年編程與數學 02-019 Rust 編程基礎 01課題、環境準備

青少年編程與數學 02-019 Rust 編程基礎 01課題、環境準備 一、Rust核心特性應用場景開發工具社區與生態 二、Rust 和 Python 比較1. **內存安全與并發編程**2. **性能**3. **零成本抽象**4. **跨平臺支持**5. **社區與生態系統**6. **錯誤處理**7. **安全性**適用場景總結 三、…

Java反射 八股版

目錄 一、核心概念闡釋 1. Class類 2. Constructor類 3. Method類 4. Field類 二、典型應用場景 1. 框架開發 2. 單元測試 3. JSON序列化/反序列化 三、性能考量 四、安全與訪問控制 1. 安全管理器限制 2. 打破封裝性 3. 安全風險 五、版本兼容性問題 六、最佳…

操作系統的初步了解

目錄 引言&#xff1a;什么是操作系統&#xff1f; 一、設計操作系統的目的 二、操作系統是做什么的&#xff1a; 操作系統主要有四大核心任務&#xff1a; 1. 管理硬件 2. 運行軟件 3. 存儲數據 4. 提供用戶界面 如何理解操作系統的管理呢&#xff1f; 1. 什么是操作…

Mkdocs頁面如何嵌入PDF

嵌入PDF 嵌入PDF代碼 &#xff0c;注意PDF的相對地址 <iframe src"../個人簡歷.pdf (相對地址)" width"100%" height"800px" style"border: 1px solid #ccc; overflow: auto;"></iframe>我的完整代碼&#xff1a; <d…

鏈表結構深度解析:從單向無頭到雙向循環的實現全指南

上篇博客實現動態順序表時&#xff0c;我們會發現它存在許多弊端&#xff0c;如&#xff1a; ? 中間/頭部的插?刪除&#xff0c;時間復雜度為O(N) ? 增容需要申請新空間&#xff0c;拷?數據&#xff0c;釋放舊空間。會有不?的消耗。 ? 增容?般是呈2倍的增?&#xff0c;…