31、机器学习k近邻

在特征空间中与样本最相似(距离最近)的k个样本中大多数样本归属的类别为该样本归属的类别。
常用的距离为欧式距离。
需要做标准化处理。
k值取很小:容易受异常点影响
k值取很大:容易受最近数据太多导致比例变化
性能问题
优点:易于理解、实现,无须参数估计和训练模型
缺点:测试集预测时计算的计算量大、k值一定要确定取值不当会影响模型效果
适用几千到几万的小样本数据
加快搜索速度——基于算法的改进KDTree,API接口里面有实现
交叉验证:将训练集进一步划分为训练集、验证集。例如将数据分为5份,其中一份为验证集,剩下的为测试集。经过5组测试之后,得到5组模型结果,取平均值作为结果。又称5折交叉验证。
超参数:模型的参数,需要手动设定
网格搜索:预设几组参数,通过交叉验证进行评估,最终选择最优参数建立模型。

from sklearn.neighbors import KNeighborsClassifier
import pandas as pd

###读取数据
data=pd.read_csv(r'C:\Users\ms\Desktop\ddup\机器学习算法基础\dataset\FACEBOOK\facebook-v-predicting-check-ins\train1.csv')
###缩小数据范围
data=data.query('x > 1.0 &  x < 1.25 & y > 2.5 & y < 2.75')
#data.to_csv(r'C:\Users\ms\Desktop\ddup\机器学习算法基础\dataset\FACEBOOK\facebook-v-predicting-check-ins\train1.csv')

#print(data.head())
###时间戳转时间类型
time=pd.to_datetime(data['time'],unit='s')
###时间类型区分出年月日
time=pd.DatetimeIndex(time)
data['hour']=time.hour
data['day']=time.day
data['weekday']=time.weekday
###删除时间字段
data.drop(['time'], axis=1)
###groupby place_id 计数
place_count=data.groupby('place_id').count()
#print(place_count.head())
###计数大于3的place_id
tf=place_count[place_count.row_id>3].reset_index()
#print(tf.head())
###筛选place_id
data=data[data['place_id'].isin(tf['place_id'])]

##获取目标值和特征值
y=data['place_id']
x=data.drop('place_id',axis=1)
###划分训练集测试集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
##特征工程
#对数据进行标准化
from sklearn.preprocessing import StandardScaler
std=StandardScaler()
###拟合训练集并进行转化
x_train=std.fit_transform(x_train)
###测试集不需要拟合直接转化
x_test=std.transform(x_test)
##拟合模型
knn=KNeighborsClassifier(n_neighbors=5,algorithm='auto')
##algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}
model=knn.fit(x_train,y_train)
##获取预测结果
print(model.predict(x_test))
##获取预测准确率
print(model.score(x_test,y_test))

# 构造一些参数的值进行搜索
param = {"n_neighbors": [3, 5, 10]}
# 进行网格搜索
from sklearn.model_selection import  GridSearchCV
gc = GridSearchCV(knn, param_grid=param, cv=10)
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_)
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
###读取数据
data=pd.read_csv(r'C:\Users\ms\Desktop\ddup\机器学习算法基础\dataset\FACEBOOK\facebook-v-predicting-check-ins\train1.csv')
###缩小数据范围
data=data.query('x > 1.0 &  x < 1.25 & y > 2.5 & y < 2.75')
#data.to_csv(r'C:\Users\ms\Desktop\ddup\机器学习算法基础\dataset\FACEBOOK\facebook-v-predicting-check-ins\train1.csv')
print(data.head())

在这里插入图片描述

###时间戳转时间类型
time=pd.to_datetime(data['time'],unit='s')
###时间类型区分出年月日
time=pd.DatetimeIndex(time)
data['hour']=time.hour
data['day']=time.day
data['weekday']=time.weekday
###删除时间字段
data.drop(['time'], axis=1)

在这里插入图片描述

###groupby place_id 计数
place_count=data.groupby('place_id').count()
print(place_count.head())
###计数大于3的place_id
tf=place_count[place_count.row_id>3].reset_index()
print(tf.head())
###筛选place_id
data[data['place_id'].isin(tf['place_id'])]

在这里插入图片描述

##获取目标值和特征值
y=data['place_id']
x=data.drop('place_id',axis=1)
###划分训练集测试集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
##特征工程
#对数据进行标准化
from sklearn.preprocessing import StandardScaler
std=StandardScaler()
###拟合训练集并进行转化
x_train=std.fit_transform(x_train)
###测试集不需要拟合直接转化
x_test=std.transform(x_test)
##拟合模型
knn=KNeighborsClassifier(n_neighbors=5,algorithm='auto')
##algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}
model=knn.fit(x_train,y_train)
##获取预测结果
print(model.predict(x_test))
##获取预测准确率
print(model.score(x_test,y_test))

在这里插入图片描述

# 构造一些参数的值进行搜索
param = {"n_neighbors": [3, 5, 10]}
# 进行网格搜索
from sklearn.model_selection import  GridSearchCV
gc = GridSearchCV(knn, param_grid=param, cv=10)
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_)

结果为:
在测试集上准确率: 0.4014184397163121
在交叉验证当中最好的结果: 0.3853252179545303
选择最好的模型是: KNeighborsClassifier(n_neighbors=10)
每个超参数每次交叉验证的结果: {‘mean_fit_time’: array([0.02945479, 0.03193633, 0.02714372]), ‘std_fit_time’: array([0.00528858, 0.00433155, 0.00152604]), ‘mean_score_time’: array([0.24549898, 0.2961901 , 0.35218445]), ‘std_score_time’: array([0.01400948, 0.03184861, 0.03175179]), ‘param_n_neighbors’: masked_array(data=[3, 5, 10],
mask=[False, False, False],
fill_value=‘?’,
dtype=object), ‘params’: [{‘n_neighbors’: 3}, {‘n_neighbors’: 5}, {‘n_neighbors’: 10}], ‘split0_test_score’: array([0.34160757, 0.36241135, 0.37895981]), ‘split1_test_score’: array([0.34239773, 0.36911799, 0.3861433 ]), ‘split2_test_score’: array([0.35256562, 0.36746276, 0.39087255]), ‘mean_test_score’: array([0.34552364, 0.3663307 , 0.38532522]), ‘std_test_score’: array([0.00498987, 0.00285259, 0.00489764]), ‘rank_test_score’: array([3, 2, 1])}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值