【问题标题】:How to construct an optimal ranking function?如何构造一个最优的排序函数?
【发布时间】:2019-07-14 23:17:24
【问题描述】:

我的数据集中的每个用户都有一组数字特征(f1, f2, f3, f4, f5),如下所示。

       f1   f2  f3  f4  f5
user1  0.1  1.1  0 1.7  1
user2  1.1  0.3  1 1.3  3
user3  0.8  0.3  0 1.1  2
user4  1.5  1.2  1 0.8  3
user5  1.6  1.3  3 0.3  0

我的目标输出是一个优先的用户列表。即如下例所示。

       f1   f2  f3  f4  f5  target_priority
user1  0.1  1.1  0 1.7  1       2
user2  1.1  0.3  1 1.3  3       1
user3  0.8  0.3  0 1.1  2       5
user4  1.5  1.2  1 0.8  3       3
user5  1.6  1.3  3 0.3  0       4

我想以反映用户优先级的方式使用这些功能。

目前,我正在对每个用户的所有特征进行乘法运算以获得分数并根据分数对用户进行排名(示例如下所示)。

       f1   f2  f3  f4  f5  multipled_score predicted_priority
user1  0.1  1.1  0 1.7  1        0              5
user2  1.1  0.3  1 1.3  3        1.287          2
user3  0.8  0.3  1 1.1  2        0.528          4
user4  1.5  1.2  1 0.8  3        4.32           1
user5  1.6  1.3  1 0.3  1        0.624          3

但是,仅仅基于multiplied score 将特征和排名相乘并不能很好地发挥作用。我认为这些功能应该是upweightdownweight,这取决于它们在正确预测优先级方面的贡献。

因此,我想知道是否有办法(在机器学习/数据科学/统计学中)使用我的特征得分来获得最佳排名函数,从而获得接近真实排名的排名列表。

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

    标签: algorithm machine-learning data-science


    【解决方案1】:

    解决此问题的一种方法是使用机器学习算法,该算法尝试学习基础函数,以便根据新用户的特征预测其最有可能的得分。

    但是请注意,除非样本量不够高,否则模型的性能不会很好。五个样本显然不够,这只是一个草图,让您了解如何使用机器学习来解决这个问题。

    我将以RandomForestRegressor 为例:

    from sklearn.preprocessing import MinMaxScaler
    from sklearn.ensemble import RandomForestRegressor
    

    让我们从定义将馈送到模型的特征和目标开始。

    X_ = df.drop(['target_priority'], axis=1).values
    scaler = MinMaxScaler()
    X = scaler.fit_transform(X_)
    y = df.target_priority
    

    现在让我们拟合模型:

    rf = RandomForestRegressor()
    rf.fit(X,y)
    

    这里我没有将数据拆分为训练集和测试集,但您应该这样做以便了解您的模型的性能如何。鉴于每个现有目标都有一个样本,我已经用所有样本训练了模型,并将通过向训练数据添加一些噪声来创建测试集:

    noise = np.random.normal(loc=0, scale=0.2, size=X.shape)
    X_test = X + noise
    

    现在您可以使用经过训练的模型获得对测试集的预测:

    y_pred = rf.predict(X_test).round()
    # array([2., 2., 4., 3., 4.])
    

    您可以看到,即使使用少量的样本来训练模型,该模型也能够以仅0.4 的平均误差进行预测:

    np.abs(y - y_pred).mean()
    # 0.4
    

    【讨论】:

    • 非常感谢您的出色回答。我有以下两个问题,我认为很高兴向您提问。 1) 目前我的特征在不同的范围内(例如,f1 -> [0,3]、f2 -> [0,5] 等)。在我适合随机森林之前,您是否建议将它们全部转换为单位范围 [0,1]? 2)是否有可能获得每个特征在预测结果中的重要性/贡献?再次感谢您:)
    • 好吧,特别是对于随机森林,没有必要进行标准化,但我这样做是因为对于 SVM 等其他一些算法,这是必要的。是的,您可以了解每个功能对您可以使用feature_importance 的预测的贡献程度。不客气:-)
    • @emi 如果它为您解决了问题,请不要忘记支持/接受,请参阅What should I do when someone answers my question?,谢谢!
    • 非常感谢 :) 我赞成并接受了答案,因为它解决了我的问题 :) 顺便说一句,我今天得到了我的真实数据集,这不是我的预期。它有一些用户使用no priority label。那是因为这样的用户对我们公司来说并不重要(更像是普通用户)。在这种情况下,给他们special symbola priority level that is much much lower (e.g., 100000000000000000 priority) 好不好?您对此类用户的标签有什么建议吗?非常感谢:)
    • 啊是的对不起@emi,一会儿给你答复
    猜你喜欢
    • 2010-10-08
    • 2010-09-22
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多