knn(K-近邻算法)

目录

1.步骤

2.举例

3.例子

4.优缺点

5.交叉验证和网格搜索来确定k

6.归一化

7.标准化

1.步骤

1)计算已知类别数据集中的点与当前点之间的距离 2)按距离递增次序排序 3)选取与当前点距离最⼩的k个点 4)统计前k个点所在的类别出现的频率 5)返回前k个点出现频率最⾼的类别作为当前点的预测分类

2.举例

from sklearn.neighbors import KNeighborsClassifier

x=[[39,0,31],[3,2,65],[2,3,55],[9,38,2],[8,34,17],[5,2,57],[21,17,5],[45,2,9]]
#"喜剧片":0  "动作片":1  "爱情片":2
y=[0,1,2,2,2,1,0,0]
knn=KNeighborsClassifier(n_neighbors=5)
knn.fit(x,y)
prediction=knn.predict([[23,3,17]])
print(prediction)

3.例子

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 1.获取数据集
iris = load_iris()
# 2.数据基本处理
# x_train,x_test,y_train,y_test为训练集特征值、测试集特征值、训练集⽬标值、测试集⽬标值
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
# 3、特征⼯程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 4、机器学习(模型训练)
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train, y_train)
# 5、模型评估
# ⽅法1:⽐对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n", y_predict)
print("⽐对真实值和预测值:\n", y_predict == y_test)
# ⽅法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

4.优缺点

4.1优点

简单有效;重新训练的代价低;适合类域交叉样本:KNN⽅法主要靠周围有限的邻近的样本,⽽不是靠判别类域的⽅法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN⽅法较其他⽅法更为适合;适合⼤样本⾃动分类:该算法⽐较适⽤于样本容量⽐较⼤的类域的⾃动分类,⽽那些样本容量较⼩的类域采⽤这种算法⽐较容易 产⽣误分。

4.2缺点

惰性学习;类别评分不是规格化:不像⼀些通过概率评分的分类;输出可解释性不强;对不均衡的样本不擅⻓;计算量较⼤

5.交叉验证和网格搜索来确定k

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 1、获取数据集
iris = load_iris()
# 2、数据基本处理 -- 划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3、特征⼯程:标准化
# 实例化⼀个转换器类
transfer = StandardScaler()
# 调⽤fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4、KNN预估器流程
# 4.1 实例化预估器类
estimator = KNeighborsClassifier()
# 4.2 模型选择与调优——⽹格搜索和交叉验证
# 准备要调的超参数
param_dict = {"n_neighbors": [1,3,5,7]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=5)
# 4.3 fit数据进⾏训练
estimator.fit(x_train, y_train)
# 5、评估模型效果
# ⽅法a:⽐对预测结果和真实值
y_predict = estimator.predict(x_test)
print("⽐对预测结果和真实值:\n", y_predict == y_test)
# ⽅法b:直接计算准确率
score = estimator.score(x_test, y_test)
print("直接计算准确率:\n", score)

print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的准确率结果:\n", estimator.cv_results_)

6.归一化

 作⽤于每⼀列,max为⼀列的最⼤值,min为⼀列的最⼩值,那么X’’为最终结果,mx,mi分别为指定区间值默认 mx为1,mi为0

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

data = pd.read_csv("D:/迅雷下载/demo/machineLearnCode/knnTest/data.txt")
print(data)
# 1、实例化⼀个转换器类
transfer = MinMaxScaler(feature_range=(0, 1))
# 2、调⽤fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("最⼩值最⼤值归⼀化处理的结果:\n", data)

7.标准化

归一化中最⼤值最⼩值是变化的,另外,最⼤值与最⼩值⾮常容易受异常点影响,所以这种⽅法鲁棒性较差,只适合传统精 确⼩数据场景。

作⽤于每⼀列,mean为平均值,σ为标准差

对于标准化来说:如果出现异常点,由于具有⼀定数据量,少量的异常点对于平均值的影响并不⼤,从⽽⽅差改变 较⼩。

import pandas as pd
from sklearn.preprocessing import StandardScaler

data = pd.read_csv("machineLearnCode/knnTest/data.txt")
print(data)
# 1、实例化⼀个转换器类
transfer = StandardScaler()
# 2、调⽤fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("标准化的结果:\n", data)
print("每⼀列特征的平均值:\n", transfer.mean_)
print("每⼀列特征的⽅差:\n", transfer.var_)

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页
评论

打赏作者

herry57

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值