我有一个数据集,其中每一行都是用户与内容的交互。我有用户的特征来代表用户(每个用户都通过 user.id 唯一地表示):
user.id, user.nationality, user.company, user.role
和内容的特点:
content.id, content.type, content.activity..
我的目标是使用 ML 技术来预测内容(由 user.id 给出)。我的主要问题是,对于一个新的预测,我有用户的特征,但我没有新内容的特征。
我有一个数据集,其中每一行都是用户与内容的交互。我有用户的特征来代表用户(每个用户都通过 user.id 唯一地表示):
user.id, user.nationality, user.company, user.role
和内容的特点:
content.id, content.type, content.activity..
我的目标是使用 ML 技术来预测内容(由 user.id 给出)。我的主要问题是,对于一个新的预测,我有用户的特征,但我没有新内容的特征。
你有一个分类问题。给定 auser和他们的features,选择最content适合他的。
有许多分类器用于此任务。我会说您的主要问题是您的大多数功能都是分类的而不是数字的。
以 Sklearn 为例,您可以使用LabelEncoder将分类转换为数值。
以下是如何执行此操作的示例。您生成X,这是您的特征矩阵。每行是 a user,列是features。
users这是我创建的一些假人。您的数据结构可能会有所不同,因此您可以尝试使其像这样,或者做更多的工作。
users = [
{
'id': 1,
'nationality': 'american',
'company': 'xyz',
'role': 'ceo',
'content.id': 1001
},
{
'id': 2,
'nationality': 'american',
'company': 'abc',
'role': 'cto',
'content.id': 1002
},
{
'id': 3,
'nationality': 'canadian',
'company': 'fgh',
'role': 'cto',
'content.id': 1001
}
]
现在,您可以对类别进行编码。这意味着对于数据中的每个单词,您都为其分配了一个数字。LabelEncoder可以为您做到这一点。有了这个,您生成X,这是您的特征矩阵,其中每一行代表一个user。
from sklearn.preprocessing import LabelEncoder
nationality_encoder = LabelEncoder().fit([user['nationality'] for user in users])
company_encoder = LabelEncoder().fit([user['company'] for user in users])
role_encoder = LabelEncoder().fit([user['role'] for user in users])
X = []
for user in users:
X.append([
nationality_encoder.transform([user['nationality']])[0],
company_encoder.transform([user['company']])[0],
role_encoder.transform([user['role']])[0]
])
print(X)
>> [[0, 2, 0],
>> [0, 0, 1],
>> [1, 1, 1]]
然后你可以生成y,这是你的标签。每个content.id用户的。在这里,我假设你有user-content对,就像你说的那样。这个向量的长度与 相同X。的每一行都X与 中的有序值相关联y。所以userinX[2]有content.idin y[2]。
y = [user['content.id'] for user in users]
print(y)
>> [1001, 1002, 1001]
现在你有了你的Xand y,你的特征和标签。
并非所有分类器都能很好地处理分类数据,但我建议您从DecisionTreeClassifier.
这是一个例子:
from sklearn.tree import DecisionTreeClassifier
decision_tree = DecisionTreeClassifier()
decision_tree.fit(X, y)
既然你有一个训练有素的树,你可以预测没有它的content.id树users。
假设您有这个新用户:
new_user = {
'id': 999,
'nationality': 'american',
'company': 'fgh',
'role': 'ceo'
}
您可以应用相同的转换来X为他获取。但是,现在您不知道y,这就是您想要找出的。
new_user_X = [[
nationality_encoder.transform([new_user['nationality']])[0],
company_encoder.transform([new_user['company']])[0],
role_encoder.transform([new_user['role']])[0]
]]
使用decision_tree您创建的进行预测。在这个虚拟示例中,new_user应该有content.id == 1.
new_user_content = decision_tree.predict(new_user_X)
print(new_user_content)
>> [1]