目录
特征值:坐标、准确度、hour、day、weekday。
目标值:地址id。
一、读取数据
文件下载地址1(推荐): train.rar(train.csv,facebook签到信息)-机器学习文档类资源-CSDN下载
文件下载地址2(不推荐):
https://pan.baidu.com/s/17DeVm48VRG0tlEzQM0KfSA
提取码:gx4a
# 1、读取数据
data = pd.read_csv('train.csv')
二、 数据处理
可以看出,上面的数据量非常大。
1、缩小数据范围
# 2-1、缩小数据范围
data = data.query('x>2.0 & x<2.5 & y>1.0 & y<1.5')
2、得到正常时分秒
可以看到时间戳是这种,需要转换成时分秒。
2-1、时间戳化时分秒
# 2-2、转换时间戳为时分秒
time_value = pd.to_datetime(data['time'], unit='s')
2-2、得到时间列表
# 获取时间列表
time_list = pd.DatetimeIndex(time_value)
2-3、添加时间信息到数据data中
# 添加时间信息到数据data中
data['hour'] = time_list.hour
data['day'] = time_list.day
data['weekday'] = time_list.weekday
3、得到数据集
3-1、获取各地点签到次数
# 3、过滤签到次数过少的地点
place_count = data.groupby('place_id').count()['row_id']
3-2、过滤签到次数过少的地点
# 3-2、过滤签到次数过少的地点
place_count = place_count[place_count>3]
可以看出,现在的签到次数都是在3次以上了,3次及以下的已经被过滤掉了。
获得签到次数过少地点的索引:
index = data['place_id'].isin(place_count.index)
过滤:
data = data[index]
3-3、筛选特征值和目标值
选取特征值和目标值
train = data[['x', 'y', 'accuracy', 'hour', 'day', 'weekday']] #特征值
target = data['place_id'] #目标值
3-4、数据集划分
# 3-4、数据集划分
train_data, test_data, train_target, test_target = train_test_split(train, target)
4、特征工程(标准化)
# 4、特征工程(标准化)
transfer = StandardScaler()
train_data = transfer.fit_transform(train_data)
test_data = transfer.transform(test_data)
# 注:不进行fit处理:测试集要用训练集的特征值和标准差(否则测试集就是在自己对自己进行测试,没有意义)
# 注:target是目标值,不能进行标准化(所以train_target和test_target不进行标准化)
5、KNN算法预估器训练
# 5、KNN算法预估器
# 5-1、得到预估器
estimator = KNeighborsClassifier() #后面会有超参数搜索,这里先不用设置k值
# 5-2、超参数搜索(模型选择与调优):得到最佳k值(最佳预估器)
# 1、参数准备
param_dict = {'n_neighbors':[3,5,7,9]}
# 2、开始搜索
estimator = GridSearchCV(estimator, param_dict, cv=3)
# 预估器 参数范围 选择次数
# 5-3、训练(用预估器对训练值进行训练)
estimator.fit(train_data, train_target)
6、模型评估
# 6、模型评估
# 6-1、得到预测结果
predict = estimator.predict(test_data)
print(predict)
# 6-2、对比预测值和测量目标值
print("直接比对预测值和测量目标值:\n", predict==test_target)
# 6-3、得到准确率(对比特征集和目标集测试值)
score = estimator.score(test_data, test_target)
print("准确率:\n", score)
总代码
# 签到地址预估
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
# 1、读取数据
data = pd.read_csv('train.csv')
# 2、数据处理
# 2-1、缩小数据范围
data = data.query('x>2.0 & x<2.5 & y>1.0 & y<1.5')
# 2-2、转换时间戳为时分秒
time_value = pd.to_datetime(data['time'], unit='s')
# 获取时间列表
time_list = pd.DatetimeIndex(time_value)
# print(time_list)
# 添加时间信息到数据data中
data['hour'] = time_list.hour
data['day'] = time_list.day
data['weekday'] = time_list.weekday
# 3、过滤签到次数过少的地点
# 3-1、获取各地点签到次数
place_count = data.groupby('place_id').count()['row_id']
# 3-2、过滤签到次数过少的地点
place_count = place_count[place_count>3]
# 获取签到次数过少地点的索引
index = data['place_id'].isin(place_count.index)
# 过滤
data = data[index]
# 3-3、筛选特征值和目标值
train = data[['x', 'y', 'accuracy', 'hour', 'day', 'weekday']] #特征值
target = data['place_id'] #目标值
# 3-4、数据集划分
train_data, test_data, train_target, test_target = train_test_split(train, target)
# 4、特征工程(标准化)
transfer = StandardScaler()
train_data = transfer.fit_transform(train_data)
test_data = transfer.transform(test_data)
# 注:不进行fit处理:测试集要用训练集的特征值和标准差(否则测试集就是在自己对自己进行测试,没有意义)
# 注:target是目标值,不能进行标准化(所以train_target和test_target不进行标准化)
# 5、KNN算法预估器
# 5-1、得到预估器
estimator = KNeighborsClassifier() #后面会有超参数搜索,这里先不用设置k值
# 5-2、超参数搜索(模型选择与调优):得到最佳k值(最佳预估器)
# 1、参数准备
param_dict = {'n_neighbors':[3,5,7,9]}
# 2、开始搜索
estimator = GridSearchCV(estimator, param_dict, cv=3)
# 预估器 参数范围 选择次数
# 5-3、训练(用预估器对训练值进行训练)
estimator.fit(train_data, train_target)
# 6、模型评估
# 6-1、得到预测结果
predict = estimator.predict(test_data)
print(predict)
# 6-2、对比预测值和测量目标值
print("直接比对预测值和测量目标值:\n", predict==test_target)
# 6-3、得到准确率(对比特征集和目标集测试值)
score = estimator.score(test_data, test_target)
print("准确率:\n", score)
print(data)