lightGBM是基于GBDT的一个算法。因为传统的GBDT在每一次迭代时需要多次遍历整个训练数据,所以GBDT的训练会受内存等的限制。尤其在处理工业级海量数据的数据时,GBDT不能满足其需求。而lightGBM支持高效率的并行训练,并且具有更快的迭代速度,更低的内存消耗、更好的准确率,支持分布式可以快速处理海量数据。lightGBM的优缺点主要如下:
XGBoost也是GBDT框架下的一个算法。相对于XGBoost, lightGBM的优点主要集中在内存和速度两个方面。
这里使用lightGBM的sklearn接口。下面以LGBMClassifier()为例,介绍其中的主要参数。
LGBMClassifier()的fit()方法中也有几个重要参数需要说明。具体如下:
import pandas as pd
from lightgbm import LGBMClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score,accuracy_score
from sklearn.impute import SimpleImputer
from sklearn.model_selection import GridSearchCV
data=pd.read_csv('Titanic.train.csv')
#删除无用字段
data=data.drop(['PassengerId','Name','Ticket','Cabin'],axis=1)
#对Age字段的缺失值用均值进行填充。也可以使用模型预测缺失值。
imputer=SimpleImputer(strategy='mean')
data['Age']=imputer.fit_transform(data[['Age']])
#把object型转换category型(lightGBM不接受object型)
for col in data.columns:
if data[col].dtype=='object':
data[col]=data[col].astype('category')
x=data.drop(['Survived'],axis=1)
y=data['Survived']
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
params={'max_depth':[2,3,4],
'learning_rate':[0.05,0.1,0.15,0.2,1],
'n_estimators':[30,50,80,100]}
estimator=LGBMClassifier(objective='binary',reg_alpha=0.1,
reg_lambda=0.2)
gbm=GridSearchCV(estimator,params)
gbm.fit(x_train,y_train,early_stopping_rounds=10,
categorical_feature=['Sex','Embarked'],
eval_metric=['auc','binary'],
eval_set=[(x_train,y_train)],
eval_names='train',
verbose=10)
model=gbm.best_estimator_
y_pred=model.predict(x_test)
roc_auc=roc_auc_score(y_test,model.predict_proba(x_test)[:,1])
accuracy=accuracy_score(y_test,y_pred)
print("lightGBM模型的准确率为{:.3f},AUC={:.3f}".format(accuracy,roc_auc))
其运行结果如下:
lightGBM模型的准确率为0.849,AUC=0.904