用于用户建模的机器学习

数据挖掘 机器学习 预测建模
2022-02-15 05:30:19

我有一个数据集,其中每一行都是用户与内容的交互。我有用户的特征来代表用户(每个用户都通过 user.id 唯一地表示):

user.id, user.nationality, user.company, user.role

和内容的特点:

content.id, content.type, content.activity..

我的目标是使用 ML 技术来预测内容(由 user.id 给出)。我的主要问题是,对于一个新的预测,我有用户的特征,但我没有新内容的特征。

1个回答

你有一个分类问题给定 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.idusers

假设您有这个新用户:

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]