== 最近在做一个部署模型的项目,发现批量预测的结果和部署之后的单条数据入模结果不一致,用了半天的时间才终于找到结果不一致的原因:==
两次入模变量的列顺序不一致!
以前一致认为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并不会关心。
所以,
在训练模型时一定要保证训练集、验证集、测试集列顺序一致!