Facebook 签到地址预测

image.png

我们向Python输入了一个数据集。这个数据集有
row_id , x , y ,accuracy , time , place_id等字段。现在我们的目标是找出这些字段之间的数字规律,并通过数据进行预测。

1. 缩放数据的尺寸

  1. data_narrow = data[(data.x > 2.0) & (data.x < 2.5) & (data.y > 1.0) & (data.y < 1.5)]

对我们而言,处理的只是数据的规模不同,但是处理的方法和思路是一样的。

这里有个要点,我们可以用query进行数据处理,也可以直接在data[]的索引中,直接加入我们需要的判断条件,但是每一个判断条件里面只能有一个true 或 false

2. 把转换我们看到的时间戳的格式

image.png
我们可以从图中看到,时间戳那一列,都是数字,这对于我们而言,很难区分具体的时间节点,所以我们要用
datetime数据结构进行数据的处理。

  1. time_value = pd.to_datetime(data_narrow["time"],unit="s")

这样我们就把time从int转化为了datetime数据结构

3. 把处理好的时间数据,添加到原有的数据里

image.png

  1. data_narrow["day"] = date.day
  2. data_narrow["weekday"] = date.weekday
  3. data_narrow["hour"] = date.hour

4. 过滤掉签到次数比较少的地点

  1. data_narrow.groupby('place_id')

image.png
此时我们输出的,是一个迭代器,所以我们直接显示
data_narrow.groupby(‘place_id’)是无法显示的。

但是我们在对分组进行聚合之后,我们又能看到相应的数据。

  1. data_narrow.groupby('place_id').count()

image.png

image.png
现在我们有这样一组数据,我们想要统计place_id出现的频率,我们可以采用 分组和聚合 的方法

  1. data_narrow.groupby('place_id') # 对DataFrame进行分组
  2. place_id = data_narrow.groupby('place_id').count() #再对分组进行聚合

只是分组没有聚合,输出的是一个迭代器,里面是分好组的DataFrame

image.png
这样我们就得到了,分好组的place.count()

现在我们只需要第一列就行了

  1. place_count = place_count['row_id']

image.png

Pandas的索引条件,必须是索引值对应 True 或 False

如果是True或者False说明,我们已经经过了一次判断了。

  1. place_count_index = place_count[place_count > 3] # 这样就可以把所有频率大于3的找出来
  1. place_count = place_count[place_count_index]

image.png

这样我们就去除了一些小的不满足签到次数的地点。

现在,我们要再创建一个index去删除data_narrow里面的数据

  1. index_new = data_narrow['place_id'].isin(place_count)

这样我们就会得到一个index_new的索引判断

image.png

index_new有个特点,就是前面是index,后面对应了Boolean值。

  1. data_narrow[index_new]

image.png

经过处理好的数据,就需要进行划分训练集了

5.获取数据集的特征值和目标值

  1. data_final = data_narrow

image.png

现在我们有一组数据,并且数据之间是有关联关系的。

我们需要从数据中选出合适的内容,来进行数据集划分。

  1. x = data_final[['x','y','accuracy','day','weekday','hour']] # 这一行选择的是数据的输入
  2. y = data_final['place_id']

image.png

6.训练集划分

从原始数据中切割出特征值和目标值之后,我们需要进行训练集和测试集的划分

  1. from sklearn.model_selection import train_test_split
  2. x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)

image.png
image.png

7 特征工程——数据预处理

我们需要对划分好训练集和测试集的数据,进行运算。
因为我们用的是KNN算法,所以我们之后应该要进行的是聚类运算,所以我们要对数据进行标准化去量纲化处理。

  1. from sklearn.preprocessing import StandardScaler
  2. from sklearn.neighbors import KNeighborsClassifer
  3. from sklearn.model_selection import GridSearchCV
  4. transfer = StandardScaler()
  5. x_train = transfer.fit_transform(x_train)
  6. x_test = transfer.transform(x_test)

8 利用预处理好的数据进行模型训练

模型训练主要用的是estimator
estimator.fit
estimator.predict
estimator.score

  1. estimator = KNeighborsClassfier()
  2. para_dict = {'n_neighbors':[1,3,5,7,9,11]}
  3. estimator = GridSearchCV(estimator,param_grid=para_dict)
  4. estimator.fit(x_train,y_train)
  5. y_predict = estimator(x_test)
  6. print("y_predict:\n",y_predict)
  7. print("直接比较预测结果:\n",y_predict == y_test)
  8. score = estimator.score(x_test,y_test)
  9. print("计算的准确率为:\n",score)

这样我们的模型就训练好了。

但是有个问题,最后训练出来的模型准确率很低。image.png

这说明了一个什么问题?

结论:

image.png
最后准确率低是正常的,不低才有鬼了。

我们的place_id是用数字来表示的,这里的数字id只是一个id是一个编号,其实是不具备实际的数学意义的,把place_id拿来加入计算是不合理的行为。