【零基础入门数据挖掘】-建模调参
?Datawhale?
作者:徐韜?,Datawhale優(yōu)秀學(xué)習(xí)者
摘要:對(duì)于數(shù)據(jù)挖掘項(xiàng)目,本文將學(xué)習(xí)如何建模調(diào)參?從簡(jiǎn)單的模型開始,如何去建立一個(gè)模型;如何進(jìn)行交叉驗(yàn)證;如何調(diào)節(jié)參數(shù)優(yōu)化等。
建模調(diào)參:特征工程也好,數(shù)據(jù)清洗也罷,都是為最終的模型來(lái)服務(wù)的,模型的建立和調(diào)參決定了最終的結(jié)果。模型的選擇決定結(jié)果的上限, 如何更好的去達(dá)到模型上限取決于模型的調(diào)參。
數(shù)據(jù)及背景
https://tianchi.aliyun.com/competition/entrance/231784/information(阿里天池-零基礎(chǔ)入門數(shù)據(jù)挖掘)
理論簡(jiǎn)介
模型調(diào)參基于特征工程所構(gòu)建的模型上限來(lái)優(yōu)化模型。由于模型的不同和復(fù)雜度,模型的參數(shù)數(shù)量也都不一樣。線性模型需要調(diào)整正則化的系數(shù),而對(duì)于非線性模型,例如隨機(jī)森林和LGB等模型,需要調(diào)節(jié)的參數(shù)增多。
模型調(diào)參的目的就是提升模型的性能度量。對(duì)于回歸算法,我們要降低模型在未知的數(shù)據(jù)上的誤差;對(duì)于分類算法,我們要提高模型在未知數(shù)據(jù)上的準(zhǔn)確率。
知識(shí)總結(jié)
回歸分析
回歸分析是一種統(tǒng)計(jì)學(xué)上分析數(shù)據(jù)的方法,目的在于了解兩個(gè)或多個(gè)變量間是否相關(guān)、相關(guān)方向與強(qiáng)度,并建立數(shù)學(xué)模型。以便通過(guò)觀察特定變量(自變量),來(lái)預(yù)測(cè)研究者感興趣的變量(因變量)
一般形式:
向量形式:
其中向量代表一條樣本,其中代表樣本的各個(gè)特征,是一條向量代表了每個(gè)特征所占的權(quán)重,b是一個(gè)標(biāo)量代表特征都為0時(shí)的預(yù)測(cè)值,可以視為模型的basis或者bias。
損失函數(shù)我們希望的是能夠減少在測(cè)試集上的預(yù)測(cè)值與真實(shí)值的差別,從而獲得一個(gè)最佳的權(quán)重參數(shù),因此這里采用最小二乘估計(jì)。
長(zhǎng)尾分布
這種分布會(huì)使得采樣不準(zhǔn),估值不準(zhǔn),因?yàn)槲膊空剂撕艽蟛糠帧A硪环矫?#xff0c;尾部的數(shù)據(jù)少,人們對(duì)它的了解就少,那么如果它是有害的,那么它的破壞力就非常大,因?yàn)槿藗儗?duì)它的預(yù)防措施和經(jīng)驗(yàn)比較少。
欠擬合與過(guò)擬合
欠擬合:訓(xùn)練的模型在訓(xùn)練集上面的表現(xiàn)很差,在驗(yàn)證集上面的表現(xiàn)也很差。即訓(xùn)練誤差和泛化誤差都很大。原因:
模型沒(méi)有很好或足夠數(shù)量的訓(xùn)練訓(xùn)練集
模型的訓(xùn)練特征過(guò)于簡(jiǎn)單
過(guò)擬合:模型的訓(xùn)練誤差遠(yuǎn)小于它在測(cè)試數(shù)據(jù)集上的誤差。即訓(xùn)練誤差不錯(cuò),但是泛化誤差比訓(xùn)練誤差相差太多。原因:
模型沒(méi)有很好或足夠數(shù)量的訓(xùn)練訓(xùn)練集
訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)有偏差
模型的訓(xùn)練過(guò)度,過(guò)于復(fù)雜,沒(méi)有學(xué)到主要的特征
由此引出模型復(fù)雜度概念模型中的參數(shù),一個(gè)簡(jiǎn)單的二元線性的函數(shù)只有兩個(gè)權(quán)重,而多元的復(fù)雜的函數(shù)的權(quán)重可能會(huì)什么上百上千個(gè)。
模型復(fù)雜度太低(參數(shù)過(guò)少),模型學(xué)習(xí)得太少,就難以訓(xùn)練出有效的模型,便會(huì)出現(xiàn)欠擬合。模型復(fù)雜度太高(參數(shù)很多),即模型可訓(xùn)練空間很大,容易學(xué)習(xí)過(guò)度,甚至于也將噪聲數(shù)據(jù)學(xué)習(xí)了,便會(huì)出現(xiàn)過(guò)擬合。
正則化
損失函數(shù)后面會(huì)添加一個(gè)額外項(xiàng),稱作 L1正則化 和 L2正則化,或者 L1范數(shù)和 L2范數(shù)。
L1正則化和L2正則化可以看做是損失函數(shù)的懲罰項(xiàng)。所謂『懲罰』是指對(duì)損失函數(shù)中的某些參數(shù)做一些限制。對(duì)于線性回歸模型,使用L1正則化的模型建叫做Lasso回歸,使用L2正則化的模型叫做Ridge回歸(嶺回歸)。
L1正則化模型:
L2正則化模型:
正則化說(shuō)明:
L1正則化是指權(quán)值向量中各個(gè)元素的絕對(duì)值之和,通常表示為
L2正則化是指權(quán)值向量中各個(gè)元素的平方和然后再求平方根(可以看到Ridge回歸的L2正則化項(xiàng)有平方符號(hào))
正則化作用:
L1正則化可以產(chǎn)生稀疏權(quán)值矩陣,即產(chǎn)生一個(gè)稀疏模型,可以用于特征選擇
L2正則化可以防止模型過(guò)擬合(overfitting)
調(diào)參方法
貪心調(diào)參 (坐標(biāo)下降)
坐標(biāo)下降法是一類優(yōu)化算法,其最大的優(yōu)勢(shì)在于不用計(jì)算待優(yōu)化的目標(biāo)函數(shù)的梯度。最容易想到一種特別樸實(shí)的類似于坐標(biāo)下降法的方法,與坐標(biāo)下降法不同的是,不是循環(huán)使用各個(gè)參數(shù)進(jìn)行調(diào)整,而是貪心地選取了對(duì)整體模型性能影響最大的參數(shù)。參數(shù)對(duì)整體模型性能的影響力是動(dòng)態(tài)變化的,故每一輪坐標(biāo)選取的過(guò)程中,這種方法在對(duì)每個(gè)坐標(biāo)的下降方向進(jìn)行一次直線搜索(line search)
網(wǎng)格調(diào)參GridSearchCV
作用是在指定的范圍內(nèi)可以自動(dòng)調(diào)參,只需將參數(shù)輸入即可得到最優(yōu)化的結(jié)果和參數(shù)。相對(duì)于人工調(diào)參更省時(shí)省力,相對(duì)于for循環(huán)方法更簡(jiǎn)潔靈活,不易出錯(cuò)。
貝葉斯調(diào)參
貝葉斯優(yōu)化通過(guò)基于目標(biāo)函數(shù)的過(guò)去評(píng)估結(jié)果建立替代函數(shù)(概率模型),來(lái)找到最小化目標(biāo)函數(shù)的值。貝葉斯方法與隨機(jī)或網(wǎng)格搜索的不同之處在于,它在嘗試下一組超參數(shù)時(shí),會(huì)參考之前的評(píng)估結(jié)果,因此可以省去很多無(wú)用功。
超參數(shù)的評(píng)估代價(jià)很大,因?yàn)樗笫褂么u(píng)估的超參數(shù)訓(xùn)練一遍模型,而許多深度學(xué)習(xí)模型動(dòng)則幾個(gè)小時(shí)幾天才能完成訓(xùn)練,并評(píng)估模型,因此耗費(fèi)巨大。貝葉斯調(diào)參發(fā)使用不斷更新的概率模型,通過(guò)推斷過(guò)去的結(jié)果來(lái)“集中”有希望的超參數(shù)。
建模與調(diào)參
線性回歸
模型建立
先使用線性回歸來(lái)查看一下用線性回歸模型來(lái)擬合我們的題目會(huì)有那些缺點(diǎn)。這里使用了 sklearn 的 LinearRegression。
sklearn.linear_model.LinearRegression(fit_intercept=True,normalize=False,copy_X=True,n_jobs=1 model = LinearRegression(normalize=True) model.fit(data_x, data_y)model.intercept_,?model.coef_查看訓(xùn)練的線性回歸模型的截距與權(quán)重
'intercept:'+?str(model.intercept_)sorted(dict(zip(continuous_feature_names,?model.coef_)).items(),?key=lambda?x:x[1],?reverse=True)## output 對(duì)上下文代碼涉及到的函數(shù)功能進(jìn)行簡(jiǎn)單介紹:| 函數(shù) | 功能 |
| zip() | 可以將兩個(gè)可迭代的對(duì)象,組合返回成一個(gè)元組數(shù)據(jù) |
| dict() | 元組數(shù)據(jù)構(gòu)建字典 |
| items() | 以列表返回可遍歷的(鍵, 值) 元組數(shù)組 |
| sort(iterable, cmp, key, reverse) | 排序函數(shù) |
| iterable | 指定要排序的list或者iterable |
| key | 指定取待排序元素的哪一項(xiàng)進(jìn)行排序 - 這里x[1]表示按照列表中第二個(gè)元素排序 |
| reverse | 是一個(gè)bool變量,表示升序還是降序排列,默認(rèn)為False(升序) |
| np.quantile(train_y, 0.9) | 求train_y 的90%的分位數(shù) |
下面這個(gè)代碼是把價(jià)格大于90%分位數(shù)的部分截?cái)嗔?就是長(zhǎng)尾分布截?cái)?/p>
繪制特征v_9的值與標(biāo)簽的散點(diǎn)圖,圖片發(fā)現(xiàn)模型的預(yù)測(cè)結(jié)果(藍(lán)色點(diǎn))與真實(shí)標(biāo)簽(黑色點(diǎn))的分布差異較大。
且預(yù)測(cè)值price出現(xiàn)負(fù)數(shù),查看price分布 出現(xiàn)長(zhǎng)尾分布 不符合正態(tài)分布。
線性回歸解決方案
1. 進(jìn)行l(wèi)og變化
2. 進(jìn)行可視化,發(fā)現(xiàn)預(yù)測(cè)結(jié)果與真實(shí)值較為接近,且未出現(xiàn)異常狀況。
交叉驗(yàn)證
大概說(shuō)一下sklearn的交叉驗(yàn)證的使用方法, 下文會(huì)有很多使用:
| verbose | 日志顯示 |
| verbose = 0 | 為不在標(biāo)準(zhǔn)輸出流輸出日志信息 |
| verbose = 1 | 為輸出進(jìn)度條記錄 |
| verbose = 2 | 為每個(gè)epoch輸出一行記錄 |
K折交叉驗(yàn)證是將原始數(shù)據(jù)分成K組,將每個(gè)子集數(shù)據(jù)分別做一次驗(yàn)證集,其余的K-1組子集數(shù)據(jù)作為訓(xùn)練集,這樣會(huì)得到K個(gè)模型,用這K個(gè)模型最終的驗(yàn)證集分類準(zhǔn)確率的平均數(shù),作為此K折交叉驗(yàn)證下分類器的性能指標(biāo)。此處,采用五折交叉驗(yàn)證。
但在事實(shí)上,由于我們并不具有預(yù)知未來(lái)的能力,五折交叉驗(yàn)證在某些與時(shí)間相關(guān)的數(shù)據(jù)集上反而反映了不真實(shí)的情況。
通過(guò)2018年的二手車價(jià)格預(yù)測(cè)2017年的二手車價(jià)格,這顯然是不合理的,因此我們還可以采用時(shí)間順序?qū)?shù)據(jù)集進(jìn)行分隔。
在本例中,我們選用靠前時(shí)間的4/5樣本當(dāng)作訓(xùn)練集,靠后時(shí)間的1/5當(dāng)作驗(yàn)證集,最終結(jié)果與五折交叉驗(yàn)證差距不大。
import datetimesample_feature = sample_feature.reset_index(drop=True)split_point = len(sample_feature) // 5 * 4train = sample_feature.loc[:split_point].dropna()val = sample_feature.loc[split_point:].dropna() train_X = train[continuous_feature_names]train_y_ln = np.log(train['price'] + 1)val_X = val[continuous_feature_names]val_y_ln = np.log(val['price'] + 1) model = model.fit(train_X, train_y_ln)fill_between()
train_sizes - 第一個(gè)參數(shù)表示覆蓋的區(qū)域
train_scores_mean - train_scores_std - 第二個(gè)參數(shù)表示覆蓋的下限
train_scores_mean + train_scores_std - 第三個(gè)參數(shù)表示覆蓋的上限
color - 表示覆蓋區(qū)域的顏色
alpha - 覆蓋區(qū)域的透明度,越大越不透明 [0,1]
預(yù)測(cè)結(jié)果查看:
mean_absolute_error(val_y_ln, model.predict(val_X))0.19443858353490887可視化處理
繪制學(xué)習(xí)率曲線與驗(yàn)證曲線
線性模型
先來(lái)對(duì)比一下三個(gè)lr模型的情況:
models = [LinearRegression(), Ridge(), Lasso()]result = dict()for model in models: model_name = str(model).split('(')[0] scores = cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)) result[model_name] = scores print(model_name + ' is finished') result = pd.DataFrame(result)result.index = ['cv' + str(x) for x in range(1, 6)]result 結(jié)果對(duì)比如下:LinearRegression線性回歸:Lasso回歸:L1正則化有助于生成一個(gè)稀疏權(quán)值矩陣,進(jìn)而可以用于特征選擇。由此發(fā)現(xiàn)power與userd_time特征非常重要。
Ridge回歸:
L2正則化在擬合過(guò)程中通常都傾向于讓權(quán)值盡可能小,最后構(gòu)造一個(gè)所有參數(shù)都比較小的模型,因?yàn)橐话阏J(rèn)為參數(shù)值小的模型比較簡(jiǎn)單,能適應(yīng)不同的數(shù)據(jù)集,也在一定程度上避免了過(guò)擬合現(xiàn)象。
非線性模型
SVM 通過(guò)尋求結(jié)構(gòu)化風(fēng)險(xiǎn)最小來(lái)提高學(xué)習(xí)機(jī)泛化能力,基本模型定義為特征空間上的間隔最大的線性分類器支持向量機(jī)的學(xué)習(xí)策略便是間隔最大化。SVR:用于標(biāo)簽連續(xù)值的回歸問(wèn)題 SVC:用于分類標(biāo)簽的分類問(wèn)題Boosting 一堆弱分類器的組合就可以成為一個(gè)強(qiáng)分類器;不斷地在錯(cuò)誤中學(xué)習(xí),迭代來(lái)降低犯錯(cuò)概率通過(guò)一系列的迭代來(lái)優(yōu)化分類結(jié)果,每迭代一次引入一個(gè)弱分類器,來(lái)克服現(xiàn)在已經(jīng)存在的弱分類器組合的短板。 Adaboost 整個(gè)訓(xùn)練集上維護(hù)一個(gè)分布權(quán)值向量W,用賦予權(quán)重的訓(xùn)練集通過(guò)弱分類算法產(chǎn)生分類假設(shè)(基學(xué)習(xí)器)y(x), 然后計(jì)算錯(cuò)誤率,用得到的錯(cuò)誤率去更新分布權(quán)值向量w,對(duì)錯(cuò)誤分類的樣本分配更大的權(quán)值,正確分類的樣本賦予更小的權(quán)值,每次更新后用相同的弱分類算法產(chǎn)生新的分類假設(shè),這些分類假設(shè)的序列構(gòu)成多分類器,對(duì)這些多分類器用加權(quán)的方法進(jìn)行聯(lián)合,最后得到?jīng)Q策結(jié)果 Gradient Boosting 迭代的時(shí)候選擇梯度下降的方向來(lái)保證最后的結(jié)果最好。損失函數(shù)用來(lái)描述模型的'靠譜'程度,假設(shè)模型沒(méi)有過(guò)擬合,損失函數(shù)越大,模型的錯(cuò)誤率越高。如果我們的模型能夠讓損失函數(shù)持續(xù)的下降,最好的方式就是讓損失函數(shù)在其梯度方向下降。GradientBoostingRegressor()loss - 選擇損失函數(shù),默認(rèn)值為ls(least squres),即最小二乘法,對(duì)函數(shù)擬合
learning_rate - 學(xué)習(xí)率
n_estimators - 弱學(xué)習(xí)器的數(shù)目,默認(rèn)值100
max_depth - 每一個(gè)學(xué)習(xí)器的最大深度,限制回歸樹的節(jié)點(diǎn)數(shù)目,默認(rèn)為3
min_samples_split - 可以劃分為內(nèi)部節(jié)點(diǎn)的最小樣本數(shù),默認(rèn)為2
min_samples_leaf - 葉節(jié)點(diǎn)所需的最小樣本數(shù),默認(rèn)為1
MLPRegressor()
參數(shù)詳解
hidden_layer_sizes - hidden_layer_sizes=(50, 50),表示有兩層隱藏層,第一層隱藏層有50個(gè)神經(jīng)元,第二層也有50個(gè)神經(jīng)元
activation - 激活函數(shù) {‘identity’, ‘logistic’, ‘tanh’, ‘relu’},默認(rèn)relu
identity - f(x) = x
logistic - 其實(shí)就是sigmod函數(shù),f(x) = 1 / (1 + exp(-x))
tanh - f(x) = tanh(x)
relu - f(x) = max(0, x)
solver - 用來(lái)優(yōu)化權(quán)重 {‘lbfgs’, ‘sgd’, ‘a(chǎn)dam’},默認(rèn)adam,
lbfgs - quasi-Newton方法的優(yōu)化器:對(duì)小數(shù)據(jù)集來(lái)說(shuō),lbfgs收斂更快效果也更好
sgd - 隨機(jī)梯度下降
adam - 機(jī)遇隨機(jī)梯度的優(yōu)化器
alpha - 正則化項(xiàng)參數(shù),可選的,默認(rèn)0.0001
learning_rate - 學(xué)習(xí)率,用于權(quán)重更新,只有當(dāng)solver為’sgd’時(shí)使用
max_iter - 最大迭代次數(shù),默認(rèn)200
shuffle - 判斷是否在每次迭代時(shí)對(duì)樣本進(jìn)行清洗,默認(rèn)True,只有當(dāng)solver=’sgd’或者‘a(chǎn)dam’時(shí)使用
XGBRegressor梯度提升回歸樹,也叫梯度提升機(jī)
采用連續(xù)的方式構(gòu)造樹,每棵樹都試圖糾正前一棵樹的錯(cuò)誤
與隨機(jī)森林不同,梯度提升回歸樹沒(méi)有使用隨機(jī)化,而是用到了強(qiáng)預(yù)剪枝
從而使得梯度提升樹往往深度很小,這樣模型占用的內(nèi)存少,預(yù)測(cè)的速度也快
各模型結(jié)果:
LightGBM使用的是histogram算法,占用的內(nèi)存更低,數(shù)據(jù)分隔的復(fù)雜度更低。思想是將連續(xù)的浮點(diǎn)特征離散成k個(gè)離散值,并構(gòu)造寬度為k的Histogram。然后遍歷訓(xùn)練數(shù)據(jù),統(tǒng)計(jì)每個(gè)離散值在直方圖中的累計(jì)統(tǒng)計(jì)量。在進(jìn)行特征選擇時(shí),只需要根據(jù)直方圖的離散值,遍歷尋找最優(yōu)的分割點(diǎn)。
LightGBM采用leaf-wise生長(zhǎng)策略:每次從當(dāng)前所有葉子中找到分裂增益最大(一般也是數(shù)據(jù)量最大)的一個(gè)葉子,然后分裂,如此循環(huán)。因此同Level-wise相比,在分裂次數(shù)相同的情況下,Leaf-wise可以降低更多的誤差,得到更好的精度。
Leaf-wise的缺點(diǎn)是可能會(huì)長(zhǎng)出比較深的決策樹,產(chǎn)生過(guò)擬合因此LightGBM在Leaf-wise之上增加了一個(gè)最大深度的限制,在保證高效率的同時(shí)防止過(guò)擬合。
參數(shù):num_leaves - 控制了葉節(jié)點(diǎn)的數(shù)目,它是控制樹模型復(fù)雜度的主要參數(shù),取值應(yīng) <= 2 ^(max_depth)
bagging_fraction - 每次迭代時(shí)用的數(shù)據(jù)比例,用于加快訓(xùn)練速度和減小過(guò)擬合
feature_fraction - 每次迭代時(shí)用的特征比例,例如為0.8時(shí),意味著在每次迭代中隨機(jī)選擇80%的參數(shù)來(lái)建樹,boosting為random forest時(shí)用
min_data_in_leaf - 每個(gè)葉節(jié)點(diǎn)的最少樣本數(shù)量。它是處理leaf-wise樹的過(guò)擬合的重要參數(shù)。將它設(shè)為較大的值,可以避免生成一個(gè)過(guò)深的樹。但是也可能導(dǎo)致欠擬合
max_depth - 控制了樹的最大深度,該參數(shù)可以顯式的限制樹的深度
n_estimators - 分多少顆決策樹(總共迭代的次數(shù))
objective - 問(wèn)題類型
regression - 回歸任務(wù),使用L2損失函數(shù)
regression_l1 - 回歸任務(wù),使用L1損失函數(shù)
huber - 回歸任務(wù),使用huber損失函數(shù)
fair - 回歸任務(wù),使用fair損失函數(shù)
mape (mean_absolute_precentage_error) - 回歸任務(wù),使用MAPE損失函數(shù)
模型調(diào)參
常用的三種調(diào)參方法:貪心調(diào)參
GridSearchCV調(diào)參
貝葉斯調(diào)參
這里給出一個(gè)模型可調(diào)參數(shù)及范圍選取的參考:
貪心調(diào)參
拿當(dāng)前對(duì)模型影響最大的參數(shù)調(diào)優(yōu),直到最優(yōu)化;再拿下一個(gè)影響最大的參數(shù)調(diào)優(yōu),如此下去,直到所有的參數(shù)調(diào)整完畢。這個(gè)方法的缺點(diǎn)就是可能會(huì)調(diào)到局部最優(yōu)而不是全局最優(yōu),但是省時(shí)間省力,巨大的優(yōu)勢(shì)面前,可以一試。
objectives = ["rank:map", "reg:gamma", "count:poisson", "reg:tweedie", "reg:squaredlogerror"]max_depths = [1, 3, 5, 10, 15]lambdas = [.1, 1, 2, 3, 4]best_obj = dict()for obj in objective: model = LGBMRegressor(objective=obj) score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error))) best_obj[obj] = score best_leaves = dict()for leaves in num_leaves: model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0], num_leaves=leaves) score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error))) best_leaves[leaves] = score best_depth = dict()for depth in max_depth: model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0], num_leaves=min(best_leaves.items(), key=lambda x:x[1])[0], max_depth=depth) score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error))) best_depth[depth] = score這里 “count:poisson” 的損失最小, 所以下個(gè)參數(shù)調(diào)試時(shí)會(huì)加上這個(gè)參數(shù)
GridSearchCV調(diào)參
GridSearchCV,它存在的意義就是自動(dòng)調(diào)參,只要把參數(shù)輸進(jìn)去,就能給出最優(yōu)化的結(jié)果和參數(shù)。但是這個(gè)方法適合于小數(shù)據(jù)集,一旦數(shù)據(jù)的量級(jí)上去了,很難得出結(jié)果。這個(gè)在這里面優(yōu)勢(shì)不大, 因?yàn)閿?shù)據(jù)集很大,不太能跑出結(jié)果,但是也整理一下,有時(shí)候還是很好用的。
parameters = {'objective': objective , 'num_leaves': num_leaves, 'max_depth': max_depth}model = LGBMRegressor()clf = GridSearchCV(model, parameters, cv=5)clf = clf.fit(train_X, train_y) clf.best_params_ model = LGBMRegressor(objective='regression', num_leaves=55, max_depth=15) np.mean(cross_val_score(model,?X=train_X,?y=train_y_ln,?verbose=0,?cv?=?5,?scoring=make_scorer(mean_absolute_error))) 0.13626164479243302貝葉斯調(diào)參
貝葉斯優(yōu)化用于機(jī)器學(xué)習(xí)調(diào)參,主要思想是,給定優(yōu)化的目標(biāo)函數(shù)(廣義的函數(shù),只需指定輸入和輸出即可,無(wú)需知道內(nèi)部結(jié)構(gòu)以及數(shù)學(xué)性質(zhì)),通過(guò)不斷地添加樣本點(diǎn)來(lái)更新目標(biāo)函數(shù)的后驗(yàn)分布(高斯過(guò)程,直到后驗(yàn)分布基本貼合于真實(shí)分布。簡(jiǎn)單的說(shuō),就是考慮了上一次參數(shù)的信息,從而更好的調(diào)整當(dāng)前的參數(shù)。
與常規(guī)的網(wǎng)格搜索或者隨機(jī)搜索的區(qū)別是:
貝葉斯調(diào)參采用高斯過(guò)程,考慮之前的參數(shù)信息,不斷地更新先驗(yàn);
網(wǎng)格搜索未考慮之前的參數(shù)信息貝葉斯調(diào)參迭代次數(shù)少,速度快;網(wǎng)格搜索速度慢,參數(shù)多時(shí)易導(dǎo)致維度爆炸
貝葉斯調(diào)參針對(duì)非凸問(wèn)題依然穩(wěn)健;網(wǎng)格搜索針對(duì)非凸問(wèn)題易得到局部最優(yōu)
使用方法:
定義優(yōu)化函數(shù)(rf_cv, 在里面把優(yōu)化的參數(shù)傳入,然后建立模型, 返回要優(yōu)化的分?jǐn)?shù)指標(biāo))
定義優(yōu)化參數(shù)
開始優(yōu)化(最大化分?jǐn)?shù)還是最小化分?jǐn)?shù)等)
得到優(yōu)化結(jié)果
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)在線手冊(cè)AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請(qǐng)回復(fù)“加群”獲取一折本站知識(shí)星球優(yōu)惠券,請(qǐng)回復(fù)“知識(shí)星球”喜歡文章,點(diǎn)個(gè)在看
總結(jié)
以上是生活随笔為你收集整理的【零基础入门数据挖掘】-建模调参的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【零基础入门数据挖掘】-特征工程
- 下一篇: 【零基础入门数据挖掘】-数据分析