<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【機(jī)器學(xué)習(xí)】機(jī)器學(xué)習(xí)建模調(diào)參方法總結(jié)

          共 14673字,需瀏覽 30分鐘

           ·

          2022-07-13 02:46

            作者丨徐韜    來(lái)源丨DataWhale     編輯丨極市平臺(tái)

          導(dǎo)讀

           

          對(duì)于數(shù)據(jù)挖掘項(xiàng)目,本文將學(xué)習(xí)如何建模調(diào)參?從簡(jiǎn)單的模型開(kāi)始,如何去建立一個(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ǔ)入門(mén)數(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ù)Loss 我們希望的是能夠減少在測(cè)試集上的預(yù)測(cè)值 與真實(shí)值 的差別,從 而獲得一個(gè)最佳的權(quán)重參數(shù),因此這里采用最小二乘估計(jì)。

          長(zhǎng)尾分布

          這種分布會(huì)使得采樣不準(zhǔn),估值不準(zhǔn),因?yàn)槲膊空剂撕艽蟛糠帧A硪环矫妫膊康臄?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)嗔耍褪情L(zhǎng)尾分布截?cái)唷?/section>
          繪制特征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)證。
          data_y = np.log(data_y + 1)
          # 交叉驗(yàn)證
          scores = cross_val_score(LinearRegression(normalize=True), X=data_x, \
                                  y=data_y, cv=5, scoring=make_scorer(mean_absolute_error))

          np.mean(scores)
          但在事實(shí)上,由于我們并不具有預(yù)知未來(lái)的能力,五折交叉驗(yàn)證在某些與時(shí)間相關(guān)的數(shù)據(jù)集上反而反映了不真實(shí)的情況。
          通過(guò)2018年的二手車(chē)價(jià)格預(yù)測(cè)2017年的二手車(chē)價(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 datetime
          sample_feature = sample_feature.reset_index(drop=True)
          split_point = len(sample_feature) // 5 * 4
          train = 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_lnmodel.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ì)比如下:
          Linear Regression 線性回歸:
          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()
          參數(shù)詳解
          • 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í)器的最大深度,限制回歸樹(shù)的節(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
          梯度提升回歸樹(shù),也叫梯度提升機(jī)
          • 采用連續(xù)的方式構(gòu)造樹(shù),每棵樹(shù)都試圖糾正前一棵樹(shù)的錯(cuò)誤
          • 與隨機(jī)森林不同,梯度提升回歸樹(shù)沒(méi)有使用隨機(jī)化,而是用到了強(qiáng)預(yù)剪枝
          • 從而使得梯度提升樹(shù)往往深度很小,這樣模型占用的內(nèi)存少,預(yù)測(cè)的速度也快
          from sklearn.linear_model import LinearRegression
          from sklearn.svm import SVC
          from sklearn.tree import DecisionTreeRegressor
          from sklearn.ensemble import RandomForestRegressor
          from sklearn.ensemble import GradientBoostingRegressor
          from sklearn.neural_network import MLPRegressor
          from xgboost.sklearn import XGBRegressor
          from lightgbm.sklearn import LGBMRegressor

          models = [LinearRegression(),
                    DecisionTreeRegressor(),
                    RandomForestRegressor(),
                    GradientBoostingRegressor(),
                    MLPRegressor(solver='lbfgs', max_iter=100),
                    XGBRegressor(n_estimators = 100, objective='reg:squarederror'),
                    LGBMRegressor(n_estimators = 100)]

          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(16)]
          result
          各模型結(jié)果:
          雖然隨機(jī)森林模型在此時(shí)取得較好的效果,但LGB的效果與其相差不大。對(duì)LGB進(jìn)行調(diào)參后結(jié)果會(huì)得到提高,下面對(duì)LGB進(jìn)行簡(jiǎn)介。
          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)出比較深的決策樹(shù),產(chǎn)生過(guò)擬合因此LightGBM在Leaf-wise之上增加了一個(gè)最大深度的限制,在保證高效率的同時(shí)防止過(guò)擬合。
          參數(shù):
          • num_leaves - 控制了葉節(jié)點(diǎn)的數(shù)目,它是控制樹(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)建樹(shù),boosting為random forest時(shí)用
          • min_data_in_leaf - 每個(gè)葉節(jié)點(diǎn)的最少樣本數(shù)量。它是處理leaf-wise樹(shù)的過(guò)擬合的重要參數(shù)。將它設(shè)為較大的值,可以避免生成一個(gè)過(guò)深的樹(shù)。但是也可能導(dǎo)致欠擬合
          • max_depth - 控制了樹(shù)的最大深度,該參數(shù)可以顯式的限制樹(shù)的深度
          • n_estimators - 分多少顆決策樹(shù)(總共迭代的次數(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ù)
          • 開(kāi)始優(yōu)化(最大化分?jǐn)?shù)還是最小化分?jǐn)?shù)等)
          • 得到優(yōu)化結(jié)果
          from bayes_opt import BayesianOptimization
          def rf_cv(num_leaves, max_depth, subsample, min_child_samples):
              val
           = cross_val_score(
                  LGBMRegressor(objective = 'regression_l1',
                      num_leaves=int(num_leaves),
                      max_depth=int(max_depth),
                      subsample = subsample,
                      min_child_samples = int(min_child_samples)
                  ),
                  X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)
              ).mean()
              return 1 - val
          rf_bo = BayesianOptimization(
              rf_cv,
              {
              'num_leaves': (2100),
              'max_depth': (2100),
              'subsample': (0.11),
              'min_child_samples' : (2100)
              }
          )
          rf_bo.maximize()


          往期精彩回顧




          瀏覽 128
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产wwwww | 日韩每日更新 | jlzz日本 | 国产 在线观看免费视频 | 波多野结衣大香蕉 |