前言
近朱者赤近墨者黑,物以类聚人以群分。KNN算法就是计算和别人和自己的举例,然后离自己最近的这些人(大部分)是什么样的人,那么自己就是什么样的人
引例
import pandas as pd
import numpy as np
#首先有6部电影 统计了打斗镜头和约会镜头 然后分好类了 0和1两类
data=np.array([ [98,2],[3,104],[1,81],[99,5],[101,10],[2,100]])
data_df=pd.DataFrame(data=data,columns=['打斗镜头','约会镜头'])
data_df['lable']=[0,0,0,1,1,1]
print(data_df)
x_test=np.array([[18,90]])#如果来了一个新的影片,打斗镜头是18 约会镜头是90
#计算这个新的影片 跟另外6部电影的举例
distance=[]
for i in range(len(data)):
dis=(x_test[0][0] - data[i][0]) **2 + (x_test[0][1] - data[i][1]) **2
# print(dis)
distance.append( np.sqrt( dis ) )
from sklearn.neighbors import KNeighborsClassifier
for i in range(1,6,2):
knn_cf=KNeighborsClassifier(n_neighbors=i)
knn_cf.fit(data_df.iloc[:,:2],data_df['lable'])
print("邻居是{}个的时候预测出来的类别是:{}".format(i,knn_cf.predict(x_test)))
以上是一个引例,是我自己想验算一下sklearn调包计算的结果是不是我想象中的那样。按照举例,然后根据邻居的个数来分类,是预料中的结果。
KNN算法实现鸢尾花分类
思路如下:#1获取数据 2划分数据集 3特征工程:标准化数据 4KNN算法预估器 5#模型评估
1获取数据
#1获取数据
from sklearn.datasets import load_iris
iris=load_iris()
iris#这样的数据看的不是很直观 用一个含有特征和标签的dataframe来表达 更直观一些
import pandas as pd
#新建一个dataframe,把iris中data方进来,并且dataframe的列的名字是iris的特征名字
iris_df=pd.DataFrame(data=iris.data,columns=iris.feature_names)
iris_df['class']=iris.target#然后再把鸢尾花的分类target放进来
iris_df#这样就有了一个表格,含有特征的标签的一个表格
2划分数据集
#2划分数据集
from sklearn.model_selection import train_test_split
#iris_df的前4行iris_df.iloc[:,:4]是特征x,最后一列iris_df["class"]是标签y,70%是训练集,30%是测试集
x_train,x_test,y_train,y_test=train_test_split(iris_df.iloc[:,:4],iris_df["class"],random_state=5,test_size=0.3)
print(x_train.shape)#一共150行数据,划分后训练集150*0.7=105
x_train#划分之后的4个特征列
print(y_train.shape)#一共150行数据,划分后训练集150*0.7=105
y_train#划分之后的标签列
print(x_test.shape)#一共150行数据,划分后测试集150*0.3=45
x_test#测试集的4个特征列
print(y_test.shape)##一共150行数据,划分后训练集150*0.3=45
y_test#训练集的标签列
3特征工程:标准化数据
from sklearn.preprocessing import StandardScaler
std=StandardScaler()
#训练集数据fit_transform
x_train=std.fit_transform(x_train)
print(x_train)
#测试集数据只用transform就行了
x_test=std.transform(x_test)
print(x_test)
(屏幕有限,也没有截全)
4模型训练
#4导入KNN算法模型,并fit训练集的数据
from sklearn.neighbors import KNeighborsClassifier
model_knn=KNeighborsClassifier(n_neighbors=5)
model_knn.fit(x_train,y_train)#把训练集的特征值和标签传进来
5模型评估
#5模型评估
#两种方法:1)直接用模型model的score方法评估分数 2)对比model的预测值跟真实值
#1)直接用模型model的score方法评估分数
model_knn.score(x_test,y_test)#测试集的特征x_test和标签y_test穿进来
0.9555555555555556
#2)对比model的预测值跟真实值
#可以先看看预测出来的值
y_predict=model_knn.predict(x_test)
print("预测出来的标签y的值:{}".format(y_predict))
print("实际的标签y的值:{}".format(y_test.values))#这里直接填y_test也可以,只不过它是Series格式,打印出来了前面有index序号
print("把预测值与实际值对比:{}".format(y_test.values==y_predict))
#把测试集中预测对的true的个数 除以 测试集的长度 可以得到一个分数 这个分数就是score()那个分数 结果是一样的
sum( (y_test.values==y_predict) ==True) / len((y_test.values==y_predict))
预测出来的标签y的值:[1 2 2 0 2 1 0 2 0 1 1 1 2 2 0 0 2 2 0 0 1 2 0 1 1 2 1 1 1 2 0 1 1 0 1 0 0
2 0 2 2 1 0 0 1]
实际的标签y的值:[1 2 2 0 2 1 0 1 0 1 1 2 2 2 0 0 2 2 0 0 1 2 0 1 1 2 1 1 1 2 0 1 1 0 1 0 0
2 0 2 2 1 0 0 1]
把预测值与实际值对比:[ True True True True True True True False True True True False
True True True True True True True True True True True True
True True True True True True True True True True True True
True True True True True True True True True]
0.9555555555555556
总结
如果您发现我写的有错误,欢迎在评论区批评指正。