sklearn_K紧邻

  • Post author:
  • Post category:其他


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



版权声明:本文为qq_41124528原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。