注: 这部分看博客注释与运行截图就差不多能理解啦,把代码复制到自己的编译器中分别运行,认真体会每一步。
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 # 读取数据 data = pd.read_csv('./data/FBlocation/train.csv') # 1.获取数据 read_csv # 2.数据基本处理 数据集划分,把时间戳提出成明显的时间特征(周几,几号,几点), 剔除签到人数少的place_id # 3.特征工程 标准化 # 4.机器学习 # 4.1 创建模型 # 4.2 训练模型 # 5.模型评估 分类 准确率 # 2.数据基本处理 # 取一小部分数据演示 data = data.query('x>2 & x<2.5 & y>2 & y<2.5') data.head() # 把时间戳提出成为明显的时间特征(周几,几号,几点)特征提取 用户地址--》经纬度 time = pd.to_datetime(data['time'], unit='s') time = pd.DatetimeIndex(time) time data['weekday'] = time.weekday data['day'] = time.day data['hour'] = time.hour data.head() # 最终目的:剔除签到人数少的place_id # 第一步:统计place_id出现的次数 并且切出['row_id']这一列 temp = data.groupby('place_id')['row_id'].count() # 第二步:找出temp>3的次数的index res = temp[temp>3].index #temp的index就是place_id账号 res # 第三步:找 data数据中 “place_id” 这一列中与 res 匹配的数据。 从而得出place_id大于3的数据 data[data['place_id'].isin(res)] # 数据集划分 x = data[['x','y','accuracy','weekday','day','hour']] y = data['place_id'] x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # 3.特征工程 标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4.机器学习 # 4.1 创建模型 estimator = KNeighborsClassifier(algorithm='kd_tree') # 构建字典参数 param_dict = {'n_neighbors':[1,3,5]} # 初始化GSCV估计器 estimator_gscv = GridSearchCV(estimator, param_dict, cv = 3) # 4.2训练模型 estimator_gscv.fit(x_train, y_train) # 5.模型评估 estimator_gscv.score(x_test, y_test) # 获取最优模型 estimator_gscv.best_estimator_ # 获取最优超参数 estimator_gscv.best_params_