import time
from sklearn.datasets import load_iris, fetch_20newsgroups, fetch_california_housing
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
from sklearn.metrics import roc_auc_score
这篇我们用facebook打卡拍照的数据集,可以去kaggle找
数据预处理:
# K近邻
"""
K-近邻预测用户签到位置
:return:None
"""
# 读取数据
data = pd.read_csv("./data/FBlocation/train.csv")
print(data.head(10))
print(data.shape)
print('*'*50)
print(data.info()) #提供数据的统计信息,包括每列的类型,非空值个数,内存占用等
# 处理数据
# 1、缩小数据,查询数据,为了减少计算时间
data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")
# 处理时间的数据,unit是秒,把秒转换成日期格式
time_value = pd.to_datetime(data['time'], unit='s') #unit是秒,把秒转换成日期格式(字符串)
print(time_value.head(10)) #最大时间是1月10号
# 把日期格式转换成 字典格式,把年,月,日,时,分,秒转换为字典格式,
time_value = pd.DatetimeIndex(time_value)
#
print('-' * 50)
print(time_value[0:10])
time_value.year
print('-' * 50)
# 构造一些特征,执行的警告是因为我们的操作是复制,loc是直接放入
print(type(data))
# data['day'] = time_value.day
# data['hour'] = time_value.hour
# data['weekday'] = time_value.weekday
#日期,是否是周末,小时对于个人行为的影响是较大的(例如吃饭时间去饭店,看电影时间去电影院等),所以才做下面的处理
data.insert(data.shape[1], 'day', time_value.day) #data.shape[1]是代表插入到最后的意思,一个月的哪一天 #插入到最后一列
data.insert(data.shape[1], 'hour', time_value.hour)#是否去一个地方打卡,早上,中午,晚上是有影响的
data.insert(data.shape[1], 'weekday', time_value.weekday) #0代表周一,6代表周日,星期几
data
#
# 把时间戳特征删除
data = data.drop(['time'], axis=1)
print('-' * 50)
data.head()
# # 把index变为0,1,2,3,4,5,6这种效果,从零开始排,原来的index是row_id
#只选择去的人大于3的数据,认为1,2,3的是噪音,这个地方去的人很少,不用推荐给其他人
tf = place_count[place_count.x > 3].reset_index()
tf #剩余的签到地点
# 进行数据的分割训练集合测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=1)
# random_state是随机数种子,保证每次的随机策略一致,x_train, x_test, y_train, y_test位置是固定的
# 特征工程(标准化),下面3行注释,一开始我们不进行标准化,看下效果,目标值要不要标准化?
std = StandardScaler()
# #
# # # 对测试集和训练集的特征值进行标准化,服务于knn fit
x_train = std.fit_transform(x_train)
# # transform返回的是copy,不在原有的输入对象中去修改
# print(id(x_test))
print(std.mean_)
print(std.var_)
x_test = std.transform(x_test) #transfrom不再进行均值和方差的计算,是在原有的基础上去标准化
print('-' * 50)
# print(id(x_test))
print(std.mean_)
print(std.var_)
knn = KNeighborsClassifier(n_neighbors=3)
# # fit, predict,score,训练,knn的fit是不训练的,只是把训练集的特征值和目标值放入到内存中
knn.fit(x_train, y_train)
# # #
# # # 得出预测结果
y_predict = knn.predict(x_test)
# #
print("预测的目标签到位置为:", y_predict[0:10])
# # #
# # # # 得出准确率,是评估指标
print("预测的准确率:", knn.score(x_test, y_test))
# print(y_predict)
# y_test