5個常用模型的模型建立與評估
-
- 基本思路
- 資料需求分析
- 資料處理過程
-
- 導入包(包括下面的xgboost和lightgbm)
- 資料分析過程
- 資料标準歸一化
- 使用邏輯回歸進行預測
- 使用SVM進行預測
- 使用決策樹進行預測
- 使用xgboost進行預測
- 使用lightgbm預測
- 模型分析
-
-
- roc圖表
- 表格分析
-
- 模型建立問題總結
資料是金融資料,我們要做的是預測貸款使用者是否會逾期,表格中,status是标簽:0表示未逾期,1表示逾期。建構xgboost和lightgbm進行預測(在建構部分資料需要進行缺失值處理和資料類型轉換,如果不能處理,可以直接暴力删除)
基本思路
主要分為以下若幹步驟:
1)資料集預覽
2)資料預處理:切分X,y;删除無用特征;字元型特征編碼;缺失值填充 等
3)特征工程:暫無
4)模型選擇:邏輯回歸,svm,決策樹,xgboost,lightgbm 等
5)模型調參:暫無
6)性能評估
7)最終結果
資料需求分析
-
需要直接删除的資料
Unnamed: 0 使用者ID
trade_no:不知道是什麼
bank_card_no:卡号
id_name:名字
‘source’ 提示xs 先去掉
- 需要離散化處理的資料(此處不涉及)
- reg_preference_for_trad
- 針對日期資料的處理(轉換成年月日)(此處不涉及)
- first_transaction_time
- latest_query_time
- loans_latest_time
- 缺失值的填充
- 歸一化處理所有資料
資料處理過程
導入包(包括下面的xgboost和lightgbm)
import numpy as np
import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import*
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
資料分析過程
datanew = pd.read_csv('F:/ziliao/data/data1.csv', encoding='gbk')
"""
1.缺失值處理
"""
datanew=pd.DataFrame(datanew.fillna(0))
# 簡單的缺失值處理
# datanew.replace(to_replace='0.', value=np.nan)
# 丢棄帶有缺失值的資料
# datanew = datanew.dropna(axis=1, how='any')
data_columns = datanew.columns
"""
1.2 對reg_preference_for_trad 的處理 【映射】
nan=0 境外=1 一線=5 二線=2 三線 =3 其他=4
"""
n = set(datanew['reg_preference_for_trad'])
dic = {}
for i, j in enumerate(n):
dic[j] = i
datanew['reg_preference_for_trad'] = datanew['reg_preference_for_trad'].map(dic)
"""
1.3 資料集的切分
"""
X_train, X_test, y_train, y_test = train_test_split(datanew[data_columns[1:90]], datanew[data_columns[44]],test_size=0.3, random_state=666)
X_train.drop(["status","trade_no","bank_card_no","id_0me","source"],axis=1,inplace=True)
X_test.drop(["status","trade_no","bank_card_no","id_0me", "source"],axis=1,inplace=True)
資料标準歸一化
标準化資料,方差為1,均值為零進行資料的歸一化
"""
1.4标準化資料,方差為1,均值為零
"""
standardScaler = StandardScaler()
X_train_fit = standardScaler.fit_transform(X_train)
X_test_fit = standardScaler.transform(X_test)
使用邏輯回歸進行預測
print("\n{}使用邏輯回歸預測{}".format("*"*20, "*"*20))
log_reg = LogisticRegression()
# sgd = SGDClassifier()
log_reg.fit(X_train_fit, y_train)
log_reg.fit(X_train_fit, y_train)
log_reg_predict = log_reg.predict(X_test_fit)
decisions.update(logistic = log_reg.decision_function(X_test_fit)) ## (字典)模型:預測值
print("predict:",log_reg.score(X_test_fit, y_test))
print("roc_auc_score準确率:", roc_auc_score(y_test, log_reg_predict))
print("precision_score準确率:", precision_score(y_test, log_reg_predict))
print("recall_score準确率:", recall_score(y_test, log_reg_predict))
print("f1_score:",f1_score(y_test, log_reg_predict, average='macro'))
結果:

使用SVM進行預測
print("\n{}使用svm預測{}".format("*"*20, "*"*20))
lsvc = LinearSVC()
lsvc.fit(X_train_fit, y_train)
lsvc_predict = lsvc.predict(X_test_fit)
decisions.update(svm=lsvc.decision_function(X_test_fit))
print("linear_svc準确率:", lsvc.score(X_test_fit, y_test))
print("roc_auc_score準确率:", roc_auc_score(y_test, lsvc_predict))
print("precision_score準确率:", precision_score(y_test, lsvc_predict))
print("recall_score準确率:", recall_score(y_test, lsvc_predict))
print("f1_score準确率:",f1_score(y_test, lsvc_predict) )
結果:
使用決策樹進行預測
print("\n{}使用決策樹預測{}".format("*"*20, "*"*20))
dtc = DecisionTreeClassifier()
dtc.fit(X_train_fit, y_train)
dtc_predict = dtc.predict(X_test_fit)
decisions.update(DecisionTree=dtc.predict_proba(X_test_fit)[:,1])
print("DecisionTreeClassifier準确率:", dtc.score(X_test_fit, y_test))
print("roc_auc_score準确率:", roc_auc_score(y_test, dtc_predict))
print("precision_score準确率:", precision_score(y_test, dtc_predict))
print("recall_score準确率:", recall_score(y_test, dtc_predict))
print("f1_score準确率:",f1_score(y_test, dtc_predict) )
結果:
使用xgboost進行預測
安裝說明:xgboost安裝教程
參考文章:xgboost分類使用說明
分類使用的是 XGBClassifier
回歸使用的是 XGBRegression
print("\n{}使用XGboost預測{}".format("*"*20, "*"*20))
xgbc_model = XGBClassifier()
xgbc_model.fit(X_train_fit, y_train)
xgbc_model_predict = xgbc_model.predict(X_test_fit)
decisions.update(xgboost=xgbc_model.predict_proba(X_test_fit)[:,1])
print("xgbc_model準确率:", xgbc_model.score(X_test_fit, y_test))
print("roc_auc_score準确率:", roc_auc_score(y_test, xgbc_model_predict))
print("precision_score準确率:", precision_score(y_test, xgbc_model_predict))
print("recall_score準确率:", recall_score(y_test, xgbc_model_predict))
print("f1_score準确率:", f1_score(y_test, xgbc_model_predict) )
結果如下:
使用lightgbm預測
lightgbm安裝說明:lightgbm安裝教程,經實踐發現好像lightgbm并不支援32位的python。
參考文獻:lightgbm分類使用參考1,lightgbm分類使用參考2
分類使用的是 LGBMClassifier
回歸使用的是 LGBMRegression
print("\n{}使用lightgbm預測{}".format("*"*20, "*"*20))
lgbm_model = LGBMClassifier()
lgbm_model.fit(X_train_fit, y_train)
lgbm_model_predict = lgbm_model.predict(X_test_fit)
decisions.update(lightgmb=lgbm_model.predict_proba(X_test_fit)[:,1])
print(lgbm_model_predict)
print("lgbm_model準确率:", lgbm_model.score(X_test_fit, y_test))
print("roc_auc_score準确率:", roc_auc_score(y_test, lgbm_model_predict))
print("precision_score準确率:", precision_score(y_test, lgbm_model_predict))
print("recall_score準确率:", recall_score(y_test, lgbm_model_predict))
print("f1_score準确率:",f1_score(y_test, lgbm_model_predict) )
結果如下:
模型分析
roc圖表
1.ROC原理
2.ROC原理
3.ROC畫圖
表格分析
記錄五個模型關于precision,recall,f1_score,auc,roc的評分表格(為了友善僅保留四位)
precision | recall | f1_score | auc | roc_auc_score | |
---|---|---|---|---|---|
邏輯回歸 | 0.7059 | 0.3429 | 0.6633 | 0.7939 | 0.6450 |
線性SVM | 0.7202 | 0.3142 | 0.4376 | 0.7965 | 0.7821 |
決策樹 | 0.5082 | 0.4000 | 0.4476 | 0.6725 | 0.6285 |
xgboost | 0.7234 | 0.3532 | 0.4746 | 0.7909 | 0.6516 |
lightGBm | 0.6667 | 0.3532 | 0.4618 | 0.7775 | 0.6440 |
模型建立問題總結
- dtc = DecisionTreeClassifier(max_depth=8) ,為什麼沒有max_depth=8時,predict_proba(x_test_fit)輸出的是(0,…,1)。
- 評價分類結果相關知識和幾個算法的具體使用需要多看。