在前面对数据用Mean-Shift方法对样本数据的轨迹进行了聚类后,这一步将用KNN方法按K=1对数据进行训练和预测,样本数据接近10w条,我们按9:1选取训练数据和测试数据,其中,对于所有数据进行标签的过程在excel中已经完成。
from sklearn.cluster import MeanShift, estimate_bandwidth
from sklearn.externals import joblib
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import matplotlib.pyplot as plt
import os
import pandas as pd
import datetime
import xlrd
import csv
import random
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
os.chdir(r'E:\CDA培训\CDA项目数据\葡萄牙波尔图市出租车分析')
df=pd.read_csv('6_KNN_sample_0.001.csv') #查看我们在excel里处理完后的数据形式
df.head()
df.info()
#GPS用10个点来预测
X_train_10=np.array([np.array(eval(i)).flatten() for i in df.loc[:90000,'GPS_10']])
Y_train_10=np.array([i for i in df.loc[:90000,'label']])
print(X_train_10.shape)
print(Y_train_10.shape)
X_test_10=np.array([np.array(eval(i)).flatten() for i in df.loc[90000:,'GPS_10']])
Y_test_10=np.array([i for i in df.loc[90000:,'label']])
print(X_test_10.shape)
print(Y_test_10.shape)
#调用KNN算法对训练数据进行训练
knn_10= KNeighborsClassifier(n_neighbors = 1)
knn_10.fit(X_train_10, Y_train_10)
#用测试样本进行预测
predict_10=knn_10.predict(X_test_10)
print(predict_10)
score_10=knn_10.score(X_test_10, Y_test_10)
print(score_10) #打印出预测结果
注意:这里的预测精度不高,很大程度是由于在对终点进行聚类时选取的Mean-Shift带宽过小造成的(Bandwidth=0.001),当我们把Bandwidth调整为0.005时,预测的精度上升到89%左右。下图是我们使用不同的带宽和不同GPS点预测后的结果,另外,具体成果展示将在下一步ppt展示中阐述