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())

31、机器学习k近邻_第1张图片

###时间戳转时间类型
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())

31、机器学习k近邻_第2张图片

###计数大于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'])]

31、机器学习k近邻_第3张图片

##获取目标值和特征值
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_)

你可能感兴趣的:(机器学习)