首页 > 编程知识 正文

blending模型融合,gbm模型

时间:2023-05-05 16:48:11 阅读:45294 作者:4186

以前的比较相关文章:

推荐系统中的传统机型——LightGBM LR融合

python -机器学习lightgbm相关实践

1深入调频原理和实践的是美团技术团队的深入调频原理和实践

调频和调频模型是近几年提出的模型,由于即使在数据量比较大、特征稀疏的情况下,也能取得优异的性能和效果,经常在大型企业举办的CTR预计比赛中取得好的战绩。 美团技术团队在构建DSP的过程中,探索并使用了调频和调频模型进行了CTR和CVR的估算,取得了良好的效果。

One-Hot编码后,大部分样本数据特征稀疏。 One-Hot代码的另一个特点是特征空间变大。 通过同时观察大量的样本数据,可以看出如果有某个特征相关,则与label的相关性会提高。

调频主要用于估算站内的CTR和CVR,即一个用户对一个商品的潜在点击率和点击后的转化率。

CTR和CVR预测模型在线培训并用于在线预测。 两种模式采用的特征相似,主要有三种。 是用户相关的特征,商品相关的特征,还有用户-商品匹配的特征。 用户特征包括年龄、性别、职业、兴趣、类别偏好、浏览/购买类别等基本信息,以及用户最近的点击量、购买量、消费额等统计信息。 商品相关特征包括所属类别、销售量、价格、得分、历史CTR/CVR等信息。 用户-商品匹配的特点主要有浏览/购买类别匹配、浏览/购买商匹配、兴趣爱好匹配等几个维度。

要使用FFM方法,必须将所有特征转换为field_id:feat_id:value格式。

field_id表示特征所属的field编号,feat_id表示特征编号,value表示特征的值

数值型特征比较容易处理,只需分配不同的字段编号,如用户评论得分、商品历史记录CTR/CVR等。 categorical特征需要One-Hot编码为数值型,编码生成的所有特征属于同一字段,特征值只能为0或1,如用户性别、年龄段、商品类别id等。 它还具有第三个特点,如用户浏览/购买类别,有多个类别id,用一个数字衡量用户浏览或购买各类商品的数量。 根据categorical特征处理这样的特征,其中特征值不是0或1,而是表示用户浏览或购买数量的数值。 用前述方法得到field_id后,对变换后的特征依次编号得到feat_id,特征值也可以用前一方法得到。

2案例代码的案例参考了wangru8080/gbdt-lr

其中,FFM使用libffm库进行训练。 代码仅演示了如何构建数据输入(FFMFormat )。 构建输入格式后,直接使用libffm进行训练就可以了。

我们libffm所需的培训格式是特殊的:

label field _ id : feature _ id : value field _ id : feature _ id : value field _ id 3360 feature _ id 3365292;

field_id是各特征区域id编号feature_id是所有特征值的id编号(能够连续编码和散列编码) value,在特征区域不是连续特征时value=1,在是连续特征时value=该特征的值是pandadard

label category _ feature continuous _ feature vector _ feature===============

在wangru8080/gbdt-lr中,数据转换的代码如下:

defffmformat(df,label,path,train_len,category_feature=[],continuous_feature=[] ) :索引=df . ' w ' ) test=open(path'test.ffm )、' w ' ) feature _ index=0f eat _ index={ } foriinrange (索引) 3360feys

_index feature_index = feature_index + 1 feats.append('%s:%s:%s' % (field_index, feat_index[t], 1)) field_index = field_index + 1 for j, feat in enumerate(continuous_feature): feats.append('%s:%s:%s' % (field_index, feature_index, df[feat][i])) feature_index = feature_index + 1 field_index = field_index + 1 print('%s %s' % (df[label][i], ' '.join(feats))) if i < train_len: train.write('%s %sn' % (df[label][i], ' '.join(feats))) else: test.write('%sn' % (' '.join(feats))) train.close() test.close()

其中LightGBM 之后的叶子节点数据是离散的数据,

3 Kaggle: Pandas to libffm

网址:https://www.kaggle.com/mpearmain/pandas-to-libffm

import numpy as np # linear algebraimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)from sklearn.datasets import make_classification'''Another CTR comp and so i suspect libffm will play its part, after all it is an atomic bomb for this kind of stuff.A sci-kit learn inspired script to convert pandas dataframes into libFFM style data.The script is fairly hacky (hey thats Kaggle) and takes a little while to run a huge dataset.The key to using this class is setting up the features dtypes correctly for output (ammend transform to suit your needs)Example below'''class FFMFormatPandas: def __init__(self): self.field_index_ = None self.feature_index_ = None self.y = None def fit(self, df, y=None): self.y = y df_ffm = df[df.columns.difference([self.y])] if self.field_index_ is None: self.field_index_ = {col: i for i, col in enumerate(df_ffm)} if self.feature_index_ is not None: last_idx = max(list(self.feature_index_.values())) if self.feature_index_ is None: self.feature_index_ = dict() last_idx = 0 for col in df.columns: vals = df[col].unique() for val in vals: if pd.isnull(val): continue name = '{}_{}'.format(col, val) if name not in self.feature_index_: self.feature_index_[name] = last_idx last_idx += 1 self.feature_index_[col] = last_idx last_idx += 1 return self def fit_transform(self, df, y=None): self.fit(df, y) return self.transform(df) def transform_row_(self, row, t): ffm = [] if self.y != None: ffm.append(str(row.loc[row.index == self.y][0])) if self.y is None: ffm.append(str(0)) for col, val in row.loc[row.index != self.y].to_dict().items(): col_type = t[col] name = '{}_{}'.format(col, val) if col_type.kind == 'O': ffm.append('{}:{}:1'.format(self.field_index_[col], self.feature_index_[name])) elif col_type.kind == 'i': ffm.append('{}:{}:{}'.format(self.field_index_[col], self.feature_index_[col], val)) return ' '.join(ffm) def transform(self, df): t = df.dtypes.to_dict() return pd.Series({idx: self.transform_row_(row, t) for idx, row in df.iterrows()})########################### Lets build some data and test ############################### train, y = make_classification(n_samples=100, n_features=5, n_informative=2, n_redundant=2, n_classes=2, random_state=42)train=pd.DataFrame(train, columns=['int1','int2','int3','s1','s2'])train['int1'] = train['int1'].map(int)train['int2'] = train['int2'].map(int)train['int3'] = train['int3'].map(int)train['s1'] = round(np.log(abs(train['s1'] +1 ))).map(str)train['s2'] = round(np.log(abs(train['s2'] +1 ))).map(str)train['clicked'] = yffm_train = FFMFormatPandas()ffm_train_data = ffm_train.fit_transform(train, y='clicked')print('Base data')print(train[0:10])print('FFM data')print(ffm_train_data[0:10])

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。