4_基于GBDT、LR的分类方法

2020-11-25  本文已影响0人  蓝冻

推荐场景下的一些问题可以转化为分类问题,甚至是二分类问题。

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 )

上一篇下一篇

猜你喜欢

热点阅读