Commit d60b9499 authored by 郭羽's avatar 郭羽

美购精排模型

parent d468d022
......@@ -70,28 +70,30 @@ def getDataSet(df,shuffleSize = 10000,batchSize=128):
return dataSet
def getTrainColumns(train_columns,data_vocab):
columns = []
deep_columns = []
wide_columns = []
dataColumns = []
inputs = {}
# 离散特征
for feature in train_columns:
if data_vocab.get(feature):
if feature.count("__")>0 or feature.count("Bucket") > 0:
if feature.count("__")>0:
cat_col = tf.feature_column.categorical_column_with_vocabulary_list(key=feature,vocabulary_list=data_vocab[feature])
col = tf.feature_column.embedding_column(cat_col, 5)
columns.append(col)
deep_columns.append(col)
dataColumns.append(feature)
inputs[feature] = tf.keras.layers.Input(name=feature, shape=(), dtype='string')
elif feature in one_hot_columns:
elif feature in one_hot_columns or feature.count("Bucket") > 0:
cat_col = tf.feature_column.categorical_column_with_vocabulary_list(key=feature, vocabulary_list=data_vocab[feature])
col = tf.feature_column.indicator_column(cat_col)
columns.append(col)
# col = tf.feature_column.indicator_column(cat_col)
col = tf.feature_column.embedding_column(cat_col, 3)
wide_columns.append(col)
dataColumns.append(feature)
inputs[feature] = tf.keras.layers.Input(name=feature, shape=(), dtype='string')
else:
cat_col = tf.feature_column.categorical_column_with_vocabulary_list(key=feature,vocabulary_list=data_vocab[feature])
col = tf.feature_column.embedding_column(cat_col, 10)
columns.append(col)
deep_columns.append(col)
dataColumns.append(feature)
inputs[feature] = tf.keras.layers.Input(name=feature, shape=(), dtype='string')
# if feature.startswith("userRatedHistory") or feature.count("__") > 0 or feature in embedding_columns:
......@@ -111,21 +113,35 @@ def getTrainColumns(train_columns,data_vocab):
elif feature in ITEM_NUMBER_COLUMNS:
col = tf.feature_column.numeric_column(feature)
columns.append(col)
wide_columns.append(col)
dataColumns.append(feature)
inputs[feature] = tf.keras.layers.Input(name=feature, shape=(), dtype='float32')
return columns,dataColumns,inputs
return deep_columns,wide_columns,dataColumns,inputs
def train(columns,inputs,train_dataset):
deep = tf.keras.layers.DenseFeatures(columns)(inputs)
deep = tf.keras.layers.Dense(64, activation='relu')(deep)
deep = tf.keras.layers.Dropout(0.2)(deep)
def train(deep_columns,wide_columns,inputs,train_dataset):
wide = tf.keras.layers.DenseFeatures(deep_columns + wide_columns)(inputs)
deep = tf.keras.layers.DenseFeatures(deep_columns)(inputs)
deep = tf.keras.layers.Dense(64, activation='relu')(deep)
deep = tf.keras.layers.Dropout(0.2)(deep)
output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(deep)
concat_layer = tf.keras.layers.concatenate([wide, deep], axis=1)
# deep = tf.keras.layers.Dense(64, activation='relu')(deep)
# deep = tf.keras.layers.Dropout(0.5)(deep)
output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(concat_layer)
# output_layer = FM(1)(deep)
# deep = tf.keras.layers.DenseFeatures(columns)(inputs)
# deep = tf.keras.layers.Dense(64, activation='relu')(deep)
# deep = tf.keras.layers.Dropout(0.2)(deep)
# deep = tf.keras.layers.Dense(64, activation='relu')(deep)
# deep = tf.keras.layers.Dropout(0.2)(deep)
# output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(deep)
model = tf.keras.Model(inputs, output_layer)
# compile the model, set loss function, optimizer and evaluation metrics
......@@ -135,7 +151,7 @@ def train(columns,inputs,train_dataset):
metrics=['accuracy', tf.keras.metrics.AUC(curve='ROC'), tf.keras.metrics.AUC(curve='PR')])
# train the model
model.fit(train_dataset, epochs=5)
model.fit(train_dataset, epochs=10)
print("train save...")
model.save(model_file, include_optimizer=False, save_format='tf')
......@@ -183,7 +199,7 @@ if __name__ == '__main__':
# 获取训练列
columns = df_train.columns.tolist()
trainColumns, datasColumns,inputs = getTrainColumns(columns, data_vocab)
deep_columns,wide_columns, datasColumns,inputs = getTrainColumns(columns, data_vocab)
df_train = df_train[datasColumns + ["label"]]
df_test = df_test[datasColumns + ["label"]]
......@@ -203,7 +219,7 @@ if __name__ == '__main__':
print("train start...")
timestmp3 = int(round(time.time()))
model = train(trainColumns,inputs,train_data)
model = train(deep_columns,wide_columns,inputs,train_data)
timestmp4 = int(round(time.time()))
print("train end...耗时h:{}".format((timestmp4 - timestmp3)/60/60))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment