如何构建最佳排名函数?

时间:2019-02-21 06:09:45

标签: algorithm machine-learning data-science

我为数据集中的每个用户提供了一组数字特征(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,这取决于它们在正确预测优先级方面的作用。

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

很高兴在需要时提供更多详细信息。

1 个答案:

答案 0 :(得分:2)

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

但是请注意,除非样本数量不够高,否则该模型将无法正常运行。五个样本显然不够,这只是一个草图,可以让您了解如何使用机器学习来解决这个问题。

我将以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