美文网首页
02 使用 scikit-learn 的 kNN 分类算法实现鸢

02 使用 scikit-learn 的 kNN 分类算法实现鸢

作者: 夏威夷的芒果 | 来源:发表于2018-08-19 22:02 被阅读86次

代码

# 数据源下载地址: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
  • 问题拆解提示:

  1. 如何处理样本的字符串标签?
  2. 如何建立kNN模型?
  3. 如何训练模型?
  4. 如何验证模型?
  • 问题解决提示:
  1. 利用Pandas模块中的map()方法进行字符串到数字的映射转换;
  2. 利用scikit-learn模块中的KNeighborsClassifier()建立kNN模型;
  3. 利用scikit-learn模块中的fit()方法训练模型;
  4. 利用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()

相关文章

网友评论

      本文标题:02 使用 scikit-learn 的 kNN 分类算法实现鸢

      本文链接:https://www.haomeiwen.com/subject/caftiftx.html