1.交叉验证:让评估 模型更加准确可信
2.网格参数
通常情况下,很多参数需要手动指定,这种叫超参数。每组超参数都采用交叉验证来评估,最终选择最优参数组合来建立模型。
如果有多组超参数,则需要进行两两相互验证
用交叉验证、网格搜索,找到KNN的最优模型参数
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
import pandas as pd
def knncls():
"""
K近邻算法预测入住
:return:None
"""
#获取数据
data = pd.read_csv("./train.csv")
# print(data.head(10))
#缩小数据量,查询数据筛选
data = data.query("x>1.0 & x<1.25 & y>2.5 & y>2.75") #刚好组成正方形
time_value = pd.to_datetime(data['time'], unit='s')
#把日期格式转换成字典格式
time_value = pd.DatetimeIndex(time_value)
#构造一些特征,提取天加入到data_sample的列里面
data['day'] = time_value.day
data['hour'] = time_value.hour
data['weekday'] = time_value.weekday
#删除时间戳保留 天 时 周
data = data.drop(['time'], axis=1)
print(data)
#将签到数量少于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)]
#取出数据中的特征值和目标值
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)
#特征工程(标准化) ,训练集和测试集的特征值都要做标准化
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.fit_transform(x_test)
knn = KNeighborsClassifier()
# #输入训练集构建模型
# knn.fit(x_train, y_train)
#
# #得出预测结果
# y_predict = knn.predict(x_test)
# print('预测的未知ID为', y_predict)
# #得到准确率
# print("获得预测的准确率", knn.score(x_test, y_test))
#指定一些参数
param = {"n_neighbors": [3, 5, 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_ )
return None
if __name__ =="__main__":
knncls()