原文鏈接:http://tecdat.cn/?p=24354
原文出處:拓端數據部落公眾號
本文介紹簡化模型構建和評估過程。
caret包的train
函數可用於
- 使用重采樣評估模型調整參數對性能的影響
- 在這些參數中選擇“最佳”模型
- 從訓練集估計模型性能
首先,必須選擇特定的模型。
調整模型的第一步是選擇一組要評估的參數。例如,如果擬合偏最小二乘 (PLS) 模型,則必須指定要評估的 PLS 組件的數量。
一旦定義了模型和調整參數值,還應指定重采樣的類型。目前, k折交叉驗證(一次或重復)、留一法交叉驗證和引導(簡單估計或 632 規則)重采樣方法可以被 train
。重采樣后,該過程會生成性能測量的配置文件,可用於指導用戶選擇應選擇哪些調整參數值。默認情況下,該函數會自動選擇與最佳值相關的調整參數,盡管可以使用不同的算法。
聲納數據例子
在這里,我們加載數據:
-
-
str(Snr[, 1:10])
將數據的分層隨機樣本創建為訓練集和測試集:
-
-
iTraing <- creaDaaPatiion(Cls, p = .75, list = FALSE)
我們將使用這些數據說明此(和其他)頁面上的功能。
基本參數調優
默認情況下,簡單重采樣用於上述算法中的第 3 行。還有其他的,如重復 K折交叉驗證,留一法等。 指定重采樣的類型:
-
fit <- trainCnol(## 10-fold CV
-
meod = "rpaedcv",
-
-
## 重復10次
-
rpets = 10)
前兩個參數 train
分別是預測變量和結果數據對象。第三個參數 , method
指定模型的類型。為了說明,我們將通過 gbm 包。使用重復交叉驗證擬合此模型的基本語法如下所示:
-
train(
-
mehd = "gbm",
對於梯度提升機 (GBM) 模型,有三個主要調整參數:
- 迭代次數,即樹,(
n.trees
在gbm
函數中調用) - 樹的復雜度,稱為
interaction.depth
- 學習率:算法適應的速度,稱為
shrinkage
- 節點中開始分裂的最小訓練集樣本數 (
n.minobsinnode
)
為該模型測試的默認值顯示在前兩列中(shrinkage
並且 n.minobsinnode
未顯示,因為候選模型的網格集都對這些調整參數使用單個值)。標記為“ Accuracy
”的列是交叉驗證迭代的平均總體一致率。一致性標准偏差也是從交叉驗證結果中計算出來的。“ Kappa
”列是 Cohen 的(未加權的)Kappa 統計量在重采樣結果中的平均值。 train
適用於特定模型。對於這些模型, train
可以自動創建一個調整參數的網格。默認情況下,如果 p 是調整參數的數量,則網格大小為 3^p。再舉一個例子,正則化判別分析 (RDA) 模型有兩個參數 (gamma
和 lambda
),這兩個參數都介於 0 和 1 之間。默認訓練網格將在這個二維空間中產生九種組合。
train
下一節將介紹其中的其他功能 。
再現性注意事項
許多模型在估計參數的階段使用隨機數。此外,重采樣索引是使用隨機數選擇的。有兩種主要的方法來控制隨機性以確保可重復的結果。
- 有兩種方法可以確保在調用訓練時使用相同的重樣本。第一種是在調用訓練前使用set.seed。第一次使用隨機數是為了創建重采樣信息。另外,如果你想使用數據的特定分割,可以使用trainControl函數的索引參數。
- 當模型在重采樣中被創建時,種子也可以被設置。雖然在調用train之前設置種子可以保證使用相同的隨機數,但在使用並行處理時不太可能是這種情況(取決於利用的是哪種技術)。為了設置模型擬合的種子,trainControl有一個額外的參數叫種子,可以使用。這個參數的值是一個作為種子的整數向量的列表。trainControl的幫助頁面描述了這個選項的適當格式。
自定義調優過程
有幾種方法可以自定義選擇調整/復雜性參數和構建最終模型的過程。
預處理選項
如前所述,train
可以在模型擬合之前以各種方式對數據進行預處理。該功能 preProcess
是自動使用的。此函數可用於標准、插補(參見下文詳細信息)、通過主成分分析或獨立成分分析應用空間符號變換和特征提取。
為了指定應該進行什么預處理,該 train
函數有一個名為 的參數 preProcess
。 preProcess
函數的附加選項 可以通過trainControl
函數傳遞 。
這些處理步驟將在使用predict.train
, extractPrediction
或 生成的任何預測期間應用 extractProbs
(請參閱本文檔后面的詳細信息)。預處理 不會 應用於直接使用object$finalModel
對象的預測 。
對於插補,目前實現了三種方法:
- k -最近鄰采用具有缺失值的樣本,並 在訓練集中找到 k 個最接近的樣本。該 預測器的k 個訓練集值的平均值 用作原始數據的替代。在計算到訓練集樣本的距離時,計算中使用的預測變量是該樣本沒有缺失值且訓練集中沒有缺失值的預測變量。
- 另一種方法是使用訓練集樣本為每個預測因子擬合一個袋狀樹模型。這通常是一個相當准確的模型,可以處理缺失值。當一個樣本的預測器需要估算時,其他預測器的值會通過袋裝樹進行反饋,並將預測值作為新值。這個模型會有很大的計算成本。
- 預測器訓練集值的中位數可用於估計缺失數據。
如果訓練集中存在缺失值,PCA 和 ICA 模型僅使用完整樣本。
交替調諧網格
調諧參數網格可由用戶指定。該參數 tuneGrid
可以采用包含每個調整參數列的數據框。列名應該與擬合函數的參數相同。對於前面提到的 RDA 示例,名稱將是 gamma
和 lambda
。 train
將在行中的每個值組合上調整模型。
對於提升樹模型,我們可以固定學習率並評估三個以上的n.trees值。
-
expnd.grd(
-
n.trees = (1:30)*50,
-
)
-
-
-
Fit2
另一種選擇是使用可能的調整參數組合的隨機樣本,即“隨機搜索”。
要使用隨機搜索,請使用search = "random"
調用中 的選項 trainControl
。在這種情況下, tuneLength
參數定義了將被評估的參數組合的總數。
繪制重采樣圖像
該 plot
函數可用於檢查性能估計與調整參數之間的關系。例如,函數的簡單調用顯示了第一個性能度量的結果:
tels.pr.st(cretTe())
可以使用該metric
選項顯示其他性能指標 :
-
trels.r.st(carthme())
-
plt(Fit2, meric = "Kap")
也可以使用其他類型的繪圖。有關?plot.train
更多詳細信息,請參閱 。下面的代碼顯示了結果的熱圖:
-
trlipt(crTme())
-
plt(Fit2))
ggplot
還可以使用ggplot
方法:
ggplot( Fit2)
還有一些繪圖函數可以更詳細地表示重新采樣的估計值。有關?xyplot.train
更多詳細信息,請參閱 。
從這些圖中,可能需要一組不同的調諧參數。要更改最終值而無需再次啟動整個過程, update.train
可用於重新擬合最終模型。看 ?update.train
trainControl
功能
該函數 trainControl
生成參數,進一步控制模型的創建方式,可能的值:
方法。重新取樣的方法。"boot"、"cv"、"LOOCV"、"LGOCV"、"recomplatedcv"、"timeslice"、"none "和 "oob"。最后一個值,袋外估計值,只能由隨機森林、袋裝樹、袋裝地球、袋裝靈活判別分析或條件樹森林模型使用。GBM模型不包括在內。另外,對於留一法交叉驗證,沒有給出重采樣性能指標的不確定性估計。
number
和repeats
:number
控制K折交叉驗證中的折疊 次數或用於引導和離開組交叉驗證的重采樣迭代次數。repeats
僅適用於重復的 K折交叉驗證。假設method = "repeatedcv"
,number = 10
和repeats = 3
, 那么三個單獨的 10 折交叉驗證被用作重采樣方案。verboseIter
:輸出訓練日志。returnData
: 將數據保存到名為trainingData。
替代性能指標
用戶可以更改用於確定最佳設置的指標。默認情況下,為回歸計算RMSE、 R 2 和平均絕對誤差 (MAE),而為分類計算准確度和 Kappa。同樣默認情況下,參數值是分別使用 RMSE 和精度選擇的,分別用於回歸和分類。該 函數的 metric
參數 train
允許用戶控制使用哪個最優標准。例如,在一類中樣本百分比較低的問題中,使用 metric = "Kappa"
可以提高最終模型的質量。
如果這些參數都不令人滿意,用戶還可以計算自定義性能指標。該 trainControl
函數有一個參數 summaryFunction
,用於指定計算性能的函數。該函數應具有以下參數:
- data是一個數據框或矩陣的參考,其列名為obs和pred,用於觀察和預測結果值(用於回歸的數字數據或用於分類的字符值)。目前,類的概率沒有被傳遞給函數。data中的值是對單一調諧參數組合的保留預測值(及其相關參考值)。如果trainControl對象的classProbs參數被設置為 "true",數據中就會出現包含類概率的額外列。這些列的名稱與類的級別相同。另外,如果在調用訓練時指定了權重,那么數據集中也會有一列叫做權重的數據。
lev
是一個字符串,它具有從訓練數據中提取的結果因子級別。對於回歸,將 的值NULL
傳遞到函數中。model
是正在使用的模型的字符串(即傳遞給 的method
參數 的值train
)。
該函數的輸出應該是具有非空名稱的數字匯總指標的向量。默認情況下, train
根據預測類別評估分類模型。可選地,類概率也可用於衡量性能。要在重采樣過程中獲得預測的類概率,參數 classProbs
in trainControl
必須設置為 TRUE
。這將概率列合並到每個重采樣生成的預測中(每個類有一列,列名是類名)。
如上一節所示,自定義函數可用於計算重采樣的平均性能分數。計算 ROC 曲線下的靈敏度、特異性和面積:
head(toClamary)
要使用此標准重建提升樹模型,我們可以使用以下代碼查看調整參數與 ROC 曲線下面積之間的關系:
-
-
-
Fit3<- tran(C
-
mtric = "ROC")
在這種情況下,與最佳調整參數相關的 ROC 曲線下的平均面積在 100 次重采樣中為 0.922。
選擇最終模型
自定義調整過程的另一種方法是修改用於選擇“最佳”參數值的算法,給定性能數字。默認情況下,該 train
函數選擇具有最大性能值(或最小,對於回歸模型中的均方誤差)的模型。可以使用其他選擇模型的方案。 Breiman et al (1984) 為簡單的基於樹的模型建議了“一個標准錯誤規則”。在這種情況下,識別出具有最佳性能值的模型,並使用重采樣來估計性能的標准誤差。使用的最終模型是(經驗上的)最佳模型的一個標准誤差范圍內的最簡單模型。對於簡單的樹,這是有道理的,因為隨着這些模型越來越針對訓練數據,它們將開始過度擬合。
train
允許用戶指定用於選擇最終模型的替代規則。該參數 selectionFunction
可用於提供一個函數來通過算法確定最終模型。包中現有三個函數: best
是選擇最大/最小值, oneSE
嘗試捕捉精神 Breiman et al (1984) 並 tolerance
在最佳值的某個百分比容差范圍內選擇最不復雜的模型。
可以使用用戶定義的函數,只要它們具有以下參數:
x
是一個包含調整參數及其相關性能指標的數據框。每行對應一個不同的調整參數組合。metric
指示哪些性能度量應該被優化的字符串(這在直接從傳遞metric
的自變量train
。maximize
是一個單一的邏輯值,指示性能指標的較大值是否更好(這也直接從調用傳遞到train
)。
該函數應輸出一個整數,指示x
選擇了哪一行 。
舉個例子,如果我們根據整體精度選擇之前的 boosted 樹模型,我們會選擇:n.trees = 1450,interaction.depth = 5,shrinkage = 0.1,n.minobsinnode = 20。該圖相當緊湊,准確度值從 0.863 到 0.922 不等。一個不太復雜的模型(例如更少、更淺的樹)也可能產生可接受的准確性。
容差函數可用於基於 ( x - x best)/ x bestx 100(百分比差異)找到不太復雜的模型。例如,要根據 2% 的性能損失選擇參數值:
-
tolrae(rslts, merc = "ROC",
-
tol = 2, mxiie = TRUE)
resul[whTwc,1:6]
這表明我們可以得到一個不太復雜的模型,其 ROC 曲線下的面積為 0.914(與“選擇最佳”值 0.922 相比)。
這些函數的主要問題與從最簡單到復雜的模型排序有關。在某些情況下,這很容易(例如簡單的樹、偏最小二乘法),但在這種模型的情況下,模型的排序是主觀的。例如,使用 100 次迭代且樹深度為 2 的提升樹模型是否比使用 50 次迭代且深度為 8 的模型更復雜?該包做出了一些選擇。在提升樹的情況下,該包假設增加迭代次數比增加樹深度更快地增加復雜性,因此模型按迭代次數排序,然后按深度排序。
提取預測和類別概率
如前所述,由訓練函數產生的對象在finalModel子對象中包含 "優化 "的模型。可以像往常一樣從這些對象中進行預測。在某些情況下,比如pls或gbm對象,可能需要指定來自優化后擬合的額外參數。在這些情況下,訓練對象使用參數優化的結果來預測新的樣本。例如,如果使用predict.gbm創建預測,用戶必須直接指定樹的數量(沒有默認)。另外,對於二元分類,該函數的預測采取的是其中一個類的概率形式,所以需要額外的步驟將其轉換為因子向量。predict.train自動處理這些細節(以及其他模型)。
此外,R 中模型預測的標准語法很少。例如,為了獲得類概率,許多 predict
方法都有一個稱為參數的參數 type
,用於指定是否應該生成類或概率。不同的包使用不同的值 type
,例如 "prob"
, "posterior"
, "response"
, "probability"
或 "raw"
。在其他情況下,使用完全不同的語法。
對於predict.train,類型選項被標准化為 "class "和 "prob"。比如說。
prdit(it3, nwta = hadetn))
prdit(Ft3, ewata = hed(ttig), tye = "pob")
探索和比較重采樣分布
模型內
例如,以下語句創建一個密度圖:
-
tlisaret(crtTe())
-
deiplt(Ft3, pch = "|")
請注意,如果您有興趣繪制多個調整參數的重采樣結果,resamples = "all"
則應在控制對象中使用該選項 。
模型間
表征模型之間的差異(使用產生的 train
, sbf
或 rfe
通過它們的重新采樣分布)。
首先,支持向量機模型擬合聲納數據。使用preProc
參數對數據進行標准化 。請注意,相同的隨機數種子設置在與用於提升樹模型的種子相同的模型之前。
-
set.sed(25)
-
Ft <- tran(
-
preProc = c("center", "scale"),
-
-
metric = "ROC")
此外,還擬合了正則化判別分析模型。
-
Fit <- tn(
-
method = "rda")
鑒於這些模型,我們能否對它們的性能差異做出統計陳述?為此,我們首先使用 收集重采樣結果 。
rsa <- resamples()
summary
有幾種點陣圖方法可用於可視化重采樣分布:密度圖、盒須圖、散點圖矩陣和匯總統計的散點圖。例如:
-
the <- elia.get(
-
ptsyol$col = rb(.2, ., .2, .4)
-
plot(resamp, layot = c(3, 1))
由於模型是在相同版本的訓練數據上擬合的,對模型之間的差異進行推斷是有意義的。通過這種方式,我們減少了可能存在的樣本內相關性。我們可以計算差異,然后使用一個簡單的t檢驗來評估模型之間沒有差異的無效假設。
diValu
summary
plot(diVls, lyu = c(3, 1))
plot(fVue)
沒有參數調整的擬合模型
在模型調整值已知的情況下, train
可用於將模型擬合到整個訓練集,無需任何重采樣或參數調整。可以使用 using method = "none"
選項 trainControl
。例如:
-
tronol(mtd = "none", csPrs = TRUE)
-
Fit4
請注意 plot.train
, resamples
, confusionMatrix.train
和其他幾個函數不適用於此對象,但其他函數 predict.train
將:
prdct(Fit4, newdata )
prdit(Fit4, newdata , tpe = "prb")
最受歡迎的見解
3.python中使用scikit-learn和pandas決策樹
7.用機器學習識別不斷變化的股市狀況——隱馬爾可夫模型的應用