思想:
计算,预测样本,和其他样本之间的欧式距离,然后欧式距离最短的这些样本的目标值,认为是预测样本的目标值。
欧式距离:对应特征值相减,求平方和再开方
在应用算法 之前 要做标准化
。不然值分布在0-1w 范围的特征 对欧式距离的影响太大, 值分布在0-10的特征对距离的影响忽略不计了
api:
from sklearn.neighbors import KNeighborsClassifier
案例:
数据:/c/facebook-v-predicting-check-ins
特征值
row_id , x , y , accuracy, time,
样本序号,x坐标,y坐标,定位准确度,格林威治时间
目标值:
place_id
入住酒店的id
大概流程:
读取csv,
条件筛选: xy 大于0 小于5
定位准确率低于70的 pass
Time转时间戳
时间戳 分离出 年 月日 时分秒
删除时间戳 ,
删除样本序号。
签到次数低于 50次的酒店pass
训练模型
涉及到几个api
格林威治时间是从1970年1月1日开始累计的秒数的总和.
t = 1551966534pd.to_datetime(t, unit='s') 输出:Timestamp('-03-07 13:48:54') # 转为时间戳
时间戳字典的使用,可以把时间戳列表 提取出 年,月,日的部分
import pandas as pddef a():t = ['/3/3','/4/3','/5/3']a = []for i in t:c = pd.to_datetime(i)a.append(c)print(a)time = pd.DatetimeIndex(a)print(time.year)print(time.month)print(time.day)a()
[Timestamp('-03-03 00:00:00'), Timestamp('-04-03 00:00:00'), Timestamp('-05-03 00:00:00')]Int64Index([, , ], dtype='int64')Int64Index([3, 4, 5], dtype='int64')Int64Index([3, 3, 3], dtype='int64')
分组
temp = data.groupby(‘分组依据place_id’).count()
返回值
按照酒店id分组之后,行索引就是 酒店号, 每列的值 就是组内执行count操作的结果
temp.reset_index()
这个函数 执行 把 行索引的值 ,设置为一列特征。
代码部分
import pandas as pdfrom sklearn.neighbors import KNeighborsClassifierdef knn():# 读取数据data = pd.read_csv('../facebook-v-predicting-check-ins/train.csv')# 筛选数据data = data.query('x>0&y>0&x<3&y<3') # 数据集合太大,本地跑用少量data = data[data['accuracy']>50]# 时间戳处理data['time'] = pd.to_datetime(data['time'],unit='s')# 分离时间戳time = pd.DatetimeIndex(data['time'])data['year']=time.yeardata['month'] =time.monthdata['day'] =time.day# 删除data = data.drop(['row_id','time'],axis=1)# 签到次数低于50次的酒店passt = data.groupby('place_id').count()t = t[t.x > 55]t = t.reset_index()data = data[data['place_id'].isin(t['place_id'])]# 划分训练测试集合y = data['place_id']x = data.drop(['place_id'],axis=1)print(x)print(y)x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.8)# 开始训练knnc = KNeighborsClassifier(n_neighbors=5) # 设置5个相邻样本knnc.fit(x_train,y_train)predict =knnc.predict(x_test)score = knnc.score(x_test,y_test)print(score)knn()
结果, 太慢了 该算法 只适合 小规模数据,
x y accuracy year month day12 0.8829 1.3445 64 19701 718 2.7256 1.0135 54 19701 139 1.2191 1.3462 743 19701 654 1.9264 0.2691 64 19701 382 2.9265 2.3590 55 19701 5···[1576366 rows x 6 columns]127652380351188936085695396171384989···
案例2 :
sklearn ,自带数据集合 iris 预测 鸢尾花的品种
from sklearn.datasets import load_irisfrom sklearn.neighbors import KNeighborsClassifierdef knn2():iris = load_iris()x = iris.datay = iris.targetprint(iris.feature_names)print(x)print(iris.target_names)print(y)x_train, x_test, y_train, y_test = train_test_split(x,y,train_size=0.832)knnc = KNeighborsClassifier(n_neighbors=5)knnc.fit(x_train,y_train)predict = knnc.predict(x_test)score = knnc.score(x_test,y_test)print(predict)print(score)knn2()
[0 1 0 2 1 2 1 2 2 1 2 0 0 0 2 1 2 2 1 1 2 1 0 2 0 2]1.0