文章目录
在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 删除了值比较相似的列 保留了关联列中的任意一列
#列要多 数据量多多益善