我试图预测一篇文章是否被卖掉。
我有一个DNNLinearCombined分类器,有描述、类别、尺寸、价格等。而标签0代表未售出,1代表已售出。
sold description category_id size_id gender price host_id lat long year month
0 1 [dünne, jacke, gepunktet, , , , , , ] 9 25 f 3.5 1 48.21534 11.29949 2019 3
1 1 [kleid, pudel, dunkelblau, gepunktet, , , , , ] 9 25 f 4.0 1 48.21534 11.29949 2019 3
2 0 [kleid, rosa, hum, hund, katze, , , , ] 9 24 f 4.0 1 48.21534 11.29949 2019 3
3 1 [kleid, hum, blau, elsa, und, anna, , , ] 9 24 f 4.0 1 48.21534 11.29949 2019 3
4 0 [kleid, blue, seven, lachsfarben, , , , , ] 9 23 f 4.5 1 48.21534 11.29949 2019 3
text_column = tf.feature_column.categorical_column_with_vocabulary_list(key='description', vocabulary_list=list(word_index))
text_embedding = tf.feature_column.embedding_column(text_column, dimension=50, combiner='sqrtn')
CATEGORICAL_COLUMNS = ['category_id', 'size_id', 'host_id']
NUMERIC_COLUMNS = ['price','lat', 'long', 'year', 'month']
feature_columns = []
for feature_name in CATEGORICAL_COLUMNS:
vocabulary = dftrain[feature_name].unique()
feature_columns.append(feature_column.categorical_column_with_vocabulary_list(feature_name, vocabulary))
for feature_name in NUMERIC_COLUMNS:
feature_columns.append(feature_column.numeric_column(feature_name, dtype=tf.float32))
est = tf.estimator.DNNLinearCombinedClassifier(linear_feature_columns=feature_columns, dnn_hidden_units=[100],dnn_feature_columns=[text_embedding],
n_classes=2,
dnn_optimizer=tf.keras.optimizers.Adagrad(lr=0.003))
问题是,价格作为数值列对预测的影响非常小,因为有的文章价格相同,有的文章卖出,有的文章没有卖出。但一般情况下,价格应该与同类别、同尺寸、同描述的已售商品在同一区域。例如,如果一篇文章的价格是2欧元,预测率是39.6%,但如果我把同一篇文章的价格设置为100欧元,预测率是39.4%。但这是不正确的,它必须低于1%。训练数据中没有其他文章有这么高的价格。
如果没有几乎相同价格的训练数据,我如何定义价格列,使完整的预测几乎为零?
请教
这里的一些想法。
你应该把 "年 "和 "月 "看作是分类特征,而不是数字特征。它们是分类序数特征,而不是标量。
你为什么不尝试使用DNNLinearCombined Regressor呢?它将预测一个0和1之间的值,你应该找到正确的极限来决定预测值是0还是1。
如果月号有意义,你可以尝试使用DNNLinearCombined Regressor。时间序列而不是回归。我建议你把 "年 "和 "月 "这两个特征合并成一个日期或整数类型的特征(为每个日期设置一个唯一的整数值)。
如果你还想使用Classifier,请注意之前对你的训练数据进行ballance。