K近邻
如果一个样本在特征空间中的K个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。1968年由Cover和Hart提出的一种分类算法,也就是说,相似的样本,特征值都应该相似
核心
距离的计算,KNN使用欧式距离
数据预处理
需要做数据的标准化
案例
预测用户签到位置,数据集下载地址:https://www.kaggle.com/c/facebook-v-predicting-check-ins/data
机器学习
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import pandas as pd
#读取数据,打印前十条看看数据,也可以print(data.info())显示数据集具体信息
data = pd.read_csv("/Users/dahuzi/Desktop/下载的数据集/facebook-v-predicting-check-ins/train.csv")
print(data.head(10))
# 处理时间戳数据
time_value = pd.to_datetime(data["time"],unit = "s")
#把日期格式转换成字典格式
time_value = pd.DatetimeIndex(time_value)
data["month"] = time_value.month
data["day"] = time_value.day
data["hour"] = time_value.hour
data["minutes"] = time_value.minute
#去除不必要的列(我们把time时间戳这一列已经转换成了时间格式了)
data = data.drop(["time"],axis=1)
#我们发现数据集里面place_id这一列有的签到次数很少,后面也可以删除一部分冗余数据,统计一下次数,删除掉签到次数少于5次的。
place_count = data.groupby("place_id").count()
#按照place_id 统计后的表格place_count是以place_id为索引的,所以得reset_index把place_id在放回到表格中
temp = place_count[place_count.row_id>5].reset_index()
data = data[data["place_id"].isin(temp.place_id)]
#准备训练用集测试用的数据集
y = data["place_id"]
x = data.drop(["place_id"] , axis = 1)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25)
#将数据标准化处理,KNN算法易受异常值影响,注意测试集标准化时应该与训练集使用同一个fit
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
#开始训练数据
knn = KNeighborsClassifier(n_neighbors = 5)
knn.fit(x_train,y_train)
#打印与测试跟评分
y_predict = knn.predict(x_test)
print(y_predict)
print(knn.score(x_test,y_test))
#由于有超参数n_neighbors(这个参数是 在预测是,测试集中的数据集与训练集中的数据集的距离最近的N个用户,如果取值太小,例如取1,很容易过拟合训练数据,如果取值太大又会造成准确率降低),有超参数都可以使用交叉验证,获得最优的参数组合
param = {"n_neighbors":[3,5,7,10]}
gc = GridSearchCV(knn, param_grid = param,cv = 2)
gc.fit(x_train,y_train)print("在测试集上准确率", gc.score(x_test,y_test))
print("在交叉验证中最好的结果",gc.best_score_)
print("选择最好的模型",gc.best_estimator_)
print("每个参数每次交叉验证的结果",gc.cv_results_)