电信用户流失预测案例(3)
三、邏輯回歸模型訓(xùn)練與結(jié)果解釋
??在完成數(shù)據(jù)重編碼后,接下來即可進(jìn)行模型訓(xùn)練了,此處我們首先考慮構(gòu)建可解釋性較強(qiáng)的邏輯回歸與決策樹模型,并圍繞最終模型輸出結(jié)果進(jìn)行結(jié)果解讀,而在下一節(jié),我們將繼續(xù)介紹更多集成模型建模過程。
1.設(shè)置評估指標(biāo)與測試集
??當(dāng)然,在模型訓(xùn)練開始前,我們需要設(shè)置模型結(jié)果評估指標(biāo)。此處由于0:1類樣本比例約為3:1,因此可以考慮使用準(zhǔn)確率作為模型評估指標(biāo),同時(shí)參考混淆矩陣評估指標(biāo)、f1-Score和roc-aux值。
??需要知道的是,一般在二分類預(yù)測問題中,0:1在3:1左右是一個(gè)重要界限,若0:1小于3:1,則標(biāo)簽偏態(tài)基本可以忽略不計(jì),不需要進(jìn)行偏態(tài)樣本處理(處理了也容易過擬合),同時(shí)在模型評估指標(biāo)選取時(shí)也可以直接選擇“中立”評估指標(biāo),如準(zhǔn)確率或者roc-auc。而如果0:1大于3:1,則認(rèn)為標(biāo)簽取值分布存在偏態(tài),需要對其進(jìn)行處理,如過采樣、欠采樣、或者模型組合訓(xùn)練、或者樣本聚類等,并且如果此時(shí)需要重點(diǎn)衡量模型對1類識(shí)別能力的話,則更加推薦選擇f1-Score。
??當(dāng)然,盡管此處數(shù)據(jù)集并未呈現(xiàn)明顯偏態(tài),但我們?nèi)匀粫?huì)在后續(xù)介紹數(shù)據(jù)調(diào)整時(shí)介紹常用處理偏態(tài)數(shù)據(jù)的方法,不過還是需要強(qiáng)調(diào)的是,對偏態(tài)并不明顯的數(shù)據(jù)集采用這些方法,極容易造成模型過擬合。
??此外,模型訓(xùn)練過程我們也將模仿實(shí)際競賽流程,即在模型訓(xùn)練開始之初就劃分出一個(gè)確定的、全程不帶入建模的測試集(競賽中該數(shù)據(jù)集標(biāo)簽未知,只能通過在線提交結(jié)果后獲得對應(yīng)得分),而后續(xù)若要在模型訓(xùn)練階段驗(yàn)證模型結(jié)果,則會(huì)額外在訓(xùn)練集中劃分驗(yàn)證集。
其中train就是訓(xùn)練數(shù)據(jù)集,同時(shí)包含訓(xùn)練集的特征和標(biāo)簽。
tcc2.邏輯回歸模型訓(xùn)練
??首先我們測試邏輯回歸的建模效果。邏輯回歸作為線性方程,連續(xù)變量和離散變量的數(shù)據(jù)解釋是不同的,連續(xù)變量表示數(shù)值每變化1,對標(biāo)簽取值的影響,而分類變量則表示當(dāng)該特征狀態(tài)發(fā)生變化時(shí),標(biāo)簽受到影響的程度。因此,對于若要帶入離散變量進(jìn)行邏輯回歸建模,則需要對多分類離散變量進(jìn)行獨(dú)熱編碼處理。當(dāng)然,也是因?yàn)槲覀冃枰葘?shù)據(jù)集進(jìn)行轉(zhuǎn)化再進(jìn)行訓(xùn)練,因此我們可以通過創(chuàng)建機(jī)器學(xué)習(xí)流來封裝這兩步。
from sklearn.linear_model import LogisticRegression from sklearn.pipeline import make_pipeline- 數(shù)據(jù)轉(zhuǎn)化
- 設(shè)置轉(zhuǎn)化器與評估器
- 模型訓(xùn)練
- 查看模型結(jié)果
??接下來,我們直接通過.score方法查看模型再訓(xùn)練集和測試集上準(zhǔn)確率:
logistic_pipe.score(X_train, y_train) #0.8089249492900609 logistic_pipe.score(X_test, y_test) #0.7931850449597728當(dāng)然,關(guān)于更多評估指標(biāo)的計(jì)算,我們可以通過下述函數(shù)來實(shí)現(xiàn),同時(shí)計(jì)算模型的召回率、精確度、f1-Score和roc-auc值:
def result_df(model, X_train, y_train, X_test, y_test, metrics=[accuracy_score, recall_score, precision_score, f1_score, roc_auc_score]):res_train = []res_test = []col_name = []for fun in metrics:res_train.append(fun(model.predict(X_train), y_train))res_test.append(fun(model.predict(X_test), y_test)) col_name.append(fun.__name__)idx_name = ['train_eval', 'test_eval']res = pd.DataFrame([res_train, res_test], columns=col_name, index=idx_name)return res result_df(logistic_pipe, X_train, y_train, X_test, y_test)
??一般來說準(zhǔn)確率再80%以上的模型就算是可用的模型,但同時(shí)也要綜合考慮當(dāng)前數(shù)據(jù)集情況(建模難度),有些場景(比賽)下80%只是模型調(diào)優(yōu)前的基準(zhǔn)線(baseline),而有時(shí)候80%的準(zhǔn)確率卻是當(dāng)前數(shù)據(jù)的預(yù)測巔峰結(jié)果(比賽Top 10)。所以對于上述結(jié)果的解讀,即邏輯回歸模型建模效果好或不好,可能需要進(jìn)一步與其他模型進(jìn)行橫向?qū)Ρ葋磉M(jìn)行判斷。
此外,需要注意的是,訓(xùn)練集和測試集的劃分方式也會(huì)影響當(dāng)前的輸出結(jié)果,但建議是一旦劃分完訓(xùn)練集和測試集后,就圍繞當(dāng)前建模結(jié)果進(jìn)行優(yōu)化,而不再考慮通過調(diào)整訓(xùn)練集和測試集的劃分方式來影響最后輸出結(jié)果,這么做也是毫無意義的。
2.邏輯回歸的超參數(shù)調(diào)優(yōu)
- 網(wǎng)格搜索優(yōu)化
??在模型訓(xùn)練完畢后,首先我們可以嘗試一些基本優(yōu)化方法——網(wǎng)格搜索,即超參數(shù)選擇的調(diào)優(yōu),來嘗試著對上述模型進(jìn)行調(diào)優(yōu)。網(wǎng)格搜索的過程并不一定能顯著提高模型效果(當(dāng)然其實(shí)也沒有確定一定能提高模型效果的通用方法),但卻是我們訓(xùn)練完模型后一定要做的基本優(yōu)化流程,網(wǎng)格搜索能夠幫我們確定一組最優(yōu)超參數(shù),并且隨之附帶的交叉驗(yàn)證的過程也能夠讓訓(xùn)練集上的模型得分更具有說服力。
from sklearn.model_selection import GridSearchCV??首先,邏輯回歸評估器損失函數(shù)方程如下:
而邏輯回歸評估器的所有參數(shù)解釋如下:
??而在這些所有超參數(shù)中,對模型結(jié)果影響較大的參數(shù)主要有兩類,其一是正則化項(xiàng)的選擇,同時(shí)也包括經(jīng)驗(yàn)風(fēng)險(xiǎn)項(xiàng)的系數(shù)與損失求解方法選擇,第二類則是迭代限制條件,主要是max_iter和tol兩個(gè)參數(shù),當(dāng)然,在數(shù)據(jù)量較小、算力允許的情況下,我們也可以直接設(shè)置較大max_iter、同時(shí)設(shè)置較小tol數(shù)值。由于我們并未考慮帶入數(shù)據(jù)本身的膨脹系數(shù)(共線性),因此此處我們優(yōu)先考慮圍繞經(jīng)驗(yàn)風(fēng)險(xiǎn)系數(shù)與正則化選擇類參數(shù)進(jìn)行搜索與優(yōu)化。(加入了正則化項(xiàng)的邏輯回歸能夠很好的規(guī)避掉自變量間的共線性)
??而整個(gè)網(wǎng)格搜索過程其實(shí)就是一個(gè)將所有參數(shù)可能的取值一一組合,然后計(jì)算每一種組合下模型在給定評估指標(biāo)下的交叉驗(yàn)證的結(jié)果(驗(yàn)證集上的平均值),作為該參數(shù)組合的得分,然后通過橫向比較(比較不同參數(shù)組合的得分),來選定最優(yōu)參數(shù)組合。要使用網(wǎng)格搜索,首先我們需要設(shè)置參數(shù)空間,也就是帶入哪些參數(shù)的哪些取值進(jìn)行搜索。需要注意的是,由于我們現(xiàn)在是直接選用機(jī)器學(xué)習(xí)流進(jìn)行訓(xùn)練,此時(shí)邏輯回歸的超參數(shù)的名稱會(huì)發(fā)生變化,我們可以通過機(jī)器學(xué)習(xí)流的.get_param來獲取集成在機(jī)器學(xué)習(xí)流中的邏輯回歸參數(shù)名稱:
然后,我們選取正則化項(xiàng)、經(jīng)驗(yàn)風(fēng)險(xiǎn)權(quán)重項(xiàng)C、彈性網(wǎng)正則化中l(wèi)1正則化的比例項(xiàng)l1_ratio、以及求解器solver作為搜索超參數(shù),來構(gòu)建超參數(shù)空間:
logistic_param = [{'logisticregression__penalty': ['l1'], 'logisticregression__C': np.arange(0.1, 2.1, 0.1).tolist(), 'logisticregression__solver': ['saga']}, {'logisticregression__penalty': ['l2'], 'logisticregression__C': np.arange(0.1, 2.1, 0.1).tolist(), 'logisticregression__solver': ['lbfgs', 'newton-cg', 'sag', 'saga']}, {'logisticregression__penalty': ['elasticnet'], 'logisticregression__C': np.arange(0.1, 2.1, 0.1).tolist(), 'logisticregression__l1_ratio': np.arange(0.1, 1.1, 0.1).tolist(), 'logisticregression__solver': ['saga']} ]接下來執(zhí)行網(wǎng)格搜索,在網(wǎng)格搜索評估器的使用過程中,只需要輸入搜索的評估器(也就是機(jī)器學(xué)習(xí)流)和評估器的參數(shù)空間即可,當(dāng)然若想提高運(yùn)行速度,可以在n_jobs中輸入調(diào)用進(jìn)程數(shù),一般保守情況數(shù)值可以設(shè)置為當(dāng)前電腦核數(shù)。此外,由于我們目前是以準(zhǔn)確率作為評估指標(biāo),因此在實(shí)例化評估器時(shí)無需設(shè)置評估指標(biāo)參數(shù)。
# 實(shí)例化網(wǎng)格搜索評估器 logistic_search = GridSearchCV(estimator = logistic_pipe,param_grid = logistic_param,n_jobs = 12) import time # 在訓(xùn)練集上進(jìn)行訓(xùn)練 s = time.time() logistic_search.fit(X_train, y_train) print(time.time()-s, "s") #378.3900156021118 s此處可以考慮拆分特征重編碼和模型訓(xùn)練過程,可加快搜索效率
接下來查看在網(wǎng)格搜索中驗(yàn)證集的準(zhǔn)確率的均值:
logistic_search.best_score_ #0.8044624746450305以及搜索出的最優(yōu)超參數(shù)組合:
logistic_search.best_params_ #{'logisticregression__C': 0.1, # 'logisticregression__penalty': 'l2', # 'logisticregression__solver': 'lbfgs'}能夠發(fā)現(xiàn),搜索出來的參數(shù)結(jié)果和默認(rèn)參數(shù)相差不大(默認(rèn)情況下C的取值是1.0,其他沒有區(qū)別),因此預(yù)計(jì)在這組最優(yōu)參數(shù)下模型預(yù)測結(jié)果和默認(rèn)參數(shù)差不多。
# 調(diào)用最佳參數(shù)的機(jī)器學(xué)習(xí)流評估器 logistic_search.best_estimator_ # logistic_search.best_estimator_ # Pipeline(steps=[('columntransformer', # ColumnTransformer(transformers=[('cat', # OneHotEncoder(drop='if_binary'), # ['gender', 'SeniorCitizen', # 'Partner', 'Dependents', # 'PhoneService', # 'MultipleLines', # 'InternetService', # 'OnlineSecurity', # 'OnlineBackup', # 'DeviceProtection', # 'TechSupport', 'StreamingTV', # 'StreamingMovies', # 'Contract', # 'PaperlessBilling', # 'PaymentMethod']), # ('num', 'passthrough', # ['tenure', 'MonthlyCharges', # 'TotalCharges'])])), # ('logisticregression', # LogisticRegression(C=0.1, max_iter=100000000))]) # 計(jì)算預(yù)測結(jié)果 result_df(logistic_search.best_estimator_, X_train, y_train, X_test, y_test)
需要注意的是,這里的網(wǎng)格搜索結(jié)果的.best_score_和訓(xùn)練集上準(zhǔn)確率并不一致。我們需要清楚這里不一致的原因,以及當(dāng)二者不一致時(shí)我們應(yīng)該更相信哪個(gè)值。
??首先是不一致的原因,需要知道的是,.best_score_返回的是在網(wǎng)格搜索的交叉驗(yàn)證過程中(默認(rèn)是五折驗(yàn)證)驗(yàn)證集上準(zhǔn)確率的平均值,而最終我們看到的訓(xùn)練集上準(zhǔn)確率評分只是模型在訓(xùn)練集上一次運(yùn)行后的整體結(jié)果,二者計(jì)算過程不一致,最終結(jié)果也自然是不一樣的。
??另外,如果二者不一致的話我們更應(yīng)該相信哪個(gè)值呢?首先無論相信哪個(gè)值,最終的目的都是通過已知數(shù)據(jù)集上的模型得分,去判斷模型當(dāng)前的泛化能力,也就是去估計(jì)一下在未知數(shù)據(jù)集上模型的表現(xiàn),哪個(gè)預(yù)估的更準(zhǔn),我們就應(yīng)該更相信哪個(gè)。而對于上述兩個(gè)取值,很明顯經(jīng)過交叉驗(yàn)證后的驗(yàn)證集平均得分更能衡量模型泛化能力,這也就是為何我們經(jīng)常會(huì)發(fā)現(xiàn)經(jīng)過交叉驗(yàn)證后的.best_score_會(huì)和測試集的評分更加接近的原因。
??當(dāng)然,更進(jìn)一步的說,只要我們采用網(wǎng)格搜索來選取超參數(shù),就默認(rèn)我們更“相信”交叉驗(yàn)證后的結(jié)果(畢竟我們是根據(jù)這個(gè)平均得分選取超參數(shù))。也就是說,在超參數(shù)選取的過程中,我們并沒有其他選項(xiàng)。
??如果更深入的來探討,實(shí)際上如何在訓(xùn)練集上獲得一個(gè)更加可信的得分,其實(shí)是事關(guān)模型訓(xùn)練成敗的關(guān)鍵。目前我們知道了交叉驗(yàn)證評分可信度>訓(xùn)練集上單次運(yùn)行得分,而在Part 5時(shí),我們還將更進(jìn)一步尋找更加可信的得分,來訓(xùn)練泛化能力更強(qiáng)的模型。
- f1-Score搜索
??此外,在使用網(wǎng)格搜索的過程中,我們也能夠規(guī)定搜索方向,即可規(guī)定超參數(shù)的調(diào)優(yōu)方向。在默認(rèn)情況下,搜索的目的是提升模型準(zhǔn)確率,但我們也可以對其進(jìn)行修改,例如希望搜索的結(jié)果盡可能提升模型f1-Score,則可在網(wǎng)格搜索實(shí)例化過程中調(diào)整scoring超參數(shù)。具體scoring參數(shù)可選列表如下:
接下來執(zhí)行模型訓(xùn)練與網(wǎng)格搜索過程:
以及搜索出的最優(yōu)超參數(shù)組合:
logistic_search_f1.best_params_ #{'logisticregression__C': 1.4000000000000001, # 'logisticregression__penalty': 'l2', # 'logisticregression__solver': 'lbfgs'} # 計(jì)算預(yù)測結(jié)果 result_df(logistic_search_f1.best_estimator_, X_train, y_train, X_test, y_test)
能夠發(fā)現(xiàn),搜索出來的參數(shù)結(jié)果和此前圍繞準(zhǔn)確率指標(biāo)的搜索結(jié)果略有不同,但對于最終測試集上的f1-Score提升效果并不明顯,稍后我們會(huì)進(jìn)一步介紹通過調(diào)整邏輯回歸閾值來快速提升f1-Score。
- 更多超參數(shù)
??當(dāng)然,根據(jù)此前介紹,我們知道,對于邏輯回歸來說,連續(xù)變量是存在多種可選的處理方式的,例如我們可以對其進(jìn)行分箱或者歸一化處理,這些不同的處理方法或許能提升模型最終效果。這里我們可以將其視作超參數(shù),并一并納入網(wǎng)格搜索調(diào)參的范圍,來選取一種最佳的對連續(xù)變量的處理方式。同時(shí),由于我們發(fā)現(xiàn),在多次搜索過程中都未出現(xiàn)彈性網(wǎng)正則化的搜索結(jié)果,因此暫時(shí)將彈性網(wǎng)正則化的超參數(shù)從搜索空間中移除,以確保后續(xù)搜索的效率。
logistic_pipe.get_params()# 設(shè)置轉(zhuǎn)化器流 logistic_pre = ColumnTransformer([('cat', preprocessing.OneHotEncoder(drop='if_binary'), category_cols), ('num', 'passthrough', numeric_cols) ])num_pre = ['passthrough', preprocessing.StandardScaler(), preprocessing.KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='kmeans')]# 實(shí)例化邏輯回歸評估器 logistic_model = LogisticRegression(max_iter=int(1e8))# 設(shè)置機(jī)器學(xué)習(xí)流 logistic_pipe = make_pipeline(logistic_pre, logistic_model)# 設(shè)置超參數(shù)空間 logistic_param = [{'columntransformer__num':num_pre, 'logisticregression__penalty': ['l1'], 'logisticregression__C': np.arange(0.1, 2.1, 0.1).tolist(), 'logisticregression__solver': ['saga']}, {'columntransformer__num':num_pre, 'logisticregression__penalty': ['l2'], 'logisticregression__C': np.arange(0.1, 2.1, 0.1).tolist(), 'logisticregression__solver': ['lbfgs', 'newton-cg', 'sag', 'saga']}, ]# 實(shí)例化網(wǎng)格搜索評估器 logistic_search = GridSearchCV(estimator = logistic_pipe,param_grid = logistic_param,n_jobs = 12)s = time.time() logistic_search.fit(X_train, y_train) print(time.time()-s, "s") #86.78103947639465 slogistic_search.best_score_ #0.8044624746450305 logistic_search.best_params_ #{'columntransformer__num': 'passthrough', # 'logisticregression__C': 0.1, # 'logisticregression__penalty': 'l2', # 'logisticregression__solver': 'lbfgs'} # 計(jì)算預(yù)測結(jié)果 result_df(logistic_search.best_estimator_, X_train, y_train, X_test, y_test)
能夠發(fā)現(xiàn),根據(jù)交叉驗(yàn)證結(jié)果,模型仍然選擇了最初搜索出來的參數(shù)組。
優(yōu)化沒效果,十之八九。
3.邏輯回歸的進(jìn)階調(diào)優(yōu)策略
??盡管網(wǎng)格搜索是一種較為暴力的搜索最優(yōu)參數(shù)的方法,但具體的搜索策略仍然舉要結(jié)合當(dāng)前模型與數(shù)據(jù)的實(shí)際情況來進(jìn)行調(diào)整。例如對于邏輯回歸來說,其實(shí)有個(gè)隱藏參數(shù)——類別判別閾值。通過對邏輯回歸閾值的調(diào)整,能夠直接影響最終的輸出結(jié)果。此外,由于當(dāng)前數(shù)據(jù)集存在一定程度樣本不均衡問題,因此也可以通過調(diào)整class_weight參數(shù)來進(jìn)行結(jié)果優(yōu)化,不過需要注意的是,對于邏輯回歸模型來說,很多時(shí)候閾值移動(dòng)的效果是向下兼容class_weight的。
??在sklearn中邏輯回歸的判別閾值并不是超參數(shù),因此如果需要對此進(jìn)行搜索調(diào)優(yōu)的話,我們可以考慮手動(dòng)編寫一個(gè)包裝在邏輯回歸評估器外層的評估器,并加入閾值這一超參數(shù),然后再帶入網(wǎng)格搜索流程;而class_weight的搜索調(diào)優(yōu)就相對簡單,該參數(shù)作為邏輯回歸評估器的原生參數(shù),只需要合理設(shè)置參數(shù)空間對其搜索即可。
3.1 閾值移動(dòng)調(diào)優(yōu)
- 自定義評估器
??要手動(dòng)編寫sklearn評估器,需要先導(dǎo)入下述輔助構(gòu)造sklearn評估器的包:
from sklearn.base import BaseEstimator, TransformerMixin然后開始編寫能夠?qū)崿F(xiàn)閾值移動(dòng)的邏輯回歸評估器:
LogisticRegression?class logit_threshold(BaseEstimator, TransformerMixin):def __init__(self, penalty='l2', C=1.0, max_iter=1e8, solver='lbfgs', l1_ratio=None, class_weight=None, thr=0.5):self.penalty = penaltyself.C = Cself.max_iter = max_iterself.solver = solverself.l1_ratio = l1_ratioself.thr = thrself.class_weight = class_weightdef fit(self, X, y):clf = LogisticRegression(penalty = self.penalty, C = self.C, solver = self.solver, l1_ratio = self.l1_ratio,class_weight=self.class_weight, max_iter=self.max_iter)clf.fit(X, y)self.coef_ = clf.coef_self.clf = clfreturn selfdef predict(self, X):res = (self.clf.predict_proba(X)[:, 1]>=self.thr) * 1return res??需要注意的是,上述評估器只繼承了部分邏輯回歸評估器的核心參數(shù),并且由于沒有設(shè)置.score方法,因此如果要使用網(wǎng)格搜索調(diào)參,需要明確規(guī)定scoring參數(shù)。當(dāng)然,在定義完評估器后,我們可以通過下述過程進(jìn)行手動(dòng)驗(yàn)證評估器的有效性:
# 創(chuàng)建數(shù)據(jù)集 np.random.seed(24) X = np.random.normal(0, 1, size=(1000, 2)) y = np.array(X[:,0]+X[:, 1]**2 < 1.5, int)clf = LogisticRegression() clf.fit(X, y) #LogisticRegression() # 輸出閾值為0.4時(shí)的模型預(yù)測結(jié)果 res1 = (clf.predict_proba(X)[:, 1] >= 0.4) * 1 # 實(shí)例化自定義評估器,設(shè)置閾值為0.4 clf_thr = logit_threshold(thr=0.4) clf_thr.fit(X, y) #logit_threshold(thr=0.4) res2 = clf_thr.predict(X) (res1 != res2).sum() #0能夠發(fā)現(xiàn)該評估器能夠?qū)崿F(xiàn)閾值調(diào)整。接下來,我們嘗試帶入閾值參數(shù)到搜索過程中,需要注意的是,閾值搜索對于f1-Score和roc-auc提升效果明顯,一般來說對于準(zhǔn)確率提升效果一般,因此我們考慮直接依據(jù)f1-Score分?jǐn)?shù)進(jìn)行搜索,以測試閾值調(diào)整的實(shí)際效果。
- 閾值搜索
能夠發(fā)現(xiàn),閾值移動(dòng)對于模型的f1-Score提升效果顯著,約提升了4%。
3.2 class_weight調(diào)優(yōu)
??接下來,我們進(jìn)一步調(diào)整class_weight參數(shù)。根據(jù)此前數(shù)據(jù)探索的結(jié)果我們知道,數(shù)據(jù)集中標(biāo)簽的0/1分布比例大致為3:1左右,而class_weight的核心作用在于能夠調(diào)整不同類別樣本在計(jì)算損失值時(shí)的權(quán)重,一般來說,如果是3:1的樣本比例,class_weight的參數(shù)取值基本可以設(shè)置在2:1-4:1之間,當(dāng)然也可以直接考慮使用不同類別樣本數(shù)量的反比,也就是balanced參數(shù)。
y = tcc['Churn'] print(f'Percentage of Churn: {round(y.value_counts(normalize=True)[1]*100,2)} % --> ({y.value_counts()[1]} customer)\nPercentage of customer did not churn: {round(y.value_counts(normalize=True)[0]*100,2)} % --> ({y.value_counts()[0]} customer)') #Percentage of Churn: 26.54 % --> (1869 customer) #Percentage of customer did not churn: 73.46 % --> (5174 customer)增加class_weight后的模型訓(xùn)練和調(diào)優(yōu)過程:
# 設(shè)置轉(zhuǎn)化器流 logistic_pre = ColumnTransformer([('cat', preprocessing.OneHotEncoder(drop='if_binary'), category_cols), ('num', 'passthrough', numeric_cols) ])num_pre = ['passthrough', preprocessing.StandardScaler(), preprocessing.KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='kmeans')]# 實(shí)例化邏輯回歸評估器 logistic_model = logit_threshold(max_iter=int(1e8))# 設(shè)置機(jī)器學(xué)習(xí)流 logistic_pipe = make_pipeline(logistic_pre, logistic_model)# 設(shè)置超參數(shù)空間 cw_l = [None, 'balanced'] #cw_l.extend([{1: x} for x in np.arange(1, 4, 0.2)]) logistic_param = [{'columntransformer__num':num_pre, 'logit_threshold__thr': np.arange(0.1, 1, 0.1).tolist(), 'logit_threshold__penalty': ['l1'], 'logit_threshold__C': np.arange(0.1, 1.1, 0.1).tolist(), 'logit_threshold__solver': ['saga'], 'logit_threshold__class_weight':cw_l}, {'columntransformer__num':num_pre, 'logit_threshold__thr': np.arange(0.1, 1, 0.1).tolist(), 'logit_threshold__penalty': ['l2'], 'logit_threshold__C': np.arange(0.1, 1.1, 0.1).tolist(), 'logit_threshold__solver': ['lbfgs', 'newton-cg', 'sag', 'saga'], 'logit_threshold__class_weight':cw_l}, ]# 實(shí)例化網(wǎng)格搜索評估器 logistic_search_f1 = GridSearchCV(estimator = logistic_pipe,param_grid = logistic_param,scoring='f1',n_jobs = 12)s = time.time() logistic_search_f1.fit(X_train, y_train) print(time.time()-s, "s") #737.595550775528 s logistic_search_f1.best_score_ #0.6341624667020883 logistic_search_f1.best_params_ #{'columntransformer__num': 'passthrough', # 'logit_threshold__C': 0.1, # 'logit_threshold__class_weight': None, # 'logit_threshold__penalty': 'l2', # 'logit_threshold__solver': 'lbfgs', # 'logit_threshold__thr': 0.30000000000000004} # 計(jì)算預(yù)測結(jié)果 result_df(logistic_search_f1.best_estimator_, X_train, y_train, X_test, y_test)
能夠發(fā)現(xiàn),閾值移動(dòng)的效果會(huì)兼容class_weight參數(shù)調(diào)整結(jié)果。最后我們再來嘗試圍繞準(zhǔn)確率進(jìn)行搜索時(shí)二者參數(shù)的效果:
能夠發(fā)現(xiàn),在樣本相對均衡、且以準(zhǔn)確率作為調(diào)參目標(biāo)進(jìn)行搜索時(shí),閾值移動(dòng)和樣本權(quán)重調(diào)整并未能對模型有更好效果提升。
4.邏輯回歸模型解釋
??對于邏輯回歸的模型解釋,核心是需要觀察線性方程中自變量的系數(shù),通過系數(shù)大小可以判斷特征重要性,并且系數(shù)的具體數(shù)值也能表示因變量如何伴隨自變量變化而變化。
- 邏輯回歸方程系數(shù)查看
??我們可以通過如下方式在一個(gè)訓(xùn)練好的網(wǎng)格搜索評估器中查看邏輯回歸方程系數(shù):
coe = logistic_search.best_estimator_.named_steps['logit_threshold'].coef_ coe = coe.flatten() coe #array([-3.64734497e-02, 2.97225123e-01, -6.96677065e-02, -2.11536083e-01, # -3.59041883e-01, -3.16598442e-01, 1.96605064e-01, -4.24434409e-02, # -3.93451080e-01, 3.65505701e-01, -1.34491440e-01, 1.88033447e-01, # -1.34491440e-01, -2.15978826e-01, 1.48635094e-02, -1.34491440e-01, # -4.28088885e-02, 3.09582859e-02, -1.34491440e-01, -5.89036649e-02, # 1.53753023e-01, -1.34491440e-01, -1.81698402e-01, -1.31620667e-01, # -1.34491440e-01, 1.03675288e-01, -1.14052749e-01, -1.34491440e-01, # 8.61073700e-02, 5.32238806e-01, -1.63533154e-01, -5.31142471e-01, # 3.89129562e-01, -9.62838286e-02, -1.82584235e-01, 2.82335761e-01, # -1.65904515e-01, -6.68822855e-02, 1.00859554e-03, 3.84181240e-04])而根據(jù)網(wǎng)格搜索評估器的結(jié)果,我們發(fā)現(xiàn),上述數(shù)據(jù)輸出結(jié)果實(shí)際上是經(jīng)過了離散變量的多分類獨(dú)熱編碼轉(zhuǎn)化,因此我們可以借助此前定義的函數(shù)來生成具體特征含義:
# 我們帶入的訓(xùn)練數(shù)據(jù)是DataFrame # X_train # 定位獨(dú)熱編碼轉(zhuǎn)化器 tf = logistic_search.best_estimator_.named_steps['columntransformer'].named_transformers_['cat'] tf #OneHotEncoder(drop='if_binary') # 轉(zhuǎn)化后離散變量列名稱 category_cols_new = cate_colName(tf, category_cols)# 所有字段名稱 cols_new = category_cols_new + numeric_cols# 查看特征名稱數(shù)量和特征系數(shù)數(shù)量是否一致 assert len(cols_new) == len(coe) # 創(chuàng)建index是列名稱,取值是自變量系數(shù)的Series weights = pd.Series(coe, index=cols_new) weights # gender -0.036473 # SeniorCitizen 0.297225 # Partner -0.069668 # Dependents -0.211536 # PhoneService -0.359042 # MultipleLines_No -0.316598 # MultipleLines_No phone service 0.196605 # MultipleLines_Yes -0.042443 # InternetService_DSL -0.393451 # InternetService_Fiber optic 0.365506 # InternetService_No -0.134491 # OnlineSecurity_No 0.188033 # OnlineSecurity_No internet service -0.134491 # OnlineSecurity_Yes -0.215979 # OnlineBackup_No 0.014864 # OnlineBackup_No internet service -0.134491 # OnlineBackup_Yes -0.042809 # DeviceProtection_No 0.030958 # DeviceProtection_No internet service -0.134491 # DeviceProtection_Yes -0.058904 # TechSupport_No 0.153753 # TechSupport_No internet service -0.134491 # TechSupport_Yes -0.181698 # StreamingTV_No -0.131621 # StreamingTV_No internet service -0.134491 # StreamingTV_Yes 0.103675 # StreamingMovies_No -0.114053 # StreamingMovies_No internet service -0.134491 # StreamingMovies_Yes 0.086107 # Contract_Month-to-month 0.532239 # Contract_One year -0.163533 # Contract_Two year -0.531142 # PaperlessBilling 0.389130 # PaymentMethod_Bank transfer (automatic) -0.096284 # PaymentMethod_Credit card (automatic) -0.182584 # PaymentMethod_Electronic check 0.282336 # PaymentMethod_Mailed check -0.165905 # tenure -0.066882 # MonthlyCharges 0.001009 # TotalCharges 0.000384 # dtype: float64然后可視化展示取值最大的10個(gè)自變量系數(shù)與取值最小的10個(gè)自變量系數(shù):
plt.figure(figsize=(16, 6), dpi=200)# 挑選正相關(guān)的前10個(gè)變量 plt.subplot(121) weights.sort_values(ascending = False)[:10].plot(kind='bar')# 挑選負(fù)相關(guān)的前10個(gè)變量 plt.subplot(122) weights.sort_values(ascending = False)[-10:].plot(kind='bar')
能夠發(fā)現(xiàn),Contract出現(xiàn)Month-to-month時(shí),用戶流失可能性較大,而Contract出現(xiàn)Two year時(shí),用戶留存可能性較大。當(dāng)然,相比此前相關(guān)系數(shù)柱狀圖,上述根據(jù)模型生成的自變量系數(shù)可視化的結(jié)果會(huì)更加可靠一些,并且每個(gè)變量系數(shù)的取值也有對應(yīng)的可解釋的具體含義
- 自變量系數(shù)解釋
??接下來我們來進(jìn)行邏輯回歸模型方程系數(shù)解釋。假設(shè)現(xiàn)在訓(xùn)練出來的邏輯回歸線性方程為1-x,即邏輯回歸方程模型如下:y=11+e?(1?x)y = \frac{1}{1+e^{-(1-x)}} y=1+e?(1?x)1?據(jù)此可以進(jìn)一步推導(dǎo)出:lny1?y=1?xln\frac{y}{1-y} = 1-xln1?yy?=1?x
此時(shí),自變量x的系數(shù)為-1,據(jù)此可以解讀為x每增加1,樣本屬于1的概率的對數(shù)幾率就減少1。
??而這種基于自變量系數(shù)的可解釋性不僅可以用于自變量和因變量之間的解釋,還可用于自變量重要性的判別當(dāng)中,例如,假設(shè)邏輯回歸方程如下:lny1?y=x1+2x2?1ln\frac{y}{1-y} = x_1+2x_2-1ln1?yy?=x1?+2x2??1則可解讀為x2x_2x2?的重要性是x1x_1x1?的兩倍,x2x_2x2?每增加1的效果(令樣本為1的概率的增加)是x1x_1x1?增加1效果的兩倍。
??據(jù)此,上述建模結(jié)果系數(shù)中,我們可以有如下解釋,例如:對于Contract字段來說,Month-to-month出現(xiàn)時(shí)會(huì)讓用戶流失的對數(shù)幾率增加50%(概率增加約10%),而Two year出現(xiàn)時(shí)會(huì)讓用戶流失的對數(shù)幾率減少50%(概率減少約10%),其他變量也可參照該方式進(jìn)行解釋。
??并且根據(jù)上述結(jié)果,我們不難看出,'Contract_Month-to-month’的系數(shù)是’SeniorCitizen’的兩倍
該結(jié)果說明,在導(dǎo)致用戶流失的因素中,'Contract_Month-to-month’的影響是’SeniorCitizen’的兩倍,或用戶簽訂協(xié)約時(shí)出現(xiàn)月付行為所造成的用戶流失風(fēng)險(xiǎn),是用戶是老年人導(dǎo)致的風(fēng)險(xiǎn)的兩倍。
??此外,需要注意的是,在上述建模過程中,我們發(fā)現(xiàn)連續(xù)變量的系數(shù)普遍較小:
其根本原因在于自變量取值范圍較大,而邏輯回歸方程系數(shù)實(shí)際上是在衡量自變量每增加1、因變量的對數(shù)幾率變化情況,因此對于取值較大的連續(xù)變量來說,最終的系數(shù)結(jié)果較小。若想更加準(zhǔn)確的和離散變量作比較,此處可以考慮將連續(xù)變量離散化,然后再計(jì)算離散化后的特征系數(shù),并使用該系數(shù)和原離散變量系數(shù)進(jìn)行比較,二者會(huì)有更好的可比性。
5.邏輯回歸建模總結(jié)
??接下來,對邏輯回歸建模過程以及模型使用技巧進(jìn)行總結(jié)。
- 模型性能評估
??通過上述嘗試,我們基本能判斷邏輯回歸模型在當(dāng)前數(shù)據(jù)集的性能,準(zhǔn)確率約在80%左右,準(zhǔn)確率沒有太大的超參數(shù)調(diào)優(yōu)搜索空間,而f1-Score則在我們額外設(shè)置的超參數(shù)——閾值上能夠有更好的搜索結(jié)果。
- 超參數(shù)搜索策略總結(jié)
??sklearn中的邏輯回歸超參數(shù)眾多,在算力允許的情況下,建議盡量設(shè)置更多的迭代次數(shù)(max_iter)和更小的收斂條件(tol),基本的搜索參數(shù)為正則化項(xiàng)(penalty)+經(jīng)驗(yàn)風(fēng)險(xiǎn)系數(shù)(C)+求解器(solver),如果算力允許,可以納入彈性網(wǎng)正則化項(xiàng)進(jìn)行搜索,并搜索l1正則化項(xiàng)權(quán)重系數(shù)(l1_ratio)。若樣本存在樣本不均衡,可帶入class_weight進(jìn)行搜索,若搜索目標(biāo)是提升f1-Score或ROC-AUC,則可通過自定義評估器進(jìn)行閾值移動(dòng),若希望進(jìn)行更加精確的搜索,可以納入連續(xù)變量的編碼方式進(jìn)行搜索。
- 閾值移動(dòng)與樣本權(quán)重調(diào)優(yōu)總結(jié)
??根據(jù)上面的實(shí)驗(yàn)結(jié)果,對于閾值調(diào)優(yōu)和樣本權(quán)重調(diào)優(yōu)可以進(jìn)行如下總結(jié):
??(1)閾值移動(dòng)往往出現(xiàn)在f1-Score調(diào)優(yōu)或ROC-AUC調(diào)優(yōu)的場景中,由于閾值移動(dòng)對召回率、精確度等指標(biāo)調(diào)整效果顯著,因此該參數(shù)的搜索往往效果要好于邏輯回歸其他默認(rèn)參數(shù),類似的情況也出現(xiàn)在其他能夠輸出概率結(jié)果的模型中(如決策樹、隨機(jī)森林等);
??(2)樣本權(quán)重調(diào)節(jié)往往出現(xiàn)在非平衡類數(shù)據(jù)集的建模場景中,通過該參數(shù)的設(shè)置,能夠讓模型在訓(xùn)練過程中更加關(guān)注少數(shù)類樣本,從而一定程度起到平衡數(shù)據(jù)集不同類別樣本的目的,并且相比于其他平衡樣本方法(例如過采樣、欠采樣、SMOTEENN等),該方法能夠更好的避免過擬合,并且該參數(shù)同樣也是一個(gè)通用參數(shù),出現(xiàn)在sklearn集成的諸多模型中。建議如果算力允許,可以在任何指標(biāo)調(diào)整過程中對該參數(shù)進(jìn)行搜索;
??(3)不過如果是圍繞f1-Score或ROC-AUC進(jìn)行調(diào)優(yōu),閾值移動(dòng)和樣本權(quán)重調(diào)節(jié)會(huì)有功能上的重復(fù),此時(shí)建議優(yōu)先選用閾值進(jìn)行搜索。
- 結(jié)果解讀
??對于邏輯回歸來說,模型可解釋性的核心在于模型是線性方程,據(jù)此我們可以根據(jù)線性方程中自變量的系數(shù)對其進(jìn)行結(jié)果解讀,包括自變量變化如何影響因變量,以及自變量之間的相對關(guān)系等。
四、決策樹模型訓(xùn)練與結(jié)果解釋
1.決策樹模型訓(xùn)練
??接下來,繼續(xù)測試決策樹模型。我們知道,由于決策樹的分類邊界更加靈活,相比只能進(jìn)行線性邊界劃分的邏輯回歸來來說,大多數(shù)情況下都能取得一個(gè)更好的預(yù)測結(jié)果。當(dāng)然,對于決策樹來說,由于并沒有類似線性方程的數(shù)值解釋,因此無需對分類變量進(jìn)行獨(dú)熱編碼轉(zhuǎn)化,直接進(jìn)行自然數(shù)轉(zhuǎn)化即可
- 默認(rèn)參數(shù)模型訓(xùn)練
能夠發(fā)現(xiàn),模型嚴(yán)重過擬合,即在訓(xùn)練集上表現(xiàn)較好,但在測試集上表現(xiàn)一般。此時(shí)可以考慮進(jìn)行網(wǎng)格搜索,通過交叉驗(yàn)證來降低模型結(jié)構(gòu)風(fēng)險(xiǎn)。
2.決策樹模型優(yōu)化
??決策樹模型的參數(shù)解釋如下:
一般來說,我們可以考慮樹模型生長相關(guān)的參數(shù)來構(gòu)造參數(shù)空間,當(dāng)然,在新版sklearn中還加入了ccp_alpha參數(shù),該參數(shù)是決策樹的結(jié)構(gòu)風(fēng)險(xiǎn)系數(shù),作用和邏輯回歸中C的作用類似,但二者取值正好相反(ccp_alpha是結(jié)構(gòu)風(fēng)險(xiǎn)系數(shù),而C是經(jīng)驗(yàn)風(fēng)險(xiǎn)系數(shù))。此處我們選取max_depth、min_samples_split、min_samples_leaf、max_leaf_nodes和ccp_alpha進(jìn)行搜索:
Rα(T)=R(T)+α∣T~∣R_\alpha(T) = R(T) + \alpha|\widetilde{T}| Rα?(T)=R(T)+α∣T∣
能夠發(fā)現(xiàn)決策樹的訓(xùn)練效率要比邏輯回歸高很多,接下來查看搜索結(jié)果:
# 查看驗(yàn)證集準(zhǔn)確率均值 tree_search.best_score_ #0.79026369168357 # 查看最優(yōu)參數(shù)組 tree_search.best_params_ #{'decisiontreeclassifier__ccp_alpha': 0.0, # 'decisiontreeclassifier__max_depth': 5, # 'decisiontreeclassifier__max_leaf_nodes': 8, # 'decisiontreeclassifier__min_samples_leaf': 1, # 'decisiontreeclassifier__min_samples_split': 2}能夠發(fā)現(xiàn),決策樹的最優(yōu)參數(shù)都在設(shè)置的范圍內(nèi)。這里需要注意的是,如果某些參數(shù)的最優(yōu)取值達(dá)到搜索空間的邊界,則需要進(jìn)一步擴(kuò)大該參數(shù)的搜索范圍。接下來查看經(jīng)過網(wǎng)格搜索后的模型預(yù)測結(jié)果:
# 計(jì)算預(yù)測結(jié)果 result_df(tree_search.best_estimator_, X_train, y_train, X_test, y_test)
能夠發(fā)現(xiàn),經(jīng)過網(wǎng)格搜索和交叉驗(yàn)證后,決策樹的過擬合問題已經(jīng)的到解決,并且最終預(yù)測結(jié)果與邏輯回歸類似。
??需要知道的是,在大多數(shù)情況下,決策樹的判別效力實(shí)際上是要強(qiáng)于邏輯回歸(邏輯回歸只能構(gòu)建線性決策邊界,而決策樹可以構(gòu)建折線決策邊界),而此處決策樹表現(xiàn)出了和邏輯回歸類似的判別效力,則說明該數(shù)據(jù)集本身建模難度較大,極有可能是一個(gè)“上手容易、精通極難”的數(shù)據(jù)集。
在后面的建模過程中我們會(huì)陸續(xù)發(fā)現(xiàn),諸多大殺四方的集成模型(XGB、LightGBM、CatBoost)在初始狀態(tài)下也只能跑到80%準(zhǔn)確率。
3.決策樹模型解釋
??接下來進(jìn)行決策樹模型的模型解釋,相比邏輯回歸,樹模型的模型解釋會(huì)相對來說簡單一些。樹模型的模型解釋主要有兩點(diǎn),其一是根據(jù)樹模型的.feature_importances_屬性來查看各個(gè)特征的重要性:
fi = tree_search.best_estimator_.named_steps['decisiontreeclassifier'].feature_importances_ fi #array([0. , 0. , 0. , 0. , 0. , # 0. , 0.11262871, 0.15756862, 0. , 0. , # 0. , 0. , 0. , 0.5955054 , 0. , # 0. , 0.10555534, 0.02874193, 0. ])需要注意的是,特征重要性為0表示該列特征并未在樹模型生長過程中提供分支依據(jù)。
類似的,我們也可以以列名作為index、以特征重要性值作為數(shù)值,構(gòu)建Series:
col_names = category_cols + numeric_cols col_names # ['gender', # 'SeniorCitizen', # 'Partner', # 'Dependents', # 'PhoneService', # 'MultipleLines', # 'InternetService', # 'OnlineSecurity', # 'OnlineBackup', # 'DeviceProtection', # 'TechSupport', # 'StreamingTV', # 'StreamingMovies', # 'Contract', # 'PaperlessBilling', # 'PaymentMethod', # 'tenure', # 'MonthlyCharges', # 'TotalCharges'] feature_importances = pd.Series(fi, index=col_names) feature_importances #gender 0.000000 #SeniorCitizen 0.000000 #Partner 0.000000 #Dependents 0.000000 #PhoneService 0.000000 #MultipleLines 0.000000 #InternetService 0.112629 #OnlineSecurity 0.157569 #OnlineBackup 0.000000 #DeviceProtection 0.000000 #TechSupport 0.000000 #StreamingTV 0.000000 #StreamingMovies 0.000000 #Contract 0.595505 #PaperlessBilling 0.000000 #PaymentMethod 0.000000 #tenure 0.105555 #MonthlyCharges 0.028742 #TotalCharges 0.000000 #dtype: float64然后查看5個(gè)重要性不為0的特征的對比分布:
feature_importances.sort_values(ascending = False)[:5].plot(kind='bar')
??當(dāng)然,樹模型的特征重要性只能給與一個(gè)直觀的特征是否重要的感受,并不能像邏輯回歸一樣可以解釋其數(shù)值的具體含義。此外需要注意的是,樹模型的特征重要性的數(shù)值計(jì)算過程存在一定的隨機(jī)性,也就是多次運(yùn)行可能得到多組結(jié)果不同的特征重要性計(jì)算結(jié)果。因此很多時(shí)候樹模型的特征重要性只能作為最終模型解釋的參考。
若要精準(zhǔn)的計(jì)算于解釋特征重要性,可以考慮使用SHAP方法。此外,目前尚未接觸到的一類特征重要性的用途是借助進(jìn)行特征篩選,下一部分在討論特征篩選時(shí)會(huì)具體講解。
??除了特征重要性以外,樹模型還提供了非常直觀的樣本分類規(guī)則,并以樹狀圖形式進(jìn)行呈現(xiàn)。我們可以借助sklearn中數(shù)模塊內(nèi)的plot_tree函數(shù)來繪制樹狀圖,并據(jù)此進(jìn)一步提取有效的樣本分類規(guī)則:
plt.figure(figsize=(16, 6), dpi=200) tree.plot_tree(tree_search.best_estimator_.named_steps['decisiontreeclassifier'])
提取分類規(guī)則的過程是從葉節(jié)點(diǎn)往上進(jìn)行提取,葉節(jié)點(diǎn)中的基尼系數(shù)代表當(dāng)前數(shù)據(jù)集中樣本標(biāo)簽的不純度,越是有效的分類規(guī)則,對應(yīng)的基尼系數(shù)越小,而樣本數(shù)量越多,則說明該規(guī)則越有“普適性”。例如我們可以提取右側(cè)分支的第三層左側(cè)葉節(jié)點(diǎn),該節(jié)點(diǎn)對應(yīng)的分類規(guī)則可以解釋為:X[13]不滿足小于等于0.5時(shí)、且X[17]小于等于93.675時(shí),在總共1674條樣本中,只有58條樣本是流失用戶,約占比3%,說明滿足該規(guī)則的用戶大多都不會(huì)流失。
當(dāng)然我們這里可以進(jìn)一步查看X[13]和X[17]所代表的特征:
cat_rules = tree_search.best_estimator_.named_steps['columntransformer'].named_transformers_['cat'].categories_ cat_rules #[array(['Female', 'Male'], dtype=object), # array([0, 1], dtype=int64), # array(['No', 'Yes'], dtype=object), # array(['No', 'Yes'], dtype=object), # array(['No', 'Yes'], dtype=object), # array(['No', 'No phone service', 'Yes'], dtype=object), # array(['DSL', 'Fiber optic', 'No'], dtype=object), # array(['No', 'No internet service', 'Yes'], dtype=object), # array(['No', 'No internet service', 'Yes'], dtype=object), # array(['No', 'No internet service', 'Yes'], dtype=object), # array(['No', 'No internet service', 'Yes'], dtype=object), # array(['No', 'No internet service', 'Yes'], dtype=object), # array(['No', 'No internet service', 'Yes'], dtype=object), # array(['Month-to-month', 'One year', 'Two year'], dtype=object), # array(['No', 'Yes'], dtype=object), # array(['Bank transfer (automatic)', 'Credit card (automatic)', # 'Electronic check', 'Mailed check'], dtype=object)] col_names[13], cat_rules[13] #('Contract', array(['Month-to-month', 'One year', 'Two year'], dtype=object)) col_names[17] #'MonthlyCharges'也就是說,大多數(shù)非按月付費(fèi)用戶、并且月消費(fèi)金額小于92.5的用戶留存率較大。此外還有類似在按月付費(fèi)用戶中,未購買OnlineSecurity(X[7]<=0.5)、且入網(wǎng)不足8個(gè)月(X[16]<=7.5)、且購買了InternetService的用戶,流失用戶數(shù)量是留存用戶數(shù)量的3倍。其他規(guī)則我們也可以通過樹狀圖、按照類似方法進(jìn)行提取,當(dāng)然,樹的層數(shù)越多,相關(guān)規(guī)則的說明就越復(fù)雜,同時(shí)也就越不利于進(jìn)行解釋。
(col_names[7], col_names[16], col_names[6]) #('OnlineSecurity', 'tenure', 'InternetService')??當(dāng)然,借助這些規(guī)則,我們其實(shí)可以進(jìn)一步衍生一些業(yè)務(wù)指標(biāo)(即衍生一些新的特征),例如付費(fèi)形式和付費(fèi)金額的交叉組合、購買服務(wù)和入網(wǎng)時(shí)間的交叉組合等。更多特征衍生策略,我們將在下一小節(jié)重點(diǎn)講解。
??至此,我們就完成了樹模型的結(jié)果解釋。
總結(jié)
以上是生活随笔為你收集整理的电信用户流失预测案例(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电信用户流失预测案例(2)(特征工程)
- 下一篇: 金融风控实战——信贷评分卡