import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier # K-紧邻算法
from sklearn.metrics import classification_report #评估报告
from sklearn.model_selection import train_test_split,GridSearchCV #导入数据集拆分和交叉验证工具
from sklearn.preprocessing import StandardScaler,MinMaxScaler # 归一化,标准化
1、K值取多大?
k值取很小:容易受异常点影响
K值取很大:容易受K值数量(类别)波动
2、性能问题
优缺点:
优点:
简单,易于理解、易于实现,无需估计参数,无需训练
缺点:
懒惰算法,对测试样本分类时计算量很大,内存开销大
必须制定K值,K值选择不当会导致分类精度不能保证
使用场景:
小数据场景,几千~几万样本
from sklearn import datasets
#使用K-紧邻对鸢尾花进行分类预测
iris = datasets.load_iris()
iris.keys() # 获取键名 ‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’
iris.target_names #获取特征名
#数据集拆分
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size = 0.25)
def knncls():
“””
k-紧邻算法
“””
kn = KNeighborsClassifier() #使用交叉验证时不用传参数,因为本身就是不知道什么参数好才使用的交叉验证
# kn.fit(x_train,y_train)
# y_predict = kn.predict(x_test)
# print(“预测结果”,y_predict)
# print(“实际值为”,y_test)
# print(“准确率”,kn.score(x_test,y_test))
# #打印评估报告
# print(classification_report(y_test,y_predict))
#再使用交叉验证的时候,就不在需要上面的预测结果之类的操作了
#构建一个参数的值进行搜索
param = {“n_neighbors”:[3,5,7,10]}
#进行网格搜索
gc = GridSearchCV(kn,param_grid=param,cv=4) #参数1模型,参数2 构造的参数集用于网格搜索,参数3几折交叉验证
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()
#使用交叉验证
def knn():
“””
knn 算法对鸢尾花进行分类
“””
#实例化一个工具
kn =KNeighborsClassifier() #不传参数
#使用交叉验证
#设置参数集
param ={“n_neighbors”:[3,5,7,10,15]}
gc = GridSearchCV(kn,param_grid=param,cv=2)
gc.fit(x_train,y_train)
#准确率
print(“准确率”,gc.score(x_test,y_test))
#最好的参数模型
print(“最好的参数模型”,gc.best_estimator_)
#最好的分数
print(“最好的分数”,gc.best_score_)
#交叉验证在验证集上最好的结果
print(“交叉验证在验证集上最好的结果”,gc.cv_results_)
return None
if __name__ ==”__main__”:
knn()