周筆演算法
❶ 基於R語言的梯度推進演算法介紹
基於R語言的梯度推進演算法介紹
通常來說,我們可以從兩個方面來提高一個預測模型的准確性:完善特徵工程(feature engineering)或是直接使用Boosting演算法。通過大量數據科學競賽的試煉,我們可以發現人們更鍾愛於Boosting演算法,這是因為和其他方法相比,它在產生類似的結果時往往更加節約時間。
Boosting演算法有很多種,比如梯度推進(Gradient Boosting)、XGBoost、AdaBoost、Gentle Boost等等。每一種演算法都有自己不同的理論基礎,通過對它們進行運用,演算法之間細微的差別也能夠被我們所察覺。如果你是一個新手,那麼太好了,從現在開始,你可以用大約一周的時間來了解和學習這些知識。
在本文中,筆者將會向你介紹梯度推進演算法的基本概念及其復雜性,此外,文中還分享了一個關於如何在R語言中對該演算法進行實現的例子。
快問快答每當談及Boosting演算法,下列兩個概念便會頻繁的出現:Bagging和Boosting。那麼,這兩個概念是什麼,它們之間究竟有什麼區別呢?讓我們快速簡要地在這里解釋一下:
Bagging:對數據進行隨機抽樣、建立學習演算法並且通過簡單平均來得到最終概率結論的一種方法。
Boosting:與Bagging類似,但在樣本選擇方面顯得更為聰明一些——在演算法進行過程中,對難以進行分類的觀測值賦予了越來越大的權重。
我們知道你可能會在這方面產生疑問:什麼叫做越來越大?我怎麼知道我應該給一個被錯分的觀測值額外增加多少的權重呢?請保持冷靜,我們將在接下來的章節里為你解答。
從一個簡單的例子出發假設你有一個初始的預測模型M需要進行准確度的提高,你知道這個模型目前的准確度為80%(通過任何形式度量),那麼接下來你應該怎麼做呢?
有一個方法是,我們可以通過一組新的輸入變數來構建一個全新的模型,然後對它們進行集成學習。但是,筆者在此要提出一個更簡單的建議,如下所示:
Y= M(x) + error
如果我們能夠觀測到誤差項並非白雜訊,而是與我們的模型輸出(Y)有著相同的相關性,那麼我們為什麼不通過這個誤差項來對模型的准確度進行提升呢?比方說:
error = G(x) + error2
或許,你會發現模型的准確率提高到了一個更高的數字,比如84%。那麼下一步讓我們對error2進行回歸。
error2 = H(x) + error3
然後我們將上述式子組合起來:
Y = M(x) + G(x) + H(x) + error3
這樣的結果可能會讓模型的准確度更進一步,超過84%。如果我們能像這樣為三個學習演算法找到一個最佳權重分配,
Y = alpha * M(x) + beta * G(x) + gamma * H(x) + error4
那麼,我們可能就構建了一個更好的模型。
上面所述的便是Boosting演算法的一個基本原則,當我初次接觸到這一理論時,我的腦海中很快地冒出了這兩個小問題:
1.我們如何判斷回歸/分類方程中的誤差項是不是白雜訊?如果無法判斷,我們怎麼能用這種演算法呢?
2.如果這種演算法真的這么強大,我們是不是可以做到接近100%的模型准確度?
接下來,我們將會對這些問題進行解答,但是需要明確的是,Boosting演算法的目標對象通常都是一些弱演算法,而這些弱演算法都不具備只保留白雜訊的能力;其次,Boosting有可能導致過度擬合,所以我們必須在合適的點上停止這個演算法。
試著想像一個分類問題請看下圖:
從最左側的圖開始看,那條垂直的線表示我們運用演算法所構建的分類器,可以發現在這幅圖中有3/10的觀測值的分類情況是錯誤的。接著,我們給予那三個被誤分的「+」型的觀測值更高的權重,使得它們在構建分類器時的地位非常重要。這樣一來,垂直線就直接移動到了接近圖形右邊界的位置。反復這樣的過程之後,我們在通過合適的權重組合將所有的模型進行合並。
演算法的理論基礎我們該如何分配觀測值的權重呢?
通常來說,我們從一個均勻分布假設出發,我們把它稱為D1,在這里,n個觀測值分別被分配了1/n的權重。
步驟1:假設一個α(t);
步驟2:得到弱分類器h(t);
步驟3:更新總體分布,
其中,
步驟4:再次運用新的總體分布去得到下一個分類器;
覺得步驟3中的數學很可怕嗎?讓我們來一起擊破這種恐懼。首先,我們簡單看一下指數里的參數,α表示一種學習率,y是實際的回應值(+1或-1),而h(x)則是分類器所預測的類別。簡單來說,如果分類器預測錯了,這個指數的冪就變成了1 *α, 反之則是-1*α。也就是說,如果某觀測值在上一次預測中被預測錯誤,那麼它對應的權重可能會增加。那麼,接下來該做什麼呢?
步驟5:不斷重復步驟1-步驟4,直到無法發現任何可以改進的地方;
步驟6:對所有在上面步驟中出現過的分類器或是學習演算法進行加權平均,權重如下所示:
案例練習
最近我參加了由Analytics Vidhya組織的在線hackathon活動。為了使變數變換變得容易,在complete_data中我們合並了測試集與訓練集中的所有數據。我們將數據導入,並且進行抽樣和分類。
library(caret)rm(list=ls())setwd("C:Usersts93856DesktopAV")library(Metrics)complete <- read.csv("complete_data.csv", stringsAsFactors = TRUE)train <- complete[complete$Train == 1,]score <- complete[complete$Train != 1,]set.seed(999)ind <- sample(2, nrow(train), replace=T, prob=c(0.60,0.40))trainData<-train[ind==1,]testData <- train[ind==2,]set.seed(999)ind1 <- sample(2, nrow(testData), replace=T, prob=c(0.50,0.50))trainData_ens1<-testData[ind1==1,]testData_ens1 <- testData[ind1==2,]table(testData_ens1$Disbursed)[2]/nrow(testData_ens1)#Response Rate of 9.052%
接下來,就是構建一個梯度推進模型(Gradient Boosting Model)所要做的:
fitControl <- trainControl(method = "repeatedcv", number = 4, repeats = 4)trainData$outcome1 <- ifelse(trainData$Disbursed == 1, "Yes","No")set.seed(33)gbmFit1 <- train(as.factor(outcome1) ~ ., data = trainData[,-26], method = "gbm", trControl = fitControl,verbose = FALSE)gbm_dev <- predict(gbmFit1, trainData,type= "prob")[,2]gbm_ITV1 <- predict(gbmFit1, trainData_ens1,type= "prob")[,2]gbm_ITV2 <- predict(gbmFit1, testData_ens1,type= "prob")[,2]auc(trainData$Disbursed,gbm_dev)auc(trainData_ens1$Disbursed,gbm_ITV1)auc(testData_ens1$Disbursed,gbm_ITV2)
在上述案例中,運行代碼後所看到的所有AUC值將會非常接近0.84。我們隨時歡迎你對這段代碼進行進一步的完善。在這個領域,梯度推進模型(GBM)是最為廣泛運用的方法,在未來的文章里,我們可能會對GXBoost等一些更加快捷的Boosting演算法進行介紹。
結束語筆者曾不止一次見識過Boosting演算法的迅捷與高效,在Kaggle或是其他平台的競賽中,它的得分能力從未令人失望,當然了,也許這要取決於你能夠把特徵工程(feature engineering)做得多好了。
以上是小編為大家分享的關於基於R語言的梯度推進演算法介紹的相關內容,更多信息可以關注環球青藤分享更多干貨
❷ 名字的五行與筆畫怎麼算
《周易》有雲:窮則變,變則通,通則久,命理為一生定數,風水則是變數,知命而樂,知運而通。所謂「菩薩畏因、凡夫畏果」天道循環,命理批測、風水堪輿均能為您錦上添花,而不能雪中送炭!要正確認識風水作用,不懂的人如看天書,懂的人如獲至寶。本篇文章繼續和明通一起來了解傳承5000年的文化,誠摯希望能幫助到迷茫、困惑的您,為您的生活錦上添花,在您的人生中做一盞明燈。
中國文字由點和線構成,而點橫豎撇捺的筆畫,就是蘊含五行之秘密。究竟如何計算名字的五行與筆劃呢?相信很多朋友迷惑不解,今天就給朋友們說說。
1、名字的筆劃數體現其相應的五行
根據周易五行與數字關系,3、8為木,2、7為火,5、0為土,4、9為金,1、6為水的原則。
凡漢字不含有各五行的部首、偏旁、字義等的,其五行的性質便由其筆畫數確定:
尾數
3、8畫的字五行屬木,
2、7畫的字五行屬火,
5、0畫的字五行屬土,
4、9畫的字五行屬金,
1、6畫的字五行屬水。
如「文」字為四劃,則文的五行為金。又如萬字也為四劃,故其五行也屬金。余可以此類推。
2、周易五行的筆畫數同現在詞典的筆畫數演算法不同
首先,周易五行的筆畫數同現在詞典的筆畫數演算法稍為不同,它要求逢折算劃,如上述的萬字是四劃等。
其次,名字的筆劃演算法應按乾隆字典的筆畫來計算,下面會詳細介紹。
3、五行符合四柱八字喜用神的即為好名字
任何名字的好壞都要分析名字與人自身命理的喜忌關系,這是最重要的。
在起名或改名時,必須遵守的原則是文字五行的部首、偏旁、字義等的所屬五行優於文字的筆畫五行。起名時名字五行符合四柱八字喜用神的即為好名字,不必再為其進行所謂數理、五格等的吉凶推斷。即名字五行優先於其他的所謂數理、五格等的起名方法。
4、筆畫計算的一些特殊規定
因為中國的文字產生的根源本於自然造化之法則,是一種特殊的符號信息,其一點一劃,均不能忽視,它的筆畫數應按照乾隆字典的筆畫計算。以下是姓名學筆畫計算的一些特殊規定:
首先,朋友們要知道漢字數字所對應的筆劃:
一、1畫二、2畫三、3畫四、4畫五、5畫
六、6畫七、7畫八、8畫九、9畫十、10畫
其次,明通師傅提醒朋友們某些特殊部首的筆畫數:
扌(手),提手旁,按手字計,為四畫。
忄(心),豎心旁,按心字計,為四畫。
氵(水),三點旁,按水字計,為四畫。
犭(犬),犬字旁,按犬字計,為四畫。
礻(示),半禮旁,按示字計,為五畫。
王(玉),斜玉旁,按玉字計,為五畫。
艹(草),草字頭,按草字計,為六畫。
衤(衣),衣字旁,按衣字計,為六畫。
月(肉),肉字旁,按肉字計,為六畫。
辶(走),走馬旁,按走字計,為七畫。
阝(邑),右耳旁,按邑字計,為七畫。
阝(卓),左耳旁,按卓字計,為八畫。
再次,朋友們要知道字的五行定義原則
屬木的:本、術、榕、芸竺等。 屬火的:燦、熒、炳、日、昆等。
屬土的:聖、地、山、峰等。屬金的:銅、欽、剛、劍等。屬水的:浩、海、雪、霞等。
讀明白了上述介紹,相信朋友們就更能清楚了解名字是如何計算出五行與筆劃的。需要提醒朋友們的是,由於日本等鄰國也使用部分漢字,因此,他們對於漢字的應用顯然沒有咱們老祖宗更清楚明白。比如,名字中的所謂五格,就是日本人的「發明」,但是,往往與咱們的五行數理不吻合,因此,可能五格數適用與日本人的名字,對中國人還是不那麼合適,作為一種參考可以,但是,如果你非要按住不放,卻把咱們老祖宗的五行放棄,那麼,恐怕你是本未倒置了。
註:如果本篇文章幫助到各位緣主,可收藏並轉發,積無量公德!
