在scikit-learn库中使用k-近邻算法

  • 分类问题:from sklearn.neighbors import KNeighborsClassifier

  • 回归问题:from sklearn.neighbors import KNeighborsRegressor

鸢尾花识别

1.导入需要用到的包

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

2.获取数据

这里面也可以下载数据,区别于seaborn

load_iris()


读取出来的类型:哈希型的数据

type(load_iris())

支持对象和属性的取值方式


上面是数据,下面是目标值

列名的单位cm里面最后一行也可以看到

print(load_iris().DESCR)#digits.DESCR给出了digits数据集的概述

3.数据集的说明

数据

iris = load_iris()
iris



data是特征,target是目标
特征和目标的获取和命名

#特征
fea = iris.data
#目标
lab = iris.target#【重要】
#目标的名称
tar_nm = iris.target_names
#特征列名称
fea_nm = iris.feature_names

fea:

lab

fea_nm

tar_nm

4.制作dataframe

pd.DataFrame(data = fea, columns = fea_nm)

 pd.DataFrame(tar_nm[lab],columns=['labels'])


拼接

#制作dataframe
fea_df = pd.DataFrame(data=fea,columns=fea_nm)
lab_df = pd.DataFrame(tar_nm[lab],columns=['labels'])#【重要】
df =pd.concat([fea_df,lab_df],axis=1,join='inner')

5. 描述性统计

df.describe()

箱线图展示

#值越相似,分类越难做
sns.boxplot(data=df)

散布图矩阵

#散布图矩阵
sns.pairplot(df,hue='labels')

  • 数据检测:检测的数据有关联,未必要删除
  • 如果列特别少,别删了
  • 同范围或者方差为0的列
  • 由于数据都是随机切分的,测试数据和训练数据都要多一些

6.训练和打分

#数据分割 随机抽取数据,那么测试数据中又几个异常值

#sklearn 官方制定的比例是 7 (训练):3(测试)
X_train,X_test,y_train,y_test = train_test_split(fea_df.drop(labels=['sepal width (cm)','petal width (cm)'],axis=1),lab,test_size=10)

kd_tree = KNeighborsClassifier(n_neighbors=5,algorithm='kd_tree').fit(X_train,y_train)  #训练数据太少的话,有可能训练程度不够


kd_tree.score(X_train,y_train),kd_tree.score(X_test,y_test)
#0.97 - 0.9 删除了值比较相似的列 保留了关联列中的任意一列
#列要多 数据量多多益善