機器學習:模型選擇和模型優化

進行數據處理之后,我們得到了x_train和y_train,我們就可以用來進行回歸或分類模型訓練啦~

一、模型選擇

我們這里可能使用的是回歸模型(Regression),值得注意的是,回歸和分類不分家。分類是預測離散值,回歸是預測連續值,差不多。

展示這些是為了看到,不同的任務,可能需要不用的評分標準,評分時別亂套用。

評估度量

一、默認參數模型對比

一、無標準化

①K折交叉驗證? 模型評估

K折交叉驗證?模型評估,不重復抽樣將原始數據隨機分為 k 份。每一次挑選其中 1 份作為訓練集,剩余 k-1 份作為訓練集用于模型訓練。計算測試集上的得分。在這種情況下它只是用來計算模型得分的。

(這里說的測試集,嚴格上來講屬于整個機器學習過程中的驗證集)

回歸任務:

from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso  
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors  import  KNeighborsRegressor
from sklearn.svm import SVR 
from sklearn.metrics import mean_squared_error #MSE 
from sklearn.model_selection import cross_val_scoremodels = {}   #dict={k:v,k1:v1}  list=[1,2,3,4]  set=(1,2,3,4)
models['LR'] = LinearRegression()
models['LASSO'] = Lasso()
models['EN'] = ElasticNet()
models['KNN'] = KNeighborsRegressor()
models['CART'] = DecisionTreeRegressor()
models['SVM'] = SVR()scoring='neg_mean_squared_error'
#回歸模型,這里用均方誤差得分作為模型的優化標準,模型會盡量使得該指標最好#比較均方差
results=[]
for key in models:cv_result=cross_val_score(models[key],x_train,y_train,cv=10,scoring=scoring)
#cv指定的是交叉驗證的折數,k折交叉驗證會將訓練集分成k部分,然后每個部分計算一個分數。results.append(cv_result)    #list.append(t),這行語句的目的是為了以后畫圖用,但實際上print就能看到分數啦print('%s: %f (%f)'%(key,cv_result.mean(),cv_result.std()))#model = RandomForestClassifier(n_estimators= n_estimators)
#model.fit(X_train,y_train)
#mse = mean_squared_error(y_test,model.predict(X_test))
分類任務:(XGB和LGB是集成模型)
from lightgbm import LGBMClassifier
from xgboost import XGBClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_scoremodels = {}   #dict={k:v,k1:v1}  list=[1,2,3,4]  set=(1,2,3,4)
models['RFC'] = RandomForestClassifier()
models['XGB'] = XGBClassifier()
models['LGB'] = LGBMClassifier(verbose= -1)scoring='roc_auc'
#使用AUC評估#比較均方差
results=[]
for key in models:cv_result=cross_val_score(models[key],x_train,y_train,cv=10,scoring=scoring)
#cv指定的是交叉驗證的折數,k折交叉驗證會將訓練集分成k部分,然后每個部分計算一個分數。print('%s: %f (%f)'%(key,cv_result.mean(),cv_result.std()))
②先對模型進行訓練,然后計算得分

分類問題:

from lightgbm import LGBMClassifier
model = LGBMClassifier(verbose= -1)
model.fit(X_train,y_train)
#具體算什么得分,就靠你自己選了
#model.score() 函數通常計算的是模型的準確度(accuracy)
print('LGBM的訓練集得分:{}'.format(model.score(X_train,y_train)))
print('LGBM的測試集得分:{}'.format(model.score(X_test,y_test)))
from sklearn.metrics import roc_auc_score# 預測概率
y_train_proba = model.predict_proba(X_train)[:, 1]
y_test_proba = model.predict_proba(X_test)[:, 1]# 計算訓練集和測試集的AUC
train_auc = roc_auc_score(y_train, y_train_proba)
test_auc = roc_auc_score(y_test, y_test_proba)print('LGBM的訓練集AUC:{:.4f}'.format(train_auc))
print('LGBM的測試集AUC:{:.4f}'.format(test_auc))
回歸問題:
model = RandomForestRegressor(n_estimators= n_estimators)
model.fit(X_train,y_train)
mse = mean_squared_error(y_test,model.predict(X_test))
print('RandomForest_Regressor的訓練集得分:{}'.format(model.score(X_train,y_train)))
print('RandomForest_Regressor的測試集得分:{}'.format(model.score(X_test,y_test)))
print('RandomForest_Regressor的mse得分:{}'.format(model.score(X_test,y_test)))
二、pipeline正態化再訓練

Pipeline類似于一個管道,輸入的數據會從管道起始位置輸入,然后依次經過管道中的每一個部分最后輸出。沒啥區別其實()

from sklearn.pipeline import Pipeline
pipelines={}
pipelines['ScalerLR']=Pipeline([('Scaler',StandardScaler()),('LR',LinearRegression())])
pipelines['ScalerLASSO']=Pipeline([('Scaler',StandardScaler()),('LASSO',Lasso())])
pipelines['ScalerEN'] = Pipeline([('Scaler', StandardScaler()), ('EN', ElasticNet())])
pipelines['ScalerKNN'] = Pipeline([('Scaler', StandardScaler()), ('KNN', KNeighborsRegressor())])
pipelines['ScalerCART'] = Pipeline([('Scaler', StandardScaler()), ('CART', DecisionTreeRegressor())])
pipelines['ScalerSVM'] = Pipeline([('Scaler', StandardScaler()), ('SVM', SVR())])
#這個pipeline包含一個正態化~scoring='neg_mean_squared_error'results=[]
for key in pipelines:kfold=KFold(n_splits=num_flods,random_state=feed)cv_result=cross_val_score(pipelines[key],x_train,y_train,cv=kfold,scoring=scoring)results.append(cv_result)print('pipeline %s: %f (%f)'%(key,cv_result.mean(),cv_result.std()))

二、集成模型

#調參外,提高模型準確度是使用集成算法。

import numpy as np
from sklearn.model_selection import KFold, cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import AdaBoostRegressor, RandomForestRegressor, GradientBoostingRegressor, ExtraTreesRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import LinearRegressionnum_folds = 10
seed = 7
scoring = 'neg_mean_squared_error'ensembles = {}
ensembles['ScaledAB'] = Pipeline([('Scaler', StandardScaler()), ('AB', AdaBoostRegressor())])
ensembles['ScaledAB-KNN'] = Pipeline([('Scaler', StandardScaler()),('ABKNN', AdaBoostRegressor(base_estimator=KNeighborsRegressor(n_neighbors=3)))])
ensembles['ScaledAB-LR'] = Pipeline([('Scaler', StandardScaler()), ('ABLR', AdaBoostRegressor(LinearRegression()))])
ensembles['ScaledRFR'] = Pipeline([('Scaler', StandardScaler()), ('RFR', RandomForestRegressor())])
ensembles['ScaledETR'] = Pipeline([('Scaler', StandardScaler()), ('ETR', ExtraTreesRegressor())])
ensembles['ScaledGBR'] = Pipeline([('Scaler', StandardScaler()), ('RBR', GradientBoostingRegressor())])results = []
for key in ensembles:kfold = KFold(n_splits=num_flods, random_state=feed)cv_result = cross_val_score(ensembles[key], x_train, y_train, cv=kfold, scoring=scoring)results.append(cv_result)print('%s: %f (%f)' % (key, cv_result.mean(), cv_result.std()))

二、模型優化(網格搜索,隨便寫寫)

使用GridSearchCV進行網格搜索

一、普通模型網格搜索——隨機森林

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestRegressorparam_grid= {'n_estimators':[1,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,125,150,200],'max_features':('auto','sqrt','log2')}
#最佳迭代次數
#最大特征數
m = GridSearchCV(RandomForestRegressor(random_state=827),param_grid)
m = m.fit(X_train,y_train)
mse = mean_squared_error(y_test,m.predict(X_test))
print("該參數下得到的MSE值為:{}".format(mse))
print("該參數下得到的最佳得分為:{}".format(m.best_score_))
print("最佳參數為:{}".format(m.best_params_))

二、集成模型網格搜索——XGB

%%time
from xgboost import XGBClassifier
from sklearn.model_selection import GridSearchCV
# xgb  網格搜索,參數調優
# c初始參數
params = {'learning_rate': 0.1, 'n_estimators': 500, 'max_depth': 5, 'min_child_weight': 1, 'seed': 0,'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}
XGB_Regressor_Then_params = {'learning_rate': 0.1, 'n_estimators': 200, 'max_depth': 6, 'min_child_weight': 9, 'seed': 0,'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0.3, 'reg_alpha': 0, 'reg_lambda': 1}
# 最佳迭代次數:n_estimators、min_child_weight 、最大深度 max_depth、后剪枝參數 gamma、樣本采樣subsample 、 列采樣colsample_bytree
# L1正則項參數reg_alpha 、 L2正則項參數reg_lambda、學習率learning_rate
param_grid= {'n_estimators':[50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000,1250,1500,1750,2000],}
m = GridSearchCV(XGBClassifier(objective ='reg:squarederror',**params),param_grid,scoring='roc_auc')
m = m.fit(X_train,y_train)
mse = mean_squared_error(y_test, m.predict(X_test))
print('該參數下得到的最佳AUC為:{}'.format(m.best_score_))
print('最佳參數為:{}'.format(m.best_params_))print('XGB的AUC圖:')
lr_fpr, lr_tpr, lr_thresholds = roc_curve(y_test,m.predict_proba(X_test)[:,1])
lr_roc_auc = metrics.auc(lr_fpr, lr_tpr)
plt.figure(figsize=(8, 5))
plt.plot([0, 1], [0, 1],'--', color='r')
plt.plot(lr_fpr, lr_tpr, label='XGB(area = %0.2f)' % lr_roc_auc)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.show()

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

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

相關文章

策略的更新、加載與同步

C語言的C庫提供了策略的更新、加載與同步的方法,這里引入多線程,達到區分讀寫任務(生產者——消費者 模型)的目的。 示例: /*brief check strategy to update, reload, synchronized to read(stoped by SIGINT)author…

Mysql標量子查詢

目錄 子查詢標量子查詢數據準備 子查詢 SQL語句中嵌套select語句,稱為嵌套查詢,又稱子查詢。 SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2 ... );子查詢外部的語句可以是insert / update / delete / select 的任何一個&…

git的安裝、使用

文章目錄 安裝gitgit學習網站git初始配置具體配置信息 新建版本庫(倉庫)git的工作區域和文件狀態工作區域文件狀態git文件提交的基礎指令 git基礎指令1. 版本提交2. 分支創建3. 分支切換4. 分支合并(1) git merge(2) git rebase 5. 在git的提交樹上移動(…

Ps:銳化工具

銳化工具 Sharpen Tool可用于增強圖像局部區域的對比度,從而提高圖像的清晰度和細節,特別適用于提升照片的邊緣定義和紋理細節。 快捷鍵:無 ◆ ◆ ◆ 常用操作方法與技巧 1、如果直接在像素圖像上使用銳化工具,可嘗試使用“漸隱…

怎么優雅地訪問ChatGPT

ChatGPT,這顆璀璨的智能結晶,在2022年歲末之際,由OpenAI實驗室傾力鑄就,猶如夜空中躍動的智慧星辰,點亮了人工智能領域的新紀元。猶如汪洋中的一座燈塔,ChatGPT以其獨特的智慧光輝引人注目,然而…

Linux:kubernetes(k8s)node節點加入master主節點(3)

Linux:kubernetes(k8s)搭建mater節點(kubeadm,kubectl,kubelet)-CSDN博客https://blog.csdn.net/w14768855/article/details/136415575?spm1001.2014.3001.5502 我在上一章部署好了主節點&…

前端打包部署(黑馬學習筆記)

我們的前端工程開發好了,但是我們需要發布,那么如何發布呢?主要分為2步: 1.前端工程打包 2.通過nginx服務器發布前端工程 前端工程打包 接下來我們先來對前端工程進行打包 我們直接通過VS Code的NPM腳本中提供的build按鈕來完…

從下一代車規MCU厘清存儲器的發展(2)

目錄 1.概述 2.MCU大廠的選擇 2.1 瑞薩自研STT-MRAM 2.2 ST專注PCM 2.3 英飛凌和臺積電聯手RRAM 2.4 NXP如何計劃eNVM 3.小結 1.概述 上篇文章,我們簡述了當前主流的存儲器技術,現在我們來講講各大MCU大廠的技術選擇 2.MCU大廠的選擇 瑞薩日…

redis的RDB和AOF

Redis是一種高性能的鍵值對存儲系統,它支持多種類型的數據結構,如字符串、列表、集合、哈希表、有序集合等。Redis提供了兩種不同的持久化機制來確保數據的安全性:RDB(Redis Database)和AOF(Append Only Fi…

Tomcat布署及優化二-----Mysql和虛擬機

1.Mysql搭Blog 1.1下載安裝包 看一下tomcat狀態 1.2放到指定目錄 cp jpress-v3.2.1.war /usr/local/tomcat/webapps/ cd /usr/local/tomcat/webapps/ 1.3路徑優化 ln -s jpress-v3.2.1 jpress 看jpress權限 1.4生成配置文件 cat >/etc/yum.repos.d/mysql.repo <<E…

掘根寶典之C語言指針詳解

目錄 什么是指針&#xff1f; 與指針相關的運算符 指針類型的意義 指針的大小 初始化 將指針直接指向一個已經存在的變量或內存地址&#xff1a; 使用malloc函數動態分配內存&#xff0c;并將指針指向新分配的內存&#xff1a; 使用calloc函數動態分配內存&#xff0c;并…

Javascript:常量與數據類型

一、前言 介紹完變量之后我們來對常量進行了解一番&#xff0c;關于常量我們需要知道些什么呢&#xff1f; 二、正文 1.常量的基本使用 使用const聲明的變量稱為常量&#xff0c;當某個變量的字面量無需改動的時候就能夠用到常量。 //聲明一個常量 const G 9.8 //輸出這個常量…

您的計算機已被pings勒索病毒感染?恢復您的數據的方法在這里!

導言&#xff1a; 在數字時代&#xff0c;數據是企業和個人生活中不可或缺的一部分。然而&#xff0c;隨著勒索病毒的不斷進化和傳播&#xff0c;我們的數據面臨著前所未有的威脅。其中&#xff0c;.pings 勒索病毒是最新一輪威脅之一&#xff0c;它以其獨特的加密算法和無情的…

leetcode-字符串中的單詞數

434. 字符串中的單詞數 題解&#xff1a; 這個問題可以通過遍歷字符串&#xff0c;當遇到非空格字符時&#xff0c;判斷其前一個字符是否為空格&#xff0c;如果是&#xff0c;則說明這是一個新的單詞的開始&#xff0c;計數器加一。最后返回計數器的值即可。 class Solutio…

【Redis | 第一篇】快速了解Redis

文章目錄 1.快速了解Redis1.1簡介1.2與其他key-value存儲的不同處1.3Redis安裝——Windows環境1.3.1下載redis1.3.2啟動redis1.3.3進入redis客戶端1.3.4修改配置 1.4Redis安裝——Linux環境1.4.1安裝命令1.4.2啟動redis1.4.3進入redis客戶端 1.5配置修改1.6小結 1.快速了解Redi…

MyBatis 學習(七)之 緩存

目錄 1 MyBatis 緩存介紹 2 一級緩存 3 二級緩存 3.1 二級緩存介紹 3.2 二級緩存配置 3.3 二級緩存測試 4 參考文檔 1 MyBatis 緩存介紹 MyBatis 緩存是 MyBatis 中的一個重要特性&#xff0c;用于提高數據庫查詢的性能。MyBatis 提供了一級緩存和二級緩存兩種類型的緩存…

Git與GitHub:解鎖版本控制的魔法盒子

?? 歡迎大家來訪Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭?&#xff5e;?? &#x1f31f;&#x1f31f; 歡迎各位親愛的讀者&#xff0c;感謝你們抽出寶貴的時間來閱讀我的文章。 我是Srlua&#xff0c;在這里我會分享我的知識和經驗。&#x…

cetos7 Docker 安裝 gitlab

一、gitlab 簡單介紹和安裝要求 官方文檔&#xff1a;https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介紹 gitLab 是一個用于代碼倉庫管理系統的開源項目&#xff0c;使用git作為代碼管理工具&#xff0c;并在此基礎上搭建起來的Web服務平臺&#xff0c;通過該平…

(六)Dropout抑制過擬合與超參數的選擇--九五小龐

過擬合 即模型在訓練集上表現的很好&#xff0c;但是在測試集上效果卻很差。也就是說&#xff0c;在已知的數據集合中非常好&#xff0c;再添加一些新數據進來效果就會差很多 欠擬合 即模型在訓練集上表現的效果差&#xff0c;沒有充分利用數據&#xff0c;預測準確率很低&a…

笨辦法學 Python3 第五版(預覽)(一)

原文&#xff1a;Learn Python the Hard Way, 5th Edition (Early Release) 譯者&#xff1a;飛龍 協議&#xff1a;CC BY-NC-SA 4.0 模塊 1&#xff1a;Python 入門 練習 0&#xff1a;準備工作 這個練習沒有代碼。這只是你完成的練習&#xff0c;讓你的計算機運行 Python。…