本文共 2103 字,大约阅读时间需要 7 分钟。
目录
属于分类算法,特征是:目标值是离散的。
电影类型是目标值,推断某个电影的电影类型是什么?可以根据此电影与哪个电影类型距离最近,则是什么类型的电影。
from sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.preprocessing import StandardScalerimport pandas as pdimport numpy as npdef knncls(): """ K-近邻预测用户签到位置 :return: None """ # TODO 读取数据 data = pd.read_csv("train.csv") # print(data.head(10)) # TODO 处理数据 # 1、缩小数据量,为了迅速查询数据 data = data.query("x>1.0 & x<1.25 & y>2.5 & y<2.75") # print(data.head(10)) # 把日期格式转换成字典格式 time_value = pd.to_datetime(data['time'], unit='s') # print(time_value) # print(type(time_value)) # Series time_value = pd.DatetimeIndex(time_value) # print(time_value) # print(type(time_value)) # DatetimeIndex # 2、构造一些时间特征 data['day'] = time_value.day # 这种形式的增加列,是把time_value的day复制一份,而loc方法是直接拿来用。 data['hour'] = time_value.hour data['weekday'] = time_value.weekday # 3、把时间戳特征删除 data = data.drop(['time'], axis=1) # Pandas中axis=1表示列 # print(data) # 4、将签到位置少于n个用户的删除 place_count = data.groupby('place_id').count() # 分组之后,索引为分组字段,并且列没有分组字段 tf = place_count[place_count.row_id > 3].reset_index() # 重设索引,并且列增加索引字段 data = data[data['place_id'].isin(tf.place_id)] # 把row_id列删除,此列无意义 data = data.drop(['row_id'], axis=1) print(data) # 5、取出数据当中的特征值和目标值 y = data['place_id'] x = data.drop(['place_id'], axis=1) # 6、进行数据的分割,训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25) # 训练目标值,测试目标值,训练特征值,测试特征值 # TODO 特征工程(标准化) std = StandardScaler() # 对测试集和训练集的特征值进行标准化 x_train = std.fit_transform(x_train) x_test = std.transform(x_test) # TODO 进行算法流程 knn = KNeighborsClassifier(n_neighbors=5) # fit predict,score knn.fit(x_train, y_train) # TODO 得出预测结果 y_predict = knn.predict(x_test) print("y预测的目标签到位置为:", y_predict) # TODO 得出准确率 print("预测的准确率:", knn.score(x_test, y_test)) return Noneif __name__ == '__main__': knncls()
k值取很小,容易受异常点影响
k值取很大,容易受目标值的数量(类别)波动
性能:很慢
转载地址:http://ydrgn.baihongyu.com/