1. 程式人生 > >特徵順序對模型的影響

特徵順序對模型的影響

== 最近在做一個部署模型的專案,發現批量預測的結果和部署之後的單條資料入模結果不一致,用了半天的時間才終於找到結果不一致的原因:==

兩次入模變數的列順序不一致!

以前一致認為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並不會關心。
所以,
在訓練模型時一定要保證訓練集、驗證集、測試集列順序一致!