1. 程式人生 > >ML - 貸款使用者逾期情況分析3 - 模型調優

ML - 貸款使用者逾期情況分析3 - 模型調優

文章目錄

模型調優 (判定貸款使用者是否逾期)

給定金融資料,預測貸款使用者是否會逾期。
(status是標籤:0表示未逾期,1表示逾期。)

Task6(模型調優) - 使用網格搜尋對模型進行調優, 並採用五折交叉驗證的方式進行模型評估

import pandas as pd

import warnings
warnings.filterwarnings("ignore")

# 資料集預覽
data = pd.read_csv('data.csv')
# 去重
data.drop_duplicates(inplace=True)
print(data.shape)
data.head()

匯入特徵和獲取label

import pickle
# 載入特徵
with open('feature.pkl', 'rb') as f:
    X = pickle.load(f)

# 觀測正負樣本是否均衡
y =
data.status y.value_counts()

1. 資料集劃分

# 劃分訓練集測試集
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,random_state=2333)

# 特徵歸一化
std = StandardScaler()
X_train = std.fit_transform(
X_train) X_test = std.transform(X_test)

2. 模型評估

from sklearn.metrics import accuracy_score, roc_auc_score

def model_metrics(clf, X_train, X_test, y_train, y_test):
    # 預測
    y_train_pred = clf.predict(X_train)
    y_test_pred = clf.predict(X_test)
    
    y_train_proba = clf.predict_proba(X_train)[:,1]
    y_test_proba = clf.predict_proba(X_test)[:,1]
    
    # 準確率
    print('[準確率]', end = ' ')
    print('訓練集:', '%.4f'%accuracy_score(y_train, y_train_pred), end = ' ')
    print('測試集:', '%.4f'%accuracy_score(y_test, y_test_pred))
    
    # auc取值:用roc_auc_score或auc
    print('[auc值]', end = ' ')
    print('訓練集:', '%.4f'%roc_auc_score(y_train, y_train_proba), end = ' ')
    print('測試集:', '%.4f'%roc_auc_score(y_test, y_test_proba))

匯入包

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn import svm
from sklearn.tree import DecisionTreeClassifier
from xgboost.sklearn import XGBClassifier
from lightgbm.sklearn import LGBMClassifier

3. LR模型

lr = LogisticRegression()
param = {'C': [1e-3,0.01,0.1,1,10,100,1e3], 'penalty':['l1', 'l2']}

gsearch = GridSearchCV(lr, param_grid = param,scoring ='roc_auc', cv=5)
gsearch.fit(X_train, y_train)

print('最佳引數:',gsearch.best_params_)
print('訓練集的最佳分數:', gsearch.best_score_)
print('測試集的最佳分數:', gsearch.score(X_test, y_test))

輸出

最佳引數: {‘C’: 0.1, ‘penalty’: ‘l1’}
訓練集的最佳分數: 0.7839975682166337
測試集的最佳分數: 0.7994893464372945

lr = LogisticRegression(C = 0.1, penalty = 'l1')
lr.fit(X_train, y_train)
model_metrics(lr, X_train, X_test, y_train, y_test)

輸出

[準確率] 訓練集: 0.7959 測試集: 0.8073
[auc值] 訓練集: 0.8016 測試集: 0.7995

4. SVM模型

調參範圍可設為’gamma’:[0.001,0.01,0.1,1,10,100], ‘C’:[0.001,0.01,0.1,1,10,100]}。鑑於時間原因, 下面網格搜尋時選用較小區間。

# 1) 線性SVM
svm_linear = svm.SVC(kernel = 'linear', probability=True)
param = {'C':[0.01,0.1,1]}
gsearch = GridSearchCV(svm_linear, param_grid = param,scoring ='roc_auc', cv=5)
gsearch.fit(X_train, y_train)

print('最佳引數:',gsearch.best_params_)
print('訓練集的最佳分數:', gsearch.best_score_)
print('測試集的最佳分數:', gsearch.score(X_test, y_test))

輸出

最佳引數: {‘C’: 0.01}
訓練集的最佳分數: 0.7849963207712166
測試集的最佳分數: 0.810812878176418

svm_linear = svm.SVC(C = 0.01, kernel = 'linear', probability=True)
svm_linear.fit(X_train, y_train)
model_metrics(svm_linear, X_train, X_test, y_train, y_test)

輸出

[準確率] 訓練集: 0.7848 測試集: 0.7912
[auc值] 訓練集: 0.8044 測試集: 0.8108

# 2) 多項式SVM
svm_poly = svm.SVC(kernel = 'poly', probability=True)
param = {'C':[0.01,0.1,1]}
gsearch = GridSearchCV(svm_poly, param_grid = param,scoring ='roc_auc', cv=5)
gsearch.fit(X_train, y_train)

print('最佳引數:',gsearch.best_params_)
print('訓練集的最佳分數:', gsearch.best_score_)
print('測試集的最佳分數:', gsearch.score(X_test, y_test))

輸出

最佳引數: {‘C’: 0.01}
訓練集的最佳分數: 0.7359832819347378
測試集的最佳分數: 0.7259879405573931

svm_poly =  svm.SVC(C = 0.01, kernel = 'poly', probability=True)
svm_poly.fit(X_train, y_train)
model_metrics(svm_poly, X_train, X_test, y_train, y_test)

輸出

[準確率] 訓練集: 0.7538 測試集: 0.7547
[auc值] 訓練集: 0.8690 測試集: 0.7260

# 3) 高斯SVM
svm_rbf = svm.SVC(probability=True)
param = {'gamma':[0.01,0.1,1,10], 
         'C':[0.01,0.1,1]}
gsearch = GridSearchCV(svm_poly, param_grid = param,scoring ='roc_auc', cv=5)
gsearch.fit(X_train, y_train)

print('最佳引數:',gsearch.best_params_)
print('訓練集的最佳分數:', gsearch.best_score_)
print('測試集的最佳分數:', gsearch.score(X_test, y_test))

輸出

最佳引數: {‘C’: 0.01, ‘gamma’: 0.01}
訓練集的最佳分數: 0.7370458508629731
測試集的最佳分數: 0.7247746108112956

svm_rbf =  svm.SVC(gamma = 0.01, C =0.01 , probability=True)
svm_rbf.fit(X_train, y_train)
model_metrics(svm_rbf, X_train, X_test, y_train, y_test)

輸出

[準確率] 訓練集: 0.7475 測試集: 0.7526
[auc值] 訓練集: 0.8614 測試集: 0.7944

# 4) sigmoid - SVM
svm_sigmoid = svm.SVC(kernel = 'sigmoid',probability=True)
param = {'C':[0.01,0.1,1]}
gsearch = GridSearchCV(svm_sigmoid, param_grid = param,scoring ='roc_auc', cv=5)
gsearch.fit(X_train, y_train)

print('最佳引數:',gsearch.best_params_)
print('訓練集的最佳分數:', gsearch.best_score_)
print('測試集的最佳分數:', gsearch.score(X_test, y_test))

輸出

最佳引數: {‘C’: 0.01}
訓練集的最佳分數: 0.7747312761692854
測試集的最佳分數: 0.7803266494690364

svm_sigmoid =  svm.SVC(C = 0.01, kernel = 'sigmoid',probability=True)
svm_sigmoid.fit(X_train, y_train)
model_metrics(svm_sigmoid, X_train, X_test, y_train, y_test)

輸出

[準確率] 訓練集: 0.7475 測試集: 0.7526
[auc值] 訓練集: 0.7615 測試集: 0.7803

5. 決策樹模型

1)首先對決策樹最大深度max_depth和內部節點再劃分所需最小樣本數min_samples_split進行網格搜尋。

param = {'max_depth':range(3,14,2), 'min_samples_split':range(100,801,200)}
gsearch = GridSearchCV(DecisionTreeClassifier(max_depth=8,min_samples_split=300,min_samples_leaf=20, max_features='sqrt' ,random_state =2333),
                       param_grid = param,scoring ='roc_auc', cv=5)

gsearch.fit(X_train, y_train)
# gsearch.grid_scores_, 
gsearch.best_params_, gsearch.best_score_

輸出:({‘max_depth’: 11, ‘min_samples_split’: 100}, 0.7061428632294259)

2)對內部節點再劃分所需最小樣本數min_samples_split和葉子節點最少樣本數min_samples_leaf一起調參。

param = {'min_samples_split':range(50,1000,100), 'min_samples_leaf':range(60,101,10)}
gsearch = GridSearchCV(DecisionTreeClassifier(max_depth=11,min_samples_split=100,min_samples_leaf=20, max_features='sqrt',random_state =2333),
                       param_grid = param,scoring ='roc_auc', cv=5)

gsearch.fit(X_train, y_train)
# gsearch.grid_scores_, 
gsearch.best_params_, gsearch.best_score_

輸出:({‘min_samples_leaf’: 80, ‘min_samples_split’: 550}, 0.7118895755089746)

3)再對最大特徵數max_features進行網格搜尋

param = {'max_features':range(7,20,2)}
gsearch = GridSearchCV(DecisionTreeClassifier(max_depth=11,min_samples_split=550,min_samples_leaf=80, max_features='sqrt',random_state =2333),
                       param_grid = param,scoring ='roc_auc', cv=5)

gsearch.fit(X_train, y_train)
# gsearch.grid_scores_, 
gsearch.best_params_, gsearch.best_score_

輸出:({‘max_features’: 19}, 0.7050922939313528)

觀察最終結果

dt = DecisionTreeClassifier(max_depth=11,min_samples_split=550,min_samples_leaf=80,max_features=19,random_state =2333)
dt.fit(X_train, y_train)
model_metrics(dt, X_train, X_test, y_train, y_test)

輸出

[準確率] 訓練集: 0.7538 測試集: 0.7561
[auc值] 訓練集: 0.7155 測試集: 0.6836

6. XGBoost模型

1、max_depth = 5 :這個引數的取值最好在3-10之間。我選的起始值為5,但是你也可以選擇其它的值。起始值在4-6之間都是不錯的選擇。
2、min_child_weight = 1:在這裡選了一個比較小的值,因為這是一個極不平衡的分類問題。因此,某些葉子節點下的值會比較小。
3、gamma = 0: 起始值也可以選其它比較小的值,在0.1到0.2之間就可以。這個引數後繼也是要調整的。
4、subsample, colsample_bytree = 0.8: 這個是最常見的初始值了。典型值的範圍在0.5-0.9之間。

首先看一下預設引數的結果

import warnings
warnings.filterwarnings("ignore")

xgb0 = XGBClassifier()
xgb0.fit(X_train, y_train)

model_metrics(xgb0, X_train, X_test, y_train, y_test)

輸出

[準確率] 訓練集: 0.8530 測試集: 0.8024
[auc值] 訓練集: 0.9155 測試集: 0.7932
1)首先從步長(learning rate)和迭代次數(n_estimators)入手。

開始選擇一個較小的步長來網格搜尋最好的迭代次數。這裡,我們將步長初始值設定為0.1, 對於迭代次數進行網格搜尋。

param_test = {'n_estimators':range(20,200,20)}
gsearch = GridSearchCV(estimator = XGBClassifier(learning_rate =0.1, n_estimators=140, max_depth=5, 
                                                  min_child_weight=1, gamma=0, subsample=0.8, 
                                                  colsample_bytree=0.8, objective= 'binary:logistic', 
                                                  nthread=4,scale_pos_weight=1, seed=27), 
                        param_grid = param_test, scoring='roc_auc',n_jobs=4,iid=False, cv=5)

gsearch.fit(X_train, y_train)
# gsearch.grid_scores_, 
gsearch.best_params_, gsearch.best_score_

({‘n_estimators’: 20}, 0.7822329511588559)

2) max_depth 和 min_child_weight 引數調優

param_test = {'max_depth':range(3,10,2), 'min_child_weight':range(1,12,2)}

gsearch = GridSearchCV(estimator = XGBClassifier(learning_rate =0.1, n_estimators=20, max_depth=5, 
                                                  min_child_weight=1, gamma=0, subsample=0.8, 
                                                  colsample_bytree=0.8, objective= 'binary:logistic', 
                                                  nthread=4,scale_pos_weight=1, seed=27), 
                        param_grid = param_test, scoring='roc_auc',n_jobs=4,iid=False, cv=5)

gsearch.fit(X_train, y_train)
# gsearch.grid_scores_, 
gsearch.best_params_, gsearch.best_score_

輸出:({‘max_depth’: 5, ‘min_child_weight’: 5}, 0.7852805853095239)

可以看出理想的max_depth值為5,理想的min_child_weight值為5。在這個值附近我們可以再進一步調整,來找出理想值。

param_test = {'max_depth':[3,4,5], 'min_child_weight':[3,4,5]}

gsearch = GridSearchCV(estimator = XGBClassifier(learning_rate =0.1, n_estimators=20, max_depth=5, 
                                                  min_child_weight=1, gamma=0, subsample=0.8, 
                                                  colsample_bytree=0.8, objective= 'binary:logistic', 
                                                  nthread=4,scale_pos_weight=1, seed=27), 
                        param_grid = param_test, scoring='roc_auc',n_jobs=4,iid=False, cv=5)

gsearch.fit(X_train, y_train)
# gsearch.grid_scores_, 
gsearch.best_params_, gsearch.best_score_

輸出:({‘max_depth’: 5, ‘min_child_weight’: 5}, 0.7852805853095239)

3)gamma引數調優

param_test = {'gamma':[i/10 for i in range(1,6)]}

gsearch = GridSearchCV(estimator = XGBClassifier(learning_rate =0.1, n_estimators=20, max_depth=5, 
                                                  min_child_weight=5, gamma=0, subsample=0.8, 
                                                  colsample_bytree=0.8, objective= 'binary:logistic', 
                                                  nthread=4,scale_pos_weight=1, seed=27), 
                        param_grid = param_test, scoring='roc_auc',n_jobs=4,iid=False, cv=5)

gsearch.fit(X_train, y_train)
# gsearch.grid_scores_, 
gsearch.best_params_, gsearch.best_score_

輸出:({‘gamma’: 0.4}, 0.7858965997168706)

4)調整subsample 和 colsample_bytree 引數

param_test = {'subsample':[i/10 for i in range(5,10)], 'colsample_bytree':[i/10 for i in range(5,10)]}

gsearch = GridSearchCV(estimator = XGBClassifier(learning_rate =0.1, n_estimators=20, max_depth=5, 
                                                  min_child_weight=5, gamma=0.4, subsample=0.8, 
                                                  colsample_bytree=0.8, objective= 'binary:logistic', 
                                                  nthread=4,scale_pos_weight=1, seed=27), 
                        param_grid = param_test, scoring='roc_auc',n_jobs=4,iid=False, cv=5)

gsearch.fit(X_train, y_train)
# gsearch.grid_scores_, 
gsearch.best_params_, gsearch.best_score_

輸出:({‘colsample_bytree’: 0.9, ‘subsample’: 0.9}, 0.7859006376180202)

從這裡可以看出來,subsample理想取值0.9, colsample_bytree理想取值都是0.9。現在,我們以0.05為步長,在這個值附近嘗試取值。

param_test = { 'subsample':[i/100 for i in range(85,101,5)], 'colsample_bytree':[i/100 for i in range(85,101,5)]}

gsearch = GridSearchCV(estimator = XGBClassifier(learning_rate =0.1, n_estimators=20, max_depth=5, 
                                                  min_child_weight=5, gamma=0.4, subsample=0.8
            
           

相關推薦

ML - 貸款使用者逾期情況分析3 - 模型調

文章目錄 模型調優 (判定貸款使用者是否逾期) 1. 資料集劃分 2. 模型評估 3. LR模型 4. SVM模型 5. 決策樹模型 6. XGBoost模型 7. LightGBM模型

ML - 貸款使用者逾期情況分析4 - 模型融合之Stacking

文章目錄 模型融合之Stacking (判定貸款使用者是否逾期) 1. 理論介紹 1.1 系統解釋 1.2 詳細解釋 2. 程式碼 2.1 調包實現 2.2 自己實現

ML - 貸款使用者逾期情況分析6 - Final

文章目錄 思路 1. 匯入資料 2. 效能評估函式 3. 模型優化 3.1 LR模型 3.2 SVM模型 3.3 決策樹模型 3.4 XGBoost模型 3.5 LightG

ML - 貸款使用者逾期情況分析5 - 特徵工程2(特徵選擇)

文章目錄 特徵選擇 (判定貸款使用者是否逾期) 1. IV值進行特徵選擇 1.1 基本介紹 1.2 計算公式 2. 隨機森林進行特徵選擇 2.1 平均不純度減少 mean decre

ML - 貸款使用者逾期情況分析2 - 特徵工程1(資料預處理)

文章目錄 資料預處理 (判定貸款使用者是否逾期) 1. 刪除無用特徵 2. 資料格式化 - X_date 3. 資料處理 - 類別特徵 X_cate 4. 資料處理 - 其他非數值型特徵 5. 資料處理 - 數值型特徵

ML - 貸款使用者逾期情況分析1 - Baseline

文章目錄 任務 總述 基本思路 程式碼部分 1. 資料集預覽 2. 資料預處理 2.1 刪除無用特徵 2.2 字元型特徵-編碼 2.3 缺失特徵處理

金融貸款逾期模型構建4——模型調

文章目錄 一、任務 二、概述 1、引數說明 2、常用方法 二、實現 1、模組引入 2、模型評估函式 3、資料讀取 4、Logistic Regress

機器學習與深度學習系列連載: 第一部分 機器學習(四)誤差分析(Bias and Variance)和模型調

1.誤差分析(Bias and Variance) 當我們以非常複雜的模型去進行測試的時候,可能得到的結果並不理想 影響結果的主要有兩個因素:Bias 偏差、Variance 方差 Bias 偏差 在這裡,我們定義偏差是指與目標結果的偏移量,這個偏

貸款使用者逾期情況分析

目錄 任務描述 實現過程 基本思路 4.2 LR 遇到的問題 參考 More 任務描述 給定金融資料,預測貸款使用者是否會逾期。(status是標籤:0表示未逾期,1表示逾期。) Misson1 - 構建邏輯

機器學習(二)工作流程與模型調

發生 較高的 mode lan 包含 因此 增加 絕對值 輸入 上一講中主要描述了機器學習特征工程的基本流程,其內容在這裏:機器學習(一)特征工程的基本流程 本次主要說明如下:   1)數據處理:此部分已經在上一節中詳細討論   2)特征工程:此部分已經在上一節中詳細討論

深度學習 - 模型調經歷(1)

模型調優經歷(1) 背景 遇到問題 思路 解決辦法 背景 樣本規模及劃分

泰坦尼克號資料探勘專案實戰——Task6 模型調

任務6:使用網格搜尋法對5個模型進行調優(調參時採用五折交叉驗證的方式),並進行模型評估。 參考:【1】https://blog.csdn.net/qfire/article/details/77601901 【2】https://blog.csdn.net/jasonding1354/

機器學習系統模型調實戰--所有調技術都附相應的scikit-learn實現

引言 如果你對機器學習演算法已經很熟悉了,但是有時候你的模型並沒有很好的預測效果或者你想要追求更好地模型效能。那麼這篇文章會告訴你一些最實用的技術診斷你的模型出了什麼樣的問題,並用什麼的方法來解決出現的問題,並通過一些有效的方法可以讓你的模型具有更好地效能。

【機器學習系列之七】模型調模型融合(程式碼應用篇)

這是本人對模型的融合的程式碼合集,環境是python3,只要複製過去就可以用了,非常方便。 目錄 1.交叉驗證 1.1 原理 1.2 GridSearchCV 2.繪製學習曲線 3.stacking 3.1 stacking原理 3.2 程式碼實現不

模型調:交叉驗證,超引數搜尋(複習17)

用模型在測試集上進行效能評估前,通常是希望儘可能利用手頭現有的資料對模型進行調優,甚至可以粗略地估計測試結果。通常,對現有資料進行取樣分割:一部分資料用於模型引數訓練,即訓練集;一部分資料用於調優模型配

(轉)MySQL慢查詢分析優化 + MySQL調

優化 mysqldump 默認 database host show mysqld mysql 命令 1.long_query_time的默認值為10,意思是運行10S以上的語句。 2.臨時設置開啟慢查詢日誌 mysql> show variables lik

效能測試分析與效能調診斷--史上最全的伺服器效能分析監控調

 一個系統或者網站在功能開發完成後一般最終都需要部署到伺服器上執行,那麼伺服器的效能監控和分析就顯得非常重要了,選用什麼配置的伺服器、如何對伺服器進行調優、如何從伺服器監控中發現程式的效能問題、如何判斷伺服器的瓶頸在哪裡等 就成為了伺服器效能監控和分析時重點需要去解決的問題了。  本文章節

netty的執行緒模型, 調 及 獻上寫過註釋的原始碼工程

Netty能幹什麼? Http伺服器 使用Netty可以編寫一個 Http伺服器, 就像tomcat那樣,能接受使用者傳送的http請求, , 只不過沒有實現Servelt規範, 但是它也能解析攜帶的引數, 對請求的路徑進行路由導航, 從而實現將不同的請求導向不同的handler進行處理 對socket與RP

深度學習模型調方法(Deep Learning學習記錄)

深度學習模型的調優,首先需要對各方面進行評估,主要包括定義函式、模型在訓練集和測試集擬合效果、交叉驗證、啟用函式和優化演算法的選擇等。 那如何對我們自己的模型進行判斷呢?——通過模型訓練跑程式碼,我們可以分別從訓練集和測試集上看到這個模型造成的損失大小(loss),還有它的精確率(ac

appium 3-31603調分析方法

out quit 分析 driver int generator tomat serve waiting Appium Log 清晰記錄了所有的請求和結果 [Appium] Welcome to Appium v1.8.1 [Appium] Appium REST http