首页 > 编程知识 正文

ffmi指数多少,tree算法

时间:2023-05-04 11:10:02 阅读:45291 作者:3354

目录

1:FFM背景

1.1为什么要提交调频

1.2:FFM原理

1.3:调频公式

1.4:损耗函数:

2:代码实现调频

1:FFM背景1.1为什么FFM在FM模型中提出每个原始特征通过onehot后的特征对应一个隐藏变量? 但是,在FFM模型中,认为应该将特征分为多个field,各特征与各field相对应,各自具有一个隐藏变量,其中field实际上是原始特征的个数。 举个例子,我们的样本有三种字段publisher、advertiser、gender,它们可以分别表示媒体、广告主或者具体的商品、性别。 其中,publisher有5种数据,advertiser有10种数据,gender有男女2种,one-hot编码后,每个样本有17个特征,其中只有3个特征不是空的。 使用FM模型时,17个特征,每个特征对应一个隐藏变量。 使用FFM模型时,17个特征,每个特征对应3个隐藏变量。 也就是说,每种类型对应一个隐藏变量。 具体而言,三个字段(publisher、advertiser和gender )分别对应一个隐藏变量。

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

与example:FM相比,二次特征组合的数量没有变化,但相交时使用的隐藏向量发生了变化。

原始数据:

特征编号:

特征组合:

1.3:FFM公式实现过程基本呈随机梯度下降,然后各样品根

1.4:损耗函数:本质上是交叉熵损耗函数,但label分别为正负一致,具体推导过程为链接: https://blog.csdn.net/xxiaobaib/article/details/976660

2:代码实现FFM和FM的区别在于,这里的二次系数v不再是二维矩阵,而是三维矩阵,并且维是[n,f,k]。 在训练过程中,我们可以按照随机梯度下降更新参数,从三维矩阵中提取向量组成二维矩阵来更新参数。

importtensorflowastfimportpandasaspdimportnumpyasnpimportosinput _ x _ size=20 field _ size=2vector _ dimension=3tot at 参数batch _ size=1all _ data _ size=1000 lr=0.01 model _ save _ path=' TF model ' model _ name=' FFM ' defcreateatete e 3360: param field _ size 33603360 param vector _ dimensior ) size360

ights = tf.truncated_normal([input_x_size, field_size, vector_dimension]) tf_weights = tf.Variable(weights) return tf_weightsdef createOneDimensionWeight(input_x_size): """ 创建一阶特征系数 :param input_x_size: :return: """ weights = tf.truncated_normal([input_x_size]) tf_weights = tf.Variable(weights) return tf_weightsdef createZeroDimensionWeight(): """ 创建bias,即w0 :return: """ weights = tf.truncated_normal([1]) tf_weights = tf.Variable(weights) return tf_weightsdef inference(input_x, input_x_field, zeroWeights, oneDimWeights, thirdWeight): """计算回归模型输出的值""" secondValue = tf.reduce_sum(tf.multiply(oneDimWeights, input_x, name='secondValue')) firstTwoValue = tf.add(zeroWeights, secondValue, name="firstTwoValue") thirdValue = tf.Variable(0.0, dtype=tf.float32) input_shape = input_x_size for i in range(input_shape): featureIndex1 = i fieldIndex1 = int(input_x_field[i]) for j in range(i + 1, input_shape): featureIndex2 = j fieldIndex2 = int(input_x_field[j]) vectorLeft = tf.convert_to_tensor([[featureIndex1, fieldIndex2, i] for i in range(vector_dimension)]) weightLeft = tf.gather_nd(thirdWeight, vectorLeft) weightLeftAfterCut = tf.squeeze(weightLeft) vectorRight = tf.convert_to_tensor([[featureIndex2, fieldIndex1, i] for i in range(vector_dimension)]) weightRight = tf.gather_nd(thirdWeight, vectorRight) weightRightAfterCut = tf.squeeze(weightRight) tempValue = tf.reduce_sum(tf.multiply(weightLeftAfterCut, weightRightAfterCut)) indices2 = [i] indices3 = [j] xi = tf.squeeze(tf.gather_nd(input_x, indices2)) xj = tf.squeeze(tf.gather_nd(input_x, indices3)) product = tf.reduce_sum(tf.multiply(xi, xj)) secondItemVal = tf.multiply(tempValue, product) tf.assign(thirdValue, tf.add(thirdValue, secondItemVal)) return tf.add(firstTwoValue, thirdValue)def gen_data(): """ 生成数据 :return: """ labels = [-1, 1] y = [np.random.choice(labels, 1)[0] for _ in range(all_data_size)] x_field = [i // 10 for i in range(input_x_size)] x = np.random.randint(0, 2, size=(all_data_size, input_x_size)) return x, y, x_fieldif __name__ == '__main__': global_step = tf.Variable(0, trainable=False) trainx, trainy, trainx_field = gen_data() # input_x = tf.placeholder(tf.float32, [input_x_size]) input_y = tf.placeholder(tf.float32) # lambda_w = tf.constant(0.001, name='lambda_w') lambda_v = tf.constant(0.001, name='lambda_v') zeroWeights = createZeroDimensionWeight() oneDimWeights = createOneDimensionWeight(input_x_size) thirdWeight = createTwoDimensionWeight(input_x_size, # 创建二次项的权重变量 field_size, vector_dimension) # n * f * k y_ = inference(input_x, trainx_field, zeroWeights, oneDimWeights, thirdWeight) l2_norm = tf.reduce_sum( tf.add( tf.multiply(lambda_w, tf.pow(oneDimWeights, 2)), tf.reduce_sum(tf.multiply(lambda_v, tf.pow(thirdWeight, 2)), axis=[1, 2]) ) ) loss = tf.log(1 + tf.exp(input_y * y_)) + l2_norm train_step = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss) saver = tf.train.Saver() with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(total_plan_train_steps): for t in range(all_data_size): input_x_batch = trainx[t] input_y_batch = trainy[t] predict_loss, _, steps = sess.run([loss, train_step, global_step], feed_dict={input_x: input_x_batch, input_y: input_y_batch}) print("After {step} training step(s) , loss on training batch is {predict_loss} " .format(step=steps, predict_loss=predict_loss)) saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=steps) writer = tf.summary.FileWriter(os.path.join(MODEL_SAVE_PATH, MODEL_NAME), tf.get_default_graph()) writer.close() #

 

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