我的数据集中每个用户都有一组数值特征 (f1, f2, f3, f4, f5)
,如下所示。
f1 f2 f3 f4 f5user1 0.1 1.1 0 1.7 1user2 1.1 0.3 1 1.3 3user3 0.8 0.3 0 1.1 2user4 1.5 1.2 1 0.8 3user5 1.6 1.3 3 0.3 0
我的目标输出是一个优先级排序的用户列表。例如如下所示。
f1 f2 f3 f4 f5 target_priorityuser1 0.1 1.1 0 1.7 1 2user2 1.1 0.3 1 1.3 3 1user3 0.8 0.3 0 1.1 2 5user4 1.5 1.2 1 0.8 3 3user5 1.6 1.3 3 0.3 0 4
我想利用这些特征来反映用户的优先级。
目前,我是通过将每个用户的所有特征相乘来获得一个分数,并基于这个分数对用户进行排名(如下例所示)。
f1 f2 f3 f4 f5 multipled_score predicted_priorityuser1 0.1 1.1 0 1.7 1 0 5user2 1.1 0.3 1 1.3 3 1.287 2user3 0.8 0.3 1 1.1 2 0.528 4user4 1.5 1.2 1 0.8 3 4.32 1user5 1.6 1.3 1 0.3 1 0.624 3
然而,仅仅是将特征相乘并基于multiplied score
进行排名效果并不好。我认为应该根据特征在正确预测优先级时的贡献来upweight
或downweight
这些特征。
因此,我想知道是否有办法(在机器学习/数据科学/统计学中)使用我的特征分数来获得一个接近真实排名的最优排名函数。
如果需要,我很乐意提供更多细节。
回答:
解决这个问题的一种方法是使用机器学习算法,该算法试图学习underlying function
,以便基于其特征预测新用户最可能的分数。
然而,请注意,除非样本量足够大,否则模型不会表现得很好。显然,五个样本是不够的,这只是一个草图,让你了解如何使用机器学习来解决这个问题。
我将使用RandomForestRegressor
作为示例:
from sklearn.preprocessing import MinMaxScalerfrom sklearn.ensemble import RandomForestRegressor
首先定义将要输入模型的特征和目标。
X_ = df.drop(['target_priority'], axis=1).valuesscaler = 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