❶ 一般優化linux的內核,需要優化什麼參數
Sysctl命令及linux內核參數調整
一、Sysctl命令用來配置與顯示在/proc/sys目錄中的內核參數.如果想使參數長期保存,可以通過編輯/etc/sysctl.conf文件來實現。
命令格式:
sysctl [-n] [-e] -w variable=value
sysctl [-n] [-e] -p (default /etc/sysctl.conf)
sysctl [-n] [-e] –a
常用參數的意義:
-w 臨時改變某個指定參數的值,如
# sysctl -w net.ipv4.ip_forward=1
-a 顯示所有的系統參數
-p從指定的文件載入系統參數,默認從/etc/sysctl.conf 文件中載入,如:
# echo 1 > /proc/sys/net/ipv4/ip_forward
# sysctl -w net.ipv4.ip_forward=1
以上兩種方法都可能立即開啟路由功能,但如果系統重啟,或執行了
# service network restart
命令,所設置的值即會丟失,如果想永久保留配置,可以修改/etc/sysctl.conf文件,將 net.ipv4.ip_forward=0改為net.ipv4.ip_forward=1
二、linux內核參數調整:linux 內核參數調整有兩種方式
方法一:修改/proc下內核參數文件內容,不能使用編輯器來修改內核參數文件,理由是由於內核隨時可能更改這些文件中的任意一個,另外,這些內核參數文件都是虛擬文件,實際中不存在,因此不能使用編輯器進行編輯,而是使用echo命令,然後從命令行將輸出重定向至 /proc 下所選定的文件中。如:將 timeout_timewait 參數設置為30秒:
# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
參數修改後立即生效,但是重啟系統後,該參數又恢復成默認值。因此,想永久更改內核參數,需要修改/etc/sysctl.conf文件
方法二.修改/etc/sysctl.conf文件。檢查sysctl.conf文件,如果已經包含需要修改的參數,則修改該參數的值,如果沒有需要修改的參數,在sysctl.conf文件中添加參數。如:
net.ipv4.tcp_fin_timeout=30
保存退出後,可以重啟機器使參數生效,如果想使參數馬上生效,也可以執行如下命令:
# sysctl -p
三、sysctl.conf 文件中參數設置及說明
proc/sys/net/core/wmem_max
最大socket寫buffer,可參考的優化值:873200
/proc/sys/net/core/rmem_max
最大socket讀buffer,可參考的優化值:873200
/proc/sys/net/ipv4/tcp_wmem
TCP寫buffer,可參考的優化值: 8192 436600 873200
/proc/sys/net/ipv4/tcp_rmem
TCP讀buffer,可參考的優化值: 32768 436600 873200
/proc/sys/net/ipv4/tcp_mem
同樣有3個值,意思是:
net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力.
net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段.
net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket.
上述內存單位是頁,而不是位元組.可參考的優化值是:786432 1048576 1572864
/proc/sys/net/core/netdev_max_backlog
進入包的最大設備隊列.默認是300,對重負載伺服器而言,該值太低,可調整到1000
/proc/sys/net/core/somaxconn
listen()的默認參數,掛起請求的最大數量.默認是128.對繁忙的伺服器,增加該值有助於網路性能.可調整到256.
/proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默認10K
/proc/sys/net/ipv4/tcp_max_syn_backlog
進入SYN包的最大請求隊列.默認1024.對重負載伺服器,可調整到2048
/proc/sys/net/ipv4/tcp_retries2
TCP失敗重傳次數,默認值15,意味著重傳15次才徹底放棄.可減少到5,盡早釋放內核資源.
/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
這3個參數與TCP KeepAlive有關.默認值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某個TCP連接在idle 2個小時後,內核才發起probe.如果probe 9次(每次75秒)不成功,內核才徹底放棄,認為該連接已失效.對伺服器而言,顯然上述值太大. 可調整到:
/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 3
/proc/sys/net/ipv4/ip_local_port_range
指定埠范圍的一個配置,默認是32768 61000,已夠大.
net.ipv4.tcp_syncookies = 1
表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1
表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout = 30
表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。
net.ipv4.tcp_keepalive_time = 1200
表示當keepalive起用的時候,TCP發送keepalive消息的頻度。預設是2小時,改為20分鍾。
net.ipv4.ip_local_port_range = 1024 65000
表示用於向外連接的埠范圍。預設情況下很小:32768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192
表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網路連接數。
net.ipv4.tcp_max_tw_buckets = 5000
表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並列印警告信息。默認為 180000,改為 5000。對於Apache、Nginx等伺服器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於Squid,效果卻不大。此項參數可以控制TIME_WAIT套接字的最大數量,避免Squid伺服器被大量的TIME_WAIT套接字拖死。
Linux上的NAT與iptables
談起Linux上的NAT,大多數人會跟你提到iptables。原因是因為iptables是目前在linux上實現NAT的一個非常好的介面。它通過和內核級直接操作網路包,效率和穩定性都非常高。這里簡單列舉一些NAT相關的iptables實例命令,可能對於大多數實現有多幫助。
這里說明一下,為了節省篇幅,這里把准備工作的命令略去了,僅僅列出核心步驟命令,所以如果你單單執行這些沒有實現功能的話,很可能由於准備工作沒有做好。如果你對整個命令細節感興趣的話,可以直接訪問我的《如何讓你的Linux網關更強大》系列文章,其中對於各個腳本有詳細的說明和描述。
# 案例1:實現網關的MASQUERADE
# 具體功能:內網網卡是eth1,外網eth0,使得內網指定本服務做網關可以訪問外網
EXTERNAL="eth0"
INTERNAL="eth1"
# 這一步開啟ip轉發支持,這是NAT實現的前提
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $EXTERNAL -j MASQUERADE
# 案例2:實現網關的簡單埠映射
# 具體功能:實現外網通過訪問網關的外部ip:80,可以直接達到訪問私有網路內的一台主機192.168.1.10:80效果
LOCAL_EX_IP=11.22.33.44 #設定網關的外網卡ip,對於多ip情況,參考《如何讓你的Linux網關更強大》系列文章
LOCAL_IN_IP=192.168.1.1 #設定網關的內網卡ip
INTERNAL="eth1" #設定內網卡
# 這一步開啟ip轉發支持,這是NAT實現的前提
echo 1 > /proc/sys/net/ipv4/ip_forward
# 載入需要的ip模塊,下面兩個是ftp相關的模塊,如果有其他特殊需求,也需要加進來
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
# 這一步實現目標地址指向網關外部ip:80的訪問都吧目標地址改成192.168.1.10:80
iptables -t nat -A PREROUTING -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10
# 這一步實現把目標地址指向192.168.1.10:80的數據包的源地址改成網關自己的本地ip,這里是192.168.1.1
iptables -t nat -A POSTROUTING -d 192.168.1.10 -p tcp --dport 80 -j SNAT --to $LOCAL_IN_IP
# 在FORWARD鏈上添加到192.168.1.10:80的允許,否則不能實現轉發
iptables -A FORWARD -o $INTERNAL -d 192.168.1.10 -p tcp --dport 80 -j ACCEPT
# 通過上面重要的三句話之後,實現的效果是,通過網關的外網ip:80訪問,全部轉發到內網的192.168.1.10:80埠,實現典型的埠映射
# 特別注意,所有被轉發過的數據都是源地址是網關內網ip的數據包,所以192.168.1.10上看到的所有訪問都好像是網關發過來的一樣,而看不到外部ip
# 一個重要的思想:數據包根據「從哪裡來,回哪裡去」的策略來走,所以不必擔心回頭數據的問題
# 現在還有一個問題,網關自己訪問自己的外網ip:80,是不會被NAT到192.168.1.10的,這不是一個嚴重的問題,但讓人很不爽,解決的方法如下:
iptables -t nat -A OUTPUT -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10
獲取系統中的NAT信息和診斷錯誤
了解/proc目錄的意義
在Linux系統中,/proc是一個特殊的目錄,proc文件系統是一個偽文件系統,它只存在內存當中,而不佔用外存空間。它包含當前系統的一些參數(variables)和狀態(status)情況。它以文件系統的方式為訪問系統內核數據的操作提供介面
通過/proc可以了解到系統當前的一些重要信息,包括磁碟使用情況,內存使用狀況,硬體信息,網路使用情況等等,很多系統監控工具(如HotSaNIC)都通過/proc目錄獲取系統數據。
另一方面通過直接操作/proc中的參數可以實現系統內核參數的調節,比如是否允許ip轉發,syn-cookie是否打開,tcp超時時間等。
獲得參數的方式:
第一種:cat /proc/xxx/xxx,如 cat /proc/sys/net/ipv4/conf/all/rp_filter
第二種:sysctl http://xxx.xxx.xxx,如 sysctl net.ipv4.conf.all.rp_filter
改變參數的方式:
第一種:echo value > /proc/xxx/xxx,如 echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
第二種:sysctl [-w] variable=value,如 sysctl [-w] net.ipv4.conf.all.rp_filter=1
以上設定系統參數的方式只對當前系統有效,重起系統就沒了,想要保存下來,需要寫入/etc/sysctl.conf文件中
通過執行 man 5 proc可以獲得一些關於proc目錄的介紹
查看系統中的NAT情況
和NAT相關的系統變數
/proc/slabinfo:內核緩存使用情況統計信息(Kernel slab allocator statistics)
/proc/sys/net/ipv4/ip_conntrack_max:系統支持的最大ipv4連接數,默認65536(事實上這也是理論最大值)
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 已建立的tcp連接的超時時間,默認432000,也就是5天
和NAT相關的狀態值
/proc/net/ip_conntrack:當前的前被跟蹤的連接狀況,nat翻譯表就在這里體現(對於一個網關為主要功能的Linux主機,裡面大部分信息是NAT翻譯表)
/proc/sys/net/ipv4/ip_local_port_range:本地開放埠范圍,這個范圍同樣會間接限制NAT表規模
# 1. 查看當前系統支持的最大連接數
cat /proc/sys/net/ipv4/ip_conntrack_max
# 值:默認65536,同時這個值和你的內存大小有關,如果內存128M,這個值最大8192,1G以上內存這個值都是默認65536
# 影響:這個值決定了你作為NAT網關的工作能力上限,所有區域網內通過這台網關對外的連接都將佔用一個連接,如果這個值太低,將會影響吞吐量
# 2. 查看tcp連接超時時間
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
# 值:默認432000(秒),也就是5天
# 影響:這個值過大將導致一些可能已經不用的連接常駐於內存中,佔用大量鏈接資源,從而可能導致NAT ip_conntrack: table full的問題
# 建議:對於NAT負載相對本機的 NAT表大小很緊張的時候,可能需要考慮縮小這個值,以盡早清除連接,保證有可用的連接資源;如果不緊張,不必修改
# 3. 查看NAT表使用情況(判斷NAT表資源是否緊張)
# 執行下面的命令可以查看你的網關中NAT表情況
cat /proc/net/ip_conntrack
# 4. 查看本地開放埠的范圍
cat /proc/sys/net/ipv4/ip_local_port_range
# 返回兩個值,最小值和最大值
# 下面的命令幫你明確一下NAT表的規模
wc -l /proc/net/ip_conntrack
#或者
grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print $1 ',' $2;}'
# 下面的命令幫你明確可用的NAT表項,如果這個值比較大,那就說明NAT表資源不緊張
grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print $1 ',' $3;}'
# 下面的命令幫你統計NAT表中佔用埠最多的幾個ip,很有可能這些傢伙再做一些bt的事情,嗯bt的事情:-)
cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10
# 上面這個命令有點瑕疵cut -d' ' -f10會因為命令輸出有些行缺項而造成統計偏差,下面給出一個正確的寫法:
cat /proc/net/ip_conntrack | perl -pe s/^(.*?)src/src/g | cut -d ' ' -f1 | cut -d '=' -f2 | sort | uniq -c | sort -nr | head -n 10
https://kernel.0voice.com/
❷ 參數優化的參數優化概念
模型參數優化是通過極小化目標函數使得模型輸出和實際觀測數據之間達到最佳的擬合程度,由於環境模型本身的復雜性,常規優化演算法難以達到參數空間上的全局最優。近年來,隨著計算機運算效率的快速提高,直接優化方法得到了進一步開發與廣泛應用。
優化模型參數,以滿足設計要求的過程包括以下任務:
1. 指定設計要求
2. 參數化設計目標
3. 指定優化選項
4. 運行優化
❸ 常見的優化方法有哪些
1.0.618法(黃金分割法) 2.插值法 3.坐標輪換法 4.梯度法 5.共軛方向法 6.復合形法 7.懲罰函數法
❹ 傳統的pid參數優化策略有哪幾種
1、增大系統的放大系數 。
2、增加積分環節,提高系統的型別。
自動控制(automatic control)是指在沒有人直接參與的情況下,利用外加的設備或裝置,使機器、設備或生產過程的某個工作狀態或參數自動地按照預定的規律運行。
❺ 當前流行的可用於參數優化的有哪些演算法
對稱密碼體系的代表是 DES AES
非對稱或者叫公鑰密碼體系的代表是 RSA ECC
HASH演算法的代表是 MD5 SHA-1 SHA-256 SHA-384 。。。
數字簽名的代表是 DSS
流密碼的代表是 RC4
over
這些是最主要的一些演算法 密碼學教科書上必講的 其實現在密碼加密演算法成百上千種 太多了
關鍵是要掌握它們的思想 很多演算法基本思想都是一樣的
❻ jeplus+ea如何做參數優化
jeplus+ea參數優化方法如下:
由於在進行大量的介面測試時,會有許多共同參數,為了更加優化以及高效的執行,我們將那些共同參數進行默認。測試計劃-添加-配置元件-請求默認值,填入每次都重復的數據,放在最頂部(注意作用域)。
當新建Http請求時,如果你沒有填寫那些共同的數據,Jmeter會自動調用頂部Http請求默認值中設置的參數,可調整Http請求默認值組件的位置來控製作用域。這樣就使我們的工作更加高效。
❼ 如何對XGBoost模型進行參數調優
XGBoost參數調優完全指南(附Python代碼)
譯註:文內提供的代碼和運行結果有一定差異,可以從這里完整代碼對照參考。另外,我自己跟著教程做的時候,發現我的庫無法解析字元串類型的特徵,所以只用其中一部分特徵做的,具體數值跟文章中不一樣,反而可以幫助理解文章。所以大家其實也可以小小修改一下代碼,不一定要完全跟著教程做~ ^0^
需要提前安裝好的庫:簡介如果你的預測模型表現得有些不盡如人意,那就用XGBoost吧。XGBoost演算法現在已經成為很多數據工程師的重要武器。它是一種十分精緻的演算法,可以處理各種不規則的數據。
構造一個使用XGBoost的模型十分簡單。但是,提高這個模型的表現就有些困難(至少我覺得十分糾結)。這個演算法使用了好幾個參數。所以為了提高模型的表現,參數的調整十分必要。在解決實際問題的時候,有些問題是很難回答的——你需要調整哪些參數?這些參數要調到什麼值,才能達到理想的輸出?
這篇文章最適合剛剛接觸XGBoost的人閱讀。在這篇文章中,我們會學到參數調優的技巧,以及XGboost相關的一些有用的知識。以及,我們會用Python在一個數據集上實踐一下這個演算法。你需要知道的XGBoost(eXtreme Gradient Boosting)是Gradient Boosting演算法的一個優化的版本。特別鳴謝:我個人十分感謝Mr Sudalai Rajkumar (aka SRK)大神的支持,目前他在AV Rank中位列第二。如果沒有他的幫助,就沒有這篇文章。在他的幫助下,我們才能給無數的數據科學家指點迷津。給他一個大大的贊!內容列表1、XGBoost的優勢
2、理解XGBoost的參數
3、調整參數(含示例)1、XGBoost的優勢XGBoost演算法可以給預測模型帶來能力的提升。當我對它的表現有更多了解的時候,當我對它的高准確率背後的原理有更多了解的時候,我發現它具有很多優勢:1、正則化標准GBM的實現沒有像XGBoost這樣的正則化步驟。正則化對減少過擬合也是有幫助的。 實際上,XGBoost以「正則化提升(regularized boosting)」技術而聞名。2、並行處理XGBoost可以實現並行處理,相比GBM有了速度的飛躍。 不過,眾所周知,Boosting演算法是順序處理的,它怎麼可能並行呢?每一課樹的構造都依賴於前一棵樹,那具體是什麼讓我們能用多核處理器去構造一個樹呢?我希望你理解了這句話的意思。 XGBoost 也支持Hadoop實現。3、高度的靈活性XGBoost 允許用戶定義自定義優化目標和評價標准 它對模型增加了一個全新的維度,所以我們的處理不會受到任何限制。4、缺失值處理XGBoost內置處理缺失值的規則。 用戶需要提供一個和其它樣本不同的值,然後把它作為一個參數傳進去,以此來作為缺失值的取值。XGBoost在不同節點遇到缺失值時採用不同的處理方法,並且會學習未來遇到缺失值時的處理方法。5、剪枝當分裂時遇到一個負損失時,GBM會停止分裂。因此GBM實際上是一個貪心演算法。 XGBoost會一直分裂到指定的最大深度(max_depth),然後回過頭來剪枝。如果某個節點之後不再有正值,它會去除這個分裂。 這種做法的優點,當一個負損失(如-2)後面有個正損失(如+10)的時候,就顯現出來了。GBM會在-2處停下來,因為它遇到了一個負值。但是XGBoost會繼續分裂,然後發現這兩個分裂綜合起來會得到+8,因此會保留這兩個分裂。6、內置交叉驗證XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。 而GBM使用網格搜索,只能檢測有限個值。7、在已有的模型基礎上繼續XGBoost可以在上一輪的結果上繼續訓練。這個特性在某些特定的應用上是一個巨大的優勢。 sklearn中的GBM的實現也有這個功能,兩種演算法在這一點上是一致的。相信你已經對XGBoost強大的功能有了點概念。注意這是我自己總結出來的幾點,你如果有更多的想法,盡管在下面評論指出,我會更新這個列表的!2、XGBoost的參數XGBoost的作者把所有的參數分成了三類:
1、通用參數:宏觀函數控制。
2、Booster參數:控制每一步的booster(tree/regression)。
3、學習目標參數:控制訓練目標的表現。
在這里我會類比GBM來講解,所以作為一種基礎知識。通用參數這些參數用來控制XGBoost的宏觀功能。1、booster[默認gbtree]選擇每次迭代的模型,有兩種選擇:
gbtree:基於樹的模型
gbliner:線性模型2、silent[默認0]當這個參數值為1時,靜默模式開啟,不會輸出任何信息。 一般這個參數就保持默認的0,因為這樣能幫我們更好地理解模型。3、nthread[默認值為最大可能的線程數]這個參數用來進行多線程式控制制,應當輸入系統的核數。 如果你希望使用CPU全部的核,那就不要輸入這個參數,演算法會自動檢測它。
還有兩個參數,XGBoost會自動設置,目前你不用管它。接下來咱們一起看booster參數。booster參數盡管有兩種booster可供選擇,我這里只介紹tree booster,因為它的表現遠遠勝過linear booster,所以linear booster很少用到。1、eta[默認0.3]和GBM中的 learning rate 參數類似。 通過減少每一步的權重,可以提高模型的魯棒性。 典型值為0.01-0.2。2、min_child_weight[默認1]決定最小葉子節點樣本權重和。 和GBM的 min_child_leaf 參數類似,但不完全一樣。XGBoost的這個參數是最小樣本權重的和,而GBM參數是最小樣本總數。 這個參數用於避免過擬合。當它的值較大時,可以避免模型學習到局部的特殊樣本。 但是如果這個值過高,會導致欠擬合。這個參數需要使用CV來調整。3、max_depth[默認6]和GBM中的參數相同,這個值為樹的最大深度。 這個值也是用來避免過擬合的。max_depth越大,模型會學到更具體更局部的樣本。 需要使用CV函數來進行調優。 典型值:3-104、max_leaf_nodes樹上最大的節點或葉子的數量。 可以替代max_depth的作用。因為如果生成的是二叉樹,一個深度為n的樹最多生成n2個葉子。 如果定義了這個參數,GBM會忽略max_depth參數。5、gamma[默認0]在節點分裂時,只有分裂後損失函數的值下降了,才會分裂這個節點。Gamma指定了節點分裂所需的最小損失函數下降值。 這個參數的值越大,演算法越保守。這個參數的值和損失函數息息相關,所以是需要調整的。6、max_delta_step[默認0]這參數限制每棵樹權重改變的最大步長。如果這個參數的值為0,那就意味著沒有約束。如果它被賦予了某個正值,那麼它會讓這個演算法更加保守。 通常,這個參數不需要設置。但是當各類別的樣本十分不平衡時,它對邏輯回歸是很有幫助的。 這個參數一般用不到,但是你可以挖掘出來它更多的用處。7、subsample[默認1]和GBM中的subsample參數一模一樣。這個參數控制對於每棵樹,隨機采樣的比例。 減小這個參數的值,演算法會更加保守,避免過擬合。但是,如果這個值設置得過小,它可能會導致欠擬合。 典型值:0.5-18、colsample_bytree[默認1]和GBM裡面的max_features參數類似。用來控制每棵隨機采樣的列數的佔比(每一列是一個特徵)。 典型值:0.5-19、colsample_bylevel[默認1]用來控制樹的每一級的每一次分裂,對列數的采樣的佔比。 我個人一般不太用這個參數,因為subsample參數和colsample_bytree參數可以起到相同的作用。但是如果感興趣,可以挖掘這個參數更多的用處。10、lambda[默認1]權重的L2正則化項。(和Ridge regression類似)。 這個參數是用來控制XGBoost的正則化部分的。雖然大部分數據科學家很少用到這個參數,但是這個參數在減少過擬合上還是可以挖掘出更多用處的。11、alpha[默認1]權重的L1正則化項。(和Lasso regression類似)。 可以應用在很高維度的情況下,使得演算法的速度更快。12、scale_pos_weight[默認1]在各類別樣本十分不平衡時,把這個參數設定為一個正值,可以使演算法更快收斂。學習目標參數這個參數用來控制理想的優化目標和每一步結果的度量方法。1、objective[默認reg:linear]這個參數定義需要被最小化的損失函數。最常用的值有:
binary:logistic 二分類的邏輯回歸,返回預測的概率(不是類別)。 multi:softmax 使用softmax的多分類器,返回預測的類別(不是概率)。
在這種情況下,你還需要多設一個參數:num_class(類別數目)。 multi:softprob 和multi:softmax參數一樣,但是返回的是每個數據屬於各個類別的概率。2、eval_metric[默認值取決於objective參數的取值]對於有效數據的度量方法。 對於回歸問題,默認值是rmse,對於分類問題,默認值是error。 典型值有:
rmse 均方根誤差(∑Ni=1?2N??????√) mae 平均絕對誤差(∑Ni=1|?|N) logloss 負對數似然函數值 error 二分類錯誤率(閾值為0.5) merror 多分類錯誤率 mlogloss 多分類logloss損失函數 auc 曲線下面積3、seed(默認0)隨機數的種子 設置它可以復現隨機數據的結果,也可以用於調整參數如果你之前用的是Scikit-learn,你可能不太熟悉這些參數。但是有個好消息,python的XGBoost模塊有一個sklearn包,XGBClassifier。這個包中的參數是按sklearn風格命名的。會改變的函數名是:
1、eta ->learning_rate
2、lambda->reg_lambda
3、alpha->reg_alpha
你肯定在疑惑為啥咱們沒有介紹和GBM中的』n_estimators』類似的參數。XGBClassifier中確實有一個類似的參數,但是,是在標准XGBoost實現中調用擬合函數時,把它作為』num_boosting_rounds』參數傳入。調整參數(含示例)我已經對這些數據進行了一些處理:City變數,因為類別太多,所以刪掉了一些類別。 DOB變數換算成年齡,並刪除了一些數據。 增加了 EMI_Loan_Submitted_Missing 變數。如果EMI_Loan_Submitted變數的數據缺失,則這個參數的值為1。否則為0。刪除了原先的EMI_Loan_Submitted變數。 EmployerName變數,因為類別太多,所以刪掉了一些類別。 因為Existing_EMI變數只有111個值缺失,所以缺失值補充為中位數0。 增加了 Interest_Rate_Missing 變數。如果Interest_Rate變數的數據缺失,則這個參數的值為1。否則為0。刪除了原先的Interest_Rate變數。 刪除了Lead_Creation_Date,從直覺上這個特徵就對最終結果沒什麼幫助。 Loan_Amount_Applied, Loan_Tenure_Applied 兩個變數的缺項用中位數補足。 增加了 Loan_Amount_Submitted_Missing 變數。如果Loan_Amount_Submitted變數的數據缺失,則這個參數的值為1。否則為0。刪除了原先的Loan_Amount_Submitted變數。 增加了 Loan_Tenure_Submitted_Missing 變數。如果 Loan_Tenure_Submitted 變數的數據缺失,則這個參數的值為1。否則為0。刪除了原先的 Loan_Tenure_Submitted 變數。 刪除了LoggedIn, Salary_Account 兩個變數 增加了 Processing_Fee_Missing 變數。如果 Processing_Fee 變數的數據缺失,則這個參數的值為1。否則為0。刪除了原先的 Processing_Fee 變數。 Source前兩位不變,其它分成不同的類別。 進行了量化和獨熱編碼(一位有效編碼)。如果你有原始數據,可以從資源庫裡面data_preparation的Ipython notebook 文件,然後自己過一遍這些步驟。首先,import必要的庫,然後載入數據。#Import libraries:
import pandas as pd
import numpy as np
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from sklearn import cross_validation, metrics #Additional scklearn functions
from sklearn.grid_search import GridSearchCV #Perforing grid search
import matplotlib.pylab as plt
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 12, 4
train = pd.read_csv('train_modified.csv')
target = 'Disbursed'
IDcol = 'ID'
注意我import了兩種XGBoost:xgb - 直接引用xgboost。接下來會用到其中的「cv」函數。 XGBClassifier - 是xgboost的sklearn包。這個包允許我們像GBM一樣使用Grid Search 和並行處理。在向下進行之前,我們先定義一個函數,它可以幫助我們建立XGBoost models 並進行交叉驗證。好消息是你可以直接用下面的函數,以後再自己的models中也可以使用它。def modelfit(alg, dtrain, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):
if useTrainCV:
xgb_param = alg.get_xgb_params()
xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)
cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)
alg.set_params(n_estimators=cvresult.shape[0])
#Fit the algorithm on the data
alg.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc')
#Predict training set:
dtrain_predictions = alg.predict(dtrain[predictors])
dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1]
#Print model report:
print "\nModel Report"
print "Accuracy : %.4g" % metrics.accuracy_score(dtrain['Disbursed'].values, dtrain_predictions)
print "AUC Score (Train): %f" % metrics.roc_auc_score(dtrain['Disbursed'], dtrain_predprob)
feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False)
feat_imp.plot(kind='bar', title='Feature Importances')
plt.ylabel('Feature Importance Score')
這個函數和GBM中使用的有些許不同。不過本文章的重點是講解重要的概念,而不是寫代碼。如果哪裡有不理解的地方,請在下面評論,不要有壓力。注意xgboost的sklearn包沒有「feature_importance」這個量度,但是get_fscore()函數有相同的功能。參數調優的一般方法。我們會使用和GBM中相似的方法。需要進行如下步驟:
選擇較高的學習速率(learning rate)。一般情況下,學習速率的值為0.1。但是,對於不同的問題,理想的學習速率有時候會在0.05到0.3之間波動。選擇對應於此學習速率的理想決策樹數量。XGBoost有一個很有用的函數「cv」,這個函數可以在每一次迭代中使用交叉驗證,並返回理想的決策樹數量。
2. 對於給定的學習速率和決策樹數量,進行決策樹特定參數調優(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在確定一棵樹的過程中,我們可以選擇不同的參數,待會兒我會舉例說明。
3. xgboost的正則化參數的調優。(lambda, alpha)。這些參數可以降低模型的復雜度,從而提高模型的表現。
4. 降低學習速率,確定理想參數。咱們一起詳細地一步步進行這些操作。第一步:確定學習速率和tree_based 參數調優的估計器數目。為了確定boosting 參數,我們要先給其它參數一個初始值。咱們先按如下方法取值:
1、max_depth = 5 :這個參數的取值最好在3-10之間。我選的起始值為5,但是你也可以選擇其它的值。起始值在4-6之間都是不錯的選擇。
2、min_child_weight = 1:在這里選了一個比較小的值,因為這是一個極不平衡的分類問題。因此,某些葉子節點下的值會比較小。
3、gamma = 0: 起始值也可以選其它比較小的值,在0.1到0.2之間就可以。這個參數後繼也是要調整的。
4、subsample,colsample_bytree = 0.8: 這個是最常見的初始值了。典型值的范圍在0.5-0.9之間。
5、scale_pos_weight = 1: 這個值是因為類別十分不平衡。
注意哦,上面這些參數的值只是一個初始的估計值,後繼需要調優。這里把學習速率就設成默認的0.1。然後用xgboost中的cv函數來確定最佳的決策樹數量。前文中的函數可以完成這個工作。#Choose all predictors except target IDcols
predictors = [x for x in train.columns if x not in [target,IDcol]]
xgb1 = XGBClassifier(
learning_rate =0.1,
n_estimators=1000,
max_depth=5,
min_child_weight=1,
gamma=0,
subsample=0.8,
colsample_bytree=0.8,
objective= 'binary:logistic',
nthread=4,
scale_pos_weight=1,
seed=27)
modelfit(xgb1, train, predictors)
從輸出結果可以看出,在學習速率為0.1時,理想的決策樹數目是140。這個數字對你而言可能比較高,當然這也取決於你的系統的性能。注意:在AUC(test)這里你可以看到測試集的AUC值。但是如果你在自己的系統上運行這些命令,並不會出現這個值。因為數據並不公開。這里提供的值僅供參考。生成這個值的代碼部分已經被刪掉了。<喎?"/kf/ware/vc/" target="_blank" class="keylink">="第二步-maxdepth-和-minweight-參數調優">第二步: max_depth 和 min_weight 參數調優我們先對這兩個參數調優,是因為它們對最終結果有很大的影響。首先,我們先大范圍地粗調參數,然後再小范圍地微調。
注意:在這一節我會進行高負荷的柵格搜索(grid search),這個過程大約需要15-30分鍾甚至更久,具體取決於你系統的性能。你也可以根據自己系統的性能選擇不同的值。param_test1 = {
'max_depth':range(3,10,2),
'min_child_weight':range(1,6,2)
}
gsearch1 = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, n_estimators=140, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'binary:logistic', nthread=4, scale_pos_weight=1, seed=27),
param_grid = param_test1, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch1.fit(train[predictors],train[target])
gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_
❽ 有哪些方法可以優化支持向量機SVM的參數
遺傳演算法 ,差分進化,粒子群,蟻群,模擬退火,人工魚群,蜂群,果蠅優化等都可以優化svm參數