特徵順序對模型的影響
阿新 • • 發佈:2019-01-30
== 最近在做一個部署模型的專案,發現批量預測的結果和部署之後的單條資料入模結果不一致,用了半天的時間才終於找到結果不一致的原因:==
兩次入模變數的列順序不一致!
以前一致認為lgb/xgb這樣的模型時可以識別列名的,只要輸入的特徵相同就沒有問題,但這種觀點是錯誤的,做了一個簡單的實驗:
from sklearn import datasets
import lightgbm as lgb
import pandas as pd
iris = datasets.load_iris()
X = iris.data
y = iris.target
X = pd.DataFrame(X)
lgb_train = lgb.Dataset(X, y)
params = {
'task': 'train',
'boosting_type': 'gbdt', # 設定提升型別
'objective': 'regression', # 目標函式
'metric': {'l2', 'auc'}, # 評估函式
'num_leaves': 31, # 葉子節點數
'learning_rate': 0.05, # 學習速率
'feature_fraction': 0.9, # 建樹的特徵選擇比例
'bagging_fraction': 0.8, # 建樹的樣本取樣比例
'bagging_freq': 5, # k 意味著每 k 次迭代執行bagging
'verbose': 1 # <0 顯示致命的, =0 顯示錯誤 (警告), >0 顯示資訊
}
gbm = lgb.train(params,lgb_train,num_boost_round=20)
使用鳶尾花資料集做訓練,然後從中間抽出一條資料做預測,結果如下
test = pd.DataFrame([[5.1],[3.5],[1.4],[0.2]]).T
print(gbm.predict(test))
[0.35976825]
變換測試集列順序,結果如下
test = pd. DataFrame([[0.2],[3.5],[1.4],[5.1]]).T
print(gbm.predict(test))
[0.59565977]
參考這篇部落格https://blog.csdn.net/hshuihui/article/details/53258111,可能是由於資料傳入時呼叫了as_matrix()方法,直接傳入的矩陣,列什麼的sklearn或者lgb並不會關心。
所以,
在訓練模型時一定要保證訓練集、驗證集、測試集列順序一致!