代码
# 数据源下载地址:https://video.mugglecode.com/data_ai.zip,下载压缩包后解压即可
# -*- coding: utf-8 -*-
"""
任务:鸢尾花识别
"""
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier #这个函数可以自动训练哦
DATA_FILE = './data_ai/Iris.csv'
SPECIES_LABEL_DICT = {
'Iris-setosa': 0, # 山鸢尾
'Iris-versicolor': 1, # 变色鸢尾
'Iris-virginica': 2 # 维吉尼亚鸢尾
}
# 使用的特征列
FEAT_COLS = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
def main():
"""
主函数
"""
# 读取数据集
iris_data = pd.read_csv(DATA_FILE, index_col='Id')
iris_data['Label'] = iris_data['Species'].map(SPECIES_LABEL_DICT) #用这个把花名映射成数字,才方便拟合
# 获取数据集特征
X = iris_data[FEAT_COLS].values #这个X是array类型的, .values会转成arrary
# 获取数据标签
y = iris_data['Label'].values # .values会转成arrary
# 划分数据集:X训,X测,y训,y测 = train_test_split(X, y),return的类型是按照输入的类型来的
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=10)
# 声明模型
knn_model = KNeighborsClassifier()
# 训练模型
knn_model.fit(X_train, y_train)
# 评价模型
accuracy = knn_model.score(X_test, y_test)
print('预测准确率:{:.2f}%'.format(accuracy * 100))
# 取单个测试样本
idx = 25
test_sample_feat = [X_test[idx, :]] #因为X是array 类型的所以才能切片
y_true = y_test[idx]
y_pred = knn_model.predict(test_sample_feat) #这里面装的是单元素列表[],里面套的是array()
print('真实标签{},预测标签{}'.format(y_true, y_pred))
if __name__ == '__main__':
main()
运行结果
预测准确率:96.00%
真实标签0,预测标签[0]
需要注意的地方
- 读取的数据集如果y标签是数字,需要做映射:
SPECIES_LABEL_DICT = {
'Iris-setosa': 0, # 山鸢尾
'Iris-versicolor': 1, # 变色鸢尾
'Iris-virginica': 2 # 维吉尼亚鸢尾
}
iris_data['Label'] = iris_data['Species'].map(SPECIES_LABEL_DICT)
#用这个把花名映射成数字,才方便拟合
- 划分数据集:X训,X测,y训,y测 = train_test_split(X, y),return的类型是按照输入的类型来的
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=10)
- 声明训练与评价:
from sklearn.neighbors import KNeighborsClassifier #这个函数可以自动训练哦
# 声明模型
knn_model = KNeighborsClassifier()
# 训练模型
knn_model.fit(X_train, y_train)
# 评价模型
accuracy = knn_model.score(X_test, y_test)
print('预测准确率:{:.2f}%'.format(accuracy * 100))
- 取单个测试样本
# 取单个测试样本
idx = 25
test_sample_feat = [X_test[idx, :]] #因为X是array 类型的所以才能切片
y_true = y_test[idx]
y_pred = knn_model.predict(test_sample_feat)#这里面装的是单元素列表[],里面套的是array()
print('真实标签{},预测标签{}'.format(y_true, y_pred))
练习:使用 scikit-learn 的 kNN 分类算法实现水果识别器
-
题目描述:使用k近邻距离算法创建一个水果识别器,根据水果的属性,判断该水果的种类。
-
题目要求:
-
使用scikit-learn的kNN算法进行识别
- 数据文件:
-
数据源下载地址:https://video.mugglecode.com/fruit_data.csv(数据源与上节课相同)
-
fruit_data.csv,包含了59个水果的的数据样本。
-
共5列数据
fruit_name:水果类别
mass: 水果质量
width: 水果的宽度
height: 水果的高度
color_score: 水果的颜色数值,范围0-1。
0.85 - 1.00:红色
0.75 - 0.85: 橙色
0.65 - 0.75: 黄色
0.45 - 0.65: 绿色
image -
问题拆解提示:
- 如何处理样本的字符串标签?
- 如何建立kNN模型?
- 如何训练模型?
- 如何验证模型?
- 问题解决提示:
- 利用Pandas模块中的map()方法进行字符串到数字的映射转换;
- 利用scikit-learn模块中的KNeighborsClassifier()建立kNN模型;
- 利用scikit-learn模块中的fit()方法训练模型;
- 利用scikit-learn模块中的score()方法验证模型。
参考代码
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
#特征文字
feat_cols =['mass','width','height','color_score']
#读取数据
data = pd.read_csv('/Users/miraco/PycharmProjects/ai/data_ai/fruit_data.csv')
#预处理
fruit2num = {'apple' : 0 ,
'mandarin' : 1 ,
'orange' : 2 ,
'lemon' : 3
}
data['label'] = data['fruit_name'].map(fruit2num)
#取出X和y
X = data[feat_cols].values
y = data['label'].values
#划分数据
X_train_set, X_test_set ,y_train_set, y_test_set = train_test_split(X,y, random_state = 20, test_size= 1/5)
print('原始数据集共{}个样本,其中训练集样本数为{},测试集样本数为{}'.format(
X.shape[0], X_train_set.shape[0], X_test_set.shape[0]))
#训练
knn_model = KNeighborsClassifier()
knn_model.fit(X_train_set, y_train_set)
#准确率检测
accur = knn_model.score(X_test_set,y_test_set)
print(f'正确率为{accur*100}%')
#试试看
num2fruit = dict(zip(fruit2num.values(),fruit2num.keys()))
for idx in range(X_test_set.shape[0]):
test_feat = [X_test_set[idx]]
y_pridict = num2fruit.get(int(knn_model.predict(test_feat)))
y_real = num2fruit.get(y_test_set[idx])
YorN = '对' if y_pridict == y_real else '错'
print(f'第{idx+1}个测试水果的结果是{y_pridict},本来应该是{y_real},所以测{YorN}了')
运行结果
原始数据集共59个样本,其中训练集样本数为47,测试集样本数为12
正确率为83.33333333333334%
第1个测试水果的结果是mandarin,本来应该是mandarin,所以测对了
第2个测试水果的结果是apple,本来应该是apple,所以测对了
第3个测试水果的结果是apple,本来应该是apple,所以测对了
第4个测试水果的结果是lemon,本来应该是lemon,所以测对了
第5个测试水果的结果是apple,本来应该是orange,所以测错了
第6个测试水果的结果是apple,本来应该是apple,所以测对了
第7个测试水果的结果是lemon,本来应该是lemon,所以测对了
第8个测试水果的结果是mandarin,本来应该是mandarin,所以测对了
第9个测试水果的结果是orange,本来应该是orange,所以测对了
第10个测试水果的结果是orange,本来应该是orange,所以测对了
第11个测试水果的结果是orange,本来应该是lemon,所以测错了
第12个测试水果的结果是apple,本来应该是apple,所以测对了
注意
在这里字典的映射的选择不同,会造成结果的差异。示例中给出了另一代码, 它的‘水果-数字’映射和我不一样, 拟合的结果也就不一样了。
# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
CATEGRORY_LABEL_DICT = {
'apple': 0,
'lemon': 1,
'mandarin': 2,
'orange': 3
}
# 使用的特征列
FEAT_COLS = ['mass', 'width', 'height', 'color_score']
def main():
"""
主函数
"""
fruit_data = pd.read_csv('/Users/miraco/PycharmProjects/ai/data_ai/fruit_data.csv')
# 1. 处理样本的字符串标签,添加label一列作为预测标签
fruit_data['label'] = fruit_data['fruit_name'].map(CATEGRORY_LABEL_DICT)
# 4列水果的属性作为样本特征
X = fruit_data[FEAT_COLS].values
# label列为样本标签
y = fruit_data['label'].values
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/5, random_state=20)
print('原始数据集共{}个样本,其中训练集样本数为{},测试集样本数为{}'.format(
X.shape[0], X_train.shape[0], X_test.shape[0]))
# 2. 建立kNN模型
knn_model = KNeighborsClassifier()
# 3. 训练模型
knn_model.fit(X_train, y_train)
# 4. 验证模型
accuracy = knn_model.score(X_test, y_test)
print('预测准确率为:{:.2f}%'.format(accuracy * 100))
if __name__ == '__main__':
main()
网友评论