
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
train_set=pd.read_csv('data.txt',sep='t')
train=pd.concat([train_set['mass'],train_set['width'],
train_set['height'],train_set['color_score']],axis=1)
train=np.array(train)
scaler=StandardScaler()
train=scaler.fit_transform(train)
label=np.array(train_set['fruit_label'])
x_train,x_test,y_train,y_test=train_test_split(train,label,test_size=0.2,random_state=1)
knn=KNeighborsClassifier(n_neighbors=5,weights='distance')
knn.fit(x_train,y_train)
y_pred=knn.predict(x_test)
print("model accuracy",metrics.accuracy_score(y_test,y_pred))
代码中的水果分类数据集,fruit_data_with_colors.txt我已经上传至博客
或者直接在kaggle中下载fruit_data_with_colors.txt
train_set=pd.read_csv('data.txt',sep='t')
read_csv不只能读入csv,而且还能读入txt,参数sep,
这里设置的是sep=’t’,代表的是用tab键分割,原因是使用txt文件是以tab键分隔的。
sep指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是‘s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’rt’
**这里补充说明一下‘s+’,大佬们可以选择跳过:
详解 “s+”
正则表达式中s匹配任何空白字符,包括空格、制表符、换页符等等, 等价于[ fnrtv]
f -> 匹配一个换页
n -> 匹配一个换行符
r -> 匹配一个回车符
t -> 匹配一个制表符
v -> 匹配一个垂直制表符
而“s+”则表示匹配任意多个上面的字符。
不同种类的水果已经编号了,所以这里可以直接作为样本的类别。
水果名称与子类名称可以不用考虑进特征中,因为他们是文本。
下一步质量、宽度、高度、颜色这些特征数据提取出来,经过标准化作为训练数据。
(1)提取特征数据
train=pd.concat([train_set['mass'],train_set['width'],
train_set['height'],train_set['color_score']],axis=1)
pd.concat合并多个数组,因为axis=1,所以我们改变的axis=1的变化,axis=0他的行数不变,后期我会专门出一篇文章关于sum,rehape方法中axis的变化。
(2)转换成numpy形式
train=np.array(train)
以便数据标准化
(3)
数据标准化
scaler=StandardScaler() train=scaler.fit_transform(train)
sklearn中有两种标准化方式:两者都在sklearn.preprocessing模块下
1:scale
2:StandardScaler(我们这里用StandardScaler,两者的区别我会专门出一篇博客讲)
(4)
将类别标签存入数组label
label=np.array(train_set['fruit_label'])模型训练
(1)分割数据集
x_train,x_test,y_train,y_test=train_test_split(train,label,test_size=0.2,random_state=1)
参数random_state为了固定我们随机分割数据集产生的结果。random_state=1,无论我们分割几次,我们都只有一种结果,并且根据random_state=1这个标识我们可以返回。
test_szie=0.2可以用train_size=0.8替换。表示的是训练数据与测试数据8,2分。
(2)创建模型,放入训练数据
knn=KNeighborsClassifier(n_neighbors=5,weights='distance') knn.fit(x_train,y_train)
n_neighbors=5,表示选择的是周围五个节点
wights(权重)这个参数还可以选择
1uniform统一权重
2distance距离倒数
3callable此方法接收一个距离的数组,返回一个相同形状并且包含权重的数组。
(3)放入测试数据
y_pred=knn.predict(x_test)
(4)比较精确度
print("model accuracy",metrics.accuracy_score(y_test,y_pred))