4_基于GBDT、LR的分类方法
推荐场景下的一些问题可以转化为分类问题,甚至是二分类问题。
GBDT是一种监督学习的方法。
假设我们有一个5000 X 21维的数组型训练集,5000为样本数,前20维是样本的特征,最后一维是分类的标签,取值为0或1。假设训练集已完成前期各项数据处理,仅等待输入模型进行训练。
设该训练集为 train,下面我们写一个函数,基于GBDT对训练集进行学习。
from sklearn.ensemble import GradientBoostingClassifier
def gbdt_train():
x_train = train[ :, 0:20]
y_train = train[ :, 20]
dt = GradientBoostingClassifier( learning_rate=0.1, n_estimators=100, max_depth=8 )
dt.fit( x_train, y_train )
return dt
现在,假设我们获得了测试集test,1000 X 21维的数组。我们依据测试集来对上一步训练的模型进行效果评估。
def model_eval():
x_test = test[ :, 0:20]
y_test = test[ :, 20]
dt = gbdt_train()
y_forcast = dt.predict_proba( x_test )
y_result = list()
for k in y_forcast:
y_result.append(1 if k[ 1 ] > 0.5 else 0) # 注意k的数据类型,k[1]才是对应的概率
mse = sklearn.metrics.mean_squared_error( y_test.values, y_result )
accuracy = sklearn.metrics.accuracy_score( y_test.values, y_result )
auc = sklearn.metrics.roc_auc_score( y_test.values, y_result )
可以看到,GBDT用起来还是挺简单的。
下面,我们再采用LR方法对上面的的数据进行训练。
from sklearn.linear_model import LogisticRegression
def lr_train():
x_train = train[ :, 0:20]
y_train = train[ :, 20]
lr = LogisticRegression( penalty='l2' , tol=1e-4, fit_intercept=True )
lr.fit( x_train, y_train )
return lr
我们依据测试集来对训练的模型进行效果评估。
def model_eval():
x_test = test[ :, 0:20]
y_test = test[ :, 20]
lr = lr_train()
y_forcast = lr.predict_proba( x_test ) # 注意lr.predict()与lr.predict_proba()的差别
y_result = list()
for k in y_forcast:
y_result.append(1 if k[ 1 ] > 0.5 else 0) # 注意k的数据类型,k[1]才是对应的概率
mse = sklearn.metrics.mean_squared_error( y_test.values, y_result )
accuracy = sklearn.metrics.accuracy_score( y_test.values, y_result )
auc = sklearn.metrics.roc_auc_score( y_test.values, y_result )
可以看到,LR用起来也挺简单的。
下面,我们再建立一个GBDT+LR的模型来训练数据。
from sklearn.preprocessing import OneHotEncoder
def gbdt_lr_train():
x_train = train[ :, 0:20]
y_train = train[ :, 20]
dt = GradientBoostingClassifier()
dt.fit( x_train, y_train )
gbdt_lr = LogisticRegression()
encoder = OneHotEncoder()
encoder.fit( dt.apply(x_train).reshape(-1, 100) ) # 此处100为模型dt里参数n_estimators的值,此处进行数据格式转换才能传入encoder.fit()
gbdt_lr.fit( encoder.transform( dt.apply(x_train).reshape(-1, 100)), y_train)
return encoder, dt, gbdt_lr
下面,们依据测试集来对训练的模型进行效果评估。
def model_eval():
x_test = test[ :, 0:20]
y_test = test[ :, 20]
encoder, dt, gbdt_lr = gbdt_lr_train()
y_forcast = gbdt_lr.predict_proba( encoder.transform( dt.apply(x_test).reshape(-1,100)) )
y_result = list()
for k in y_forcast:
y_result.append(1 if k[ 1 ] > 0.5 else 0)
mse = sklearn.metrics.mean_squared_error( y_test.values, y_result )
accuracy = sklearn.metrics.accuracy_score( y_test.values, y_result )
auc = sklearn.metrics.roc_auc_score( y_test.values, y_result )