基于发生频率进行预测的模型

数据挖掘 scikit-学习 机器学习模型
2022-02-17 23:00:13

我有以下数据集

+------------------------------------------------+
| 乘客 | 旅行 |
+------------------------------------------------+
| 约翰 | 伦敦 |
| 杰克 | 巴黎 |
| 乔 | 悉尼 |
| 约翰 | 伦敦 |
| 约翰 | 伦敦 |
| 吉尔 | 纽约 |
| 吉姆 | 悉尼 |
| 杰克 | 巴黎 |
| 詹姆斯 | 悉尼 |
+------------------------------------------------+

我正在尝试使用 scikit 库根据频率(在本例中为 John => London)预测乘客下一次可能旅行的可能性。作为一个新手,我不确定要使用哪个模型/功能。

更新 2:

如果我有超过 1000 万条记录,我应该如何解决这个问题?

2个回答

对于这样的事情,您可以采用更简单的方法。一个想法是使用每个城市被访问的次数作为概率,在给定乘客访问过的城市中随机抽样。

这是您可以这样做的一种方法。我在数据框中添加了更多示例,以便更清楚地看到应用程序。假设你有:

     Passenger    Trip
0       John     London
1       Jack     Girona
2       Jack      Paris
3        Joe     Sydney
4        Joe  Amsterdam
5        Joe  Barcelona
6        Joe  Barcelona
7       John     London
8       John      Paris
9       Jill    Newyork
10       Jim     Sydney
11      Jack      Paris
12     James     Sydney

您可以定义如下函数,以便从数据框中的现有数据中随机抽样:

def random_sample(df, name):
    import numpy as np
    # group the dataframe by Passenger and count 
    # the different trips 
    g = df.groupby('Passenger').Trip.value_counts()
    # Make the probabilities add up to 1
    freq = g[name] / g[name].sum()
    # random destination based on 
    # its probabilities
    random_name = np.random.choice(a=freq.index, size=1, 
                     p = freq.values)[0]
    # return likelyhood of next randomly chosen
    # destination and destination
    return freq[random_name], random_name

用法

假设我们要选择一个随机样本的目的地,Joe并且还要知道哪个是可能性。考虑到去过的目的地Joe是:

Trip
Barcelona    2
Amsterdam    1
Sydney       1

例如,我们可以得到:

for _ in range(5):
    freq, dest = random_sample(df, 'Joe')
    print('Chosen destination {} with a probability of {}'.format(dest, freq))

Chosen destination Sydney with a probability of 0.25
Chosen destination Barcelona with a probability of 0.5
Chosen destination Barcelona with a probability of 0.5
Chosen destination Barcelona with a probability of 0.5
Chosen destination Sydney with a probability of 0.25

以下代码适用于更大的数据集!


series_px = df_px_dest.groupby('Passenger')['Trip'].apply(lambda x: x.value_counts().head(1))

df_px = series_px.to_frame()

df_px.index = df_px.index.set_names(['UID', 'DEST'])

df_px.reset_index(就地=真)

def getNextPossibleDestByUserID(name,df=df_px):
    return df.query('UID==@name')['DEST'].to_string(index=False)

我的下一个目标是将其公开为 API(可能使用 Flask),可能会为此提出一个新问题!